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
Vielen Dank, J.Pelttari. Dein Code funktioniert wie ein Zauber! Und Sie haben den Mechanismus gut erklärt. Du bist so cool! Danke nochmal! –
Warum nicht 'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)' in 'OnExit', so dass Sie die Erholung überhaupt vermeiden? –
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. –