2016-06-01 6 views
0

Я разместил элемент управления 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 

ответ

1

Вы можете очистить ES_PASSWORD стиль с EM_SETPASSWORDCHAR сообщением. Это позволяет редактировать в нормальном состоянии. Но затем в OnExit вам нужно дважды установить пароль для повторного создания своего окна. Или вы можете использовать некоторый элемент управления взломом, чтобы получить доступ к процедуре RecreateWnd (чтобы он не создавал это окно дважды).

procedure TTestForm.Edit1Enter(Sender: TObject); 
begin 
    SendMessage(Edit1.Handle, EM_SETPASSWORDCHAR, 0, 0); 
end; 

procedure TTestForm.Edit1Exit(Sender: TObject); 
begin 
    Edit1.PasswordChar := #0; 
    Edit1.PasswordChar := '*'; 
end; 
+0

Благодарим вас, J.Pelttari. Ваш код работает как шарм! И вы хорошо объяснили механизм. Ты очень крутой! Еще раз спасибо! –

+1

Почему не 'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)' in' OnExit', так что вы вообще избегаете отдыха? –

+0

Если вы установите пароль char с помощью функции SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0) ', Edit затем использует этот символ (*) в маске пароля. Стиль AFAIK ES_PASSWORD - это все, что вам нужно для отображения черных кругов в качестве маски пароля в редакторе редактирования Comctl32.dll ver 6. –

 Смежные вопросы

  • Нет связанных вопросов^_^