Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Delphi 2010 - TEdit PasswordChar = #0 Bug lässt Cursor verschwinden

  Alt 17. Aug 2017, 11:47
Danke für die Beiträge und die Lösung von jaenicke, das sieht durchaus sehr professionell aus, auch die Info mit dem zerstörten Handle hat mir weitergeholfen.

Unter Delphi 2010 stellt sich das nun wie folgt da: beim zweiten Betreten erscheint das Feld nun komplett "leer", das Programm friert kurz ein, und danach flimmert sich der Cursor am Anfang des leeren Edit-Feldes einen ab... Funktioniert bei mir also leider nicht.

Ich habe mir erlaubt, in Anbetracht dessen, dass es wohl ein grundlegenderes Problem von Delphi oder Windows ist/sei könnte, eine Quick-and-Dirty-Lösung zu basteln, da für eine so unbedeutende Funktion mit so großen Problemen eine schnelle unkomplizierte Lösung für mich sinnvoller ist, als die Ursache zu beheben (die evtl. in Windows oder Delphi liegt, und sich eh meinem Zugriff entzieht)...

Delphi-Quellcode:
procedure TForm2.edtPasswordEnter(Sender: TObject);
begin
  Timer1.Tag := 1;
  Timer1.Enabled := True;
end;

procedure TForm2.edtPasswordExit(Sender: TObject);
begin
  Timer1.Tag := 0;
  Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  // Der Timer hat ein Interval von 10 ms
  Timer1.Enabled := False;
  if Timer1.Tag = 0 then begin
    edtPassword.PasswordChar := '*';
  end else begin
    edtPassword.PasswordChar := #0;
  end;
end;
Beim Betreten oder Verlassen des Edit-Feldes löse aktiviere ich nun den Timer. Je nachdem ob der Text sichtbar (1) oder unsichtbar/verschlüsselt (0) sein soll, erhält der Timer einen anderen Tag. Der Timer ändert dann den Passwordchar, da nach ~10ms davon auszugehen ist, dass das Handle vom TEdit korrekt freigegeben und neu erzeugt wurde, so dass der jetzige Befehl problemlos klappen sollte.



Edit:
Die von Uwa Raabe verlinkte Lösung funktioniert scheinbar auch zuverlässig:
Delphi-Quellcode:
procedure TForm2.edtPasswordEnter(Sender: TObject);
begin
  SendMessage(edtPassword.Handle, EM_SETPASSWORDCHAR, 0, 0);
end;

procedure TForm2.edtPasswordExit(Sender: TObject);
begin
  SendMessage(edtPassword.Handle, EM_SETPASSWORDCHAR, Ord('*'), 0);
end;
Edit2: Lösung scheint zuverlässig zu funktionieren. Bitte beachten: Neuere Windows-Versionen verwenden -trotz "*" als PasswordChar- den gefüllten Kreis "●". Das sieht natürlich komisch aus, wenn man das Programm startet, das Passwort steht in ● da, man klickt rein, verlässt es wieder, und da stehen *... Ich habe jetzt mal im Objektinspektor den PasswordChar direkt auf "●" gesetzt, und bei OnEditExit nun Ord('●') stehen, damit auf jeden Fall durchgehend das selbe Zeichen drin steht.
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (17. Aug 2017 um 13:18 Uhr)
  Mit Zitat antworten Zitat