2016-06-01 1 views
0

Ich legte ein TEdit Steuerelement auf ein Formular, für ein Passwort. Mein Ziel ist, dass das TEdit-Steuerelement Sternchen anzeigt, wenn es nicht fokussiert ist, um zu vermeiden, dass andere Leute es sehen, und das Passwort anzeigen, um die Bearbeitung zu erlauben, wenn es fokussiert ist.gesetzt TEdit.PasswordChar Eigenschaft in TEdit.onEnter Ereignis verursacht TEdit kann nicht Auswahl und Cursor in Delphi XE Seattle

Um dies zu erreichen, habe ich OnEnter und OnExit-Handler hinzugefügt, um PasswordChar-Eigenschaft zu # 0 und '*' entsprechend zu setzen.

Dies funktionierte gut in Delphi 7, aber scheiterte in Delphi XE seattle, das TEdit-Steuerelement ging in einen seltsamen Zustand, dass es nicht den blinkenden Bearbeitungscursor zeigte, noch die markierte blaue Hintergrundauswahl nach dem OnEnter-Ereignis ausgelöst (in dem der PasswordChar auf # 0 gesetzt ist).

Ich trat in den TEdit-Quellcode im Debug-Modus, und festgestellt, dass die TEdit-Steuerelement wird einige Handle neu erstellen (ich weiß nicht viel von Windows-API) beim Einstellen von PasswordChar. Ich denke, das hat das Problem verursacht, aber nicht sicher, und ich weiß nicht, wie ich es vermeiden kann.

Bitte helfen Sie mir, ich habe viel versucht und keinen Weg gefunden.

Hier ist das einfachste Testprogramm:

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 

Antwort

1

können Sie löschen ES_PASSWORD Stil mit EM_SETPASSWORDCHAR Nachricht. Dies hält die Bearbeitung in einem normalen Zustand. Dann müssen Sie in OnExit zweimal patchchar setzen, um das Fenster zu bearbeiten. Oder Sie können ein Hack-Steuerelement verwenden, um Zugriff auf die RecreateWnd-Prozedur zu erhalten (damit das Fenster nicht zweimal erstellt wird).

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

Vielen Dank, J.Pelttari. Dein Code funktioniert wie ein Zauber! Und Sie haben den Mechanismus gut erklärt. Du bist so cool! Danke nochmal! –

+1

Warum nicht 'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)' in 'OnExit', so dass Sie die Erholung überhaupt vermeiden? –

+0

Wenn Sie das Kennwort char mit 'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)' setzen, verwendet Edit das Zeichen char (*) in der Passwortmaske. AFAIK ES_PASSWORD Stil ist alles was Sie brauchen, um schwarze Kreise als Passwortmaske in Comctl32.dll ver 6 Bearbeitungssteuerelemente anzuzeigen. –

Verwandte Themen