このようなことができます。通常の Edit で ReadOnly=true を使用し、独自のパスワードを非表示にします。編集に含まれるコンテンツのみが *. この例は英数字で機能しますが、他の文字も簡単に追加できます。また、編集で選択を使用する場合は、それも処理する必要があります。
コード:
uses
StrUtils;
var
password: String;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
password:='';
end;
...
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var sel: Integer;
begin
sel:=Edit1.SelStart;
if((Key>=48) and (Key<=90))then
begin
if(ssShift in Shift)then
password:=LeftStr(password, sel)+Char(Key)+RightStr(password, Length(Edit1.Text)-sel)
else
password:=LeftStr(password, sel)+LowerCase(Char(Key))+RightStr(password, Length(Edit1.Text)-sel);
Edit1.Text:=Edit1.Text+'*';
Edit1.SelStart:=sel+1;
end
else if((Key>=VK_NUMPAD0) and (Key<=VK_NUMPAD9))then
begin
password:=LeftStr(password, sel)+Char(Key-48)+RightStr(password, Length(Edit1.Text)-sel);
Edit1.Text:=Edit1.Text+'*';
Edit1.SelStart:=sel+1;
end
else if((Key=VK_BACK) and (sel>0))then
begin
Delete(password, sel, 1);
Edit1.Text:=Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
Edit1.SelStart:=sel-1;
end
else if((Key=VK_DELETE) and (sel<Length(Edit1.Text)))then
begin
Delete(password, sel+1, 1);
Edit1.Text:=Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
Edit1.SelStart:=sel;
end
else if(Key=VK_RETURN)then
begin
//handle the password check here (make hash etc)
ShowMessage(password);
password:='';
Edit1.Text:='';
end;
//just for the testing, this should be removed of course
Form1.Caption:=password;
end;