Я разместил элемент управления TEdit на форме для пароля. Моя цель состоит в том, чтобы позволить контроллеру TEdit показывать звездочки, когда он не сфокусирован, чтобы другие люди не видели его, и покажите пароль, чтобы разрешить редактирование при фокусировке.set Свойство TEdit.PasswordChar в TEdit.onEnter вызывает события TEdit не может показать выбор и курсор в Delphi XE seattle
Для этого я добавил обработчик OnEnter и OnExit, чтобы установить свойство PasswordChar на # 0 и '*' соответственно.
Это хорошо сработало в Delphi 7, но пошло не так в Delphi XE сиэтле, элемент управления TEdit вошел в странное состояние, что он не показывал мигающий курсор редактирования или выделенный выделенный синий фон после запуска события OnEnter (в котором PasswordChar установлен на # 0).
Я вступил в исходный код управления TEdit в режиме отладки и обнаружил, что элемент управления TEdit воссоздает свой дескриптор (я не знаю многое из Windows API) при настройке PasswordChar. Я предполагаю, что это вызвало проблему, но не уверен, и не знаю, как ее избежать.
Пожалуйста, помогите мне в этом, я пробовал много и не нашел пути.
Вот самый простой тест программы:
type
TTestForm = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Edit1Enter(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
TestForm: TTestForm;
implementation
{$R *.dfm}
procedure TTestForm.Edit1Enter(Sender: TObject);
begin
Edit1.PasswordChar := #0;
end;
procedure TTestForm.Edit1Exit(Sender: TObject);
begin
Edit1.PasswordChar := '*';
end;
end.
DFM:
object TestForm: TTestForm
Left = 0
Top = 0
Caption = 'TestForm'
ClientHeight = 242
ClientWidth = 472
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Edit1: TEdit
Left = 72
Top = 48
Width = 225
Height = 21
PasswordChar = '*'
TabOrder = 0
Text = 'You can not see text selection'
OnEnter = Edit1Enter
OnExit = Edit1Exit
end
object Edit2: TEdit
Left = 72
Top = 75
Width = 225
Height = 21
TabOrder = 1
Text = 'Click this control to trigger TEdit1.OnExit'
end
end
Благодарим вас, J.Pelttari. Ваш код работает как шарм! И вы хорошо объяснили механизм. Ты очень крутой! Еще раз спасибо! –
Почему не 'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)' in' OnExit', так что вы вообще избегаете отдыха? –
Если вы установите пароль char с помощью функции SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0) ', Edit затем использует этот символ (*) в маске пароля. Стиль AFAIK ES_PASSWORD - это все, что вам нужно для отображения черных кругов в качестве маски пароля в редакторе редактирования Comctl32.dll ver 6. –