Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView mit PasswordChar (https://www.delphipraxis.net/113496-listview-mit-passwordchar.html)

der_kumpel 8. Mai 2008 17:10


ListView mit PasswordChar
 
Tag Leute.

Ich suche eine Möglichkeit, wie ich bequem (*) Logindaten in einer ListView speichern kann.
D.h. ich habe drei Spalten (Seite|Benutzer|Passwort) und möchte, dass die Passwort-Spalte mit irgendwelchen "Dots" ausgefüllt wird (=> TEdit.PasswordChar).

(*) Ich könnte natürlich auch die Dots manuell reinschreiben und die Passwörter in eine StringList o.ä. speichern und laden.
Wär aber etwas fummelich, darum wollt ich erstmal sichergehen, dass es da nichts Komfortableres gibt. :wink:

Danke und Gruß,
kumpel

marabu 8. Mai 2008 17:52

Re: ListView mit PasswordChar
 
Hi Kumpel,

welchen Sinn macht eine Spalte für das Kennwort in einer Listenansicht, wenn der Inhalt dort garnicht angezeigt werden soll? Eine Anzeige wie "vorhanden" bzw. "fehlt" finde ich da informativer. Und sobald du eine Detailansicht öffnest, hast du ja auch wieder ein normales Edit-Feld zur Verfügung, bei dem du die Eigenschaft PasswordChar nutzen kannst.

Grüße vom marabu

der_kumpel 8. Mai 2008 18:04

Re: ListView mit PasswordChar
 
Den einzigen Sinn sehe ich im einfachen Speichern/Abfragen der Passwörter.
Da ich nach den passenden Benutzerdaten per Schleife suche, wäre es eben nur eine Zeile mehr Code:

Delphi-Quellcode:
for i := 0 to lvPass.Items.Count - 1 do
begin
  if lvPass.Items[i].Caption = Seite then
  begin
    Benutzer:=lvPass.Items[i].SubItems[0];
    Passwort:=lvPass.Items[i].SubItems[1]; // <<---
  end;
end;
Zitat:

Eine Anzeige wie "vorhanden" bzw. "fehlt" finde ich da informativer.
Ein Passwort wird in meinem Fall immer vorhanden sein. ;)

Und die Daten können nicht geändert werden, also ReadOnly (falls das weiterhilft)!

marabu 8. Mai 2008 18:53

Re: ListView mit PasswordChar
 
Hi,

Zitat:

Zitat von der_kumpel
Den einzigen Sinn sehe ich im einfachen Speichern/Abfragen der Passwörter.

eigentlich sollst du die ListView nur zur Visualisierung der Daten benutzen, Speichern (extern, persistent) und Zwischenspeichern (intern) geht anders. Bei kleinen Datenmengen sehe ich oft, dass diese auch in der ListView gespeichert werden, aber meistens nur deshalb, weil die Programmierer den virtuellen Modus (OwnerData) der ListView noch nicht entdeckt haben.

Zitat:

Zitat von der_kumpel
Ein Passwort wird in meinem Fall immer vorhanden sein.

Es gibt auch noch andere Informationen, die interessanter als eine Kette von PasswordChars sind: LastChanged, Strength, Policy, ...

Freundliche Grüße

der_kumpel 8. Mai 2008 19:16

Re: ListView mit PasswordChar
 
Okay, da hab ich mich wohl falsch ausgedrückt. Die Daten speichere ich natürlich bei jeder Änderung der Liste (verschlüsselt bzw. verschleiert) extern ab und lade sie bei jedem Programmstart.


Zitat:

Es gibt auch noch andere Informationen, die interessanter als eine Kette von PasswordChars sind: LastChanged, Strength, Policy, ...
Sorry, da (ver)s(t)ehe ich gerade den Zusammenhang nicht... :?

Fussball-Robby 8. Mai 2008 19:19

Re: ListView mit PasswordChar
 
Trotzdem solltest du innerhalb deines Programmes die Speicherung & Darstellung der Daten voneinander trennen. Die Daten sollten "im Hintergrund" in deinem Programm verwaltet und von dort aus in die ListView geladen werden.

Larsi 8. Mai 2008 19:44

Re: ListView mit PasswordChar
 
Ich habe das mit dem Edit mal versucht bei meinem Password Saver, ich kann nur sagen es geht nicht, also wenn ein Edit PasswordChar hat ist es in der Listview trotzdem "normal".

HalloDu 8. Mai 2008 22:26

Re: ListView mit PasswordChar
 
Du könntest ja mal mit dem VST rumspielen, mit dem ist sowas sicher umsetzbar...

himitsu 8. Mai 2008 23:54

Re: ListView mit PasswordChar
 
3. Spalte mit "*"

Anzahl der "*" = Length(SubItemText)

Delphi-Quellcode:
// ListView1.OnCustomDrawSubItem
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  tmpRect : TRect;
  iWidth, i : Integer;
  tmpTextOut : String;
begin
  if SubItem <> 2 then exit;

  tmpRect := Item.DisplayRect(drBounds);

  if (cdsFocused in State) and (cdsSelected in State) then
  begin
    Sender.Canvas.Brush.Color := clBlue;
    Sender.Canvas.Font.Color := clWhite;
  end;

  iWidth := 0;
  for i := 0 to SubItem - 1 do
    Inc(iWidth, Sender.Column[i].Width);

  tmpTextOut := StringOfChar('*', Length(Item.SubItems[SubItem - 1]));

  Sender.Canvas.TextOut(tmpRect.Left + iWidth + 5, tmpRect.Top, tmpTextOut);

  DefaultDraw := False;
end;
dafür muß nichtmal der Text wo anders gespeichert werden, da nur die Anzeige manipuliert wird.

marabu 9. Mai 2008 08:30

Re: ListView mit PasswordChar
 
Hallo Frank,

Zitat:

Zitat von himitsu
... Anzahl der "*" = Length(SubItemText) ...

der Account mit dem kürzesten Kennwort eignet sich bestens für eine Attacke. Best Practice ist eine Anzeige mit maximaler Sternchenzahl oder doch zumindest sehr vielen ...

Ich bin aber noch immer der Auffassung, dass eine solche Spalte in einer Listenansicht wegen des fehlenden Informationsgehaltes reine Platzverschwendung ist.

Freundliche Grüße

himitsu 9. Mai 2008 10:35

Re: ListView mit PasswordChar
 
@marabu:
ist doch egal, ob man so sieht welche Account das kürzeste Passwort hat ... die Länge bekommt man auch anders raus.

Oder willst du mir erklären, daß die Passwörter sicher wären, wenn sie frei im RAM des Programms rumliegen?

Vorallem da hier erkennbar ist, daß er die Passwörter im Klartext speichert/verwalter und nicht als Hash.

Also wenn ie Passwörter eh unsicher sind, kann man doch etwas mehr Informationsgehalt in diese Zeile bringen ... und wenn es nur die Anzahl ist :angel:

Schwedenbitter 14. Sep 2013 12:53

AW: Re: ListView mit PasswordChar
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bitte gleich um Entschuldigung, dass ich dieses Thema wieder aufwärmen muss:

Zitat:

Zitat von himitsu (Beitrag 774359)
...
dafür muß nichtmal der Text wo anders gespeichert werden, da nur die Anzeige manipuliert wird.

Der Code funktioniert tatsächlich prima. Allerdings hat er - zumindest bei mir - "Nebenwirkungen". Die Zeichen aller Spalten nach der zu versternenden Spalte werden mit fehlerhafter Schriftart/Größe dargestellt. Ich habe dazu mal ein Bild angefügt.

Gibt es dafür auch noch eine Lösung?

Gruß, Alex

Aviator 14. Sep 2013 13:23

AW: ListView mit PasswordChar
 
Ohne es zu testen würde ich vermuten, dass es an der Zeile
Delphi-Quellcode:
DefaultDraw := false
liegt. Das muss dann bei den anderen Spalten wieder auf
Delphi-Quellcode:
true
gesetzt werden wenn ich mich nicht täusche.

Schwedenbitter 14. Sep 2013 15:13

AW: ListView mit PasswordChar
 
Zitat:

Zitat von Aviator (Beitrag 1228467)
Ohne es zu testen würde ich vermuten, dass es an der Zeile
Delphi-Quellcode:
DefaultDraw := false
liegt. Das muss dann bei den anderen Spalten wieder auf
Delphi-Quellcode:
true
gesetzt werden wenn ich mich nicht täusche.

Erstmal Danke für die Antwort. Wenn ich das richtig verstanden habe, hätte dann folgender Code das Problem beseitigen müssen:
Delphi-Quellcode:
Procedure ...
Var
   tmpRect : TRect;
   iWidth, i : Integer;
   tmpTextOut : String;
Begin
   If (SubItem = 2) Then
   Begin
      tmpRect:=Item.DisplayRect(drBounds);
      If (cdsFocused In State) And (cdsSelected In State) Then
      Begin
         Sender.Canvas.Brush.Color := clBlue;
         Sender.Canvas.Font.Color := clWhite;
      End;

      iWidth:=0;
      For I:=0 To Pred(SubItem) Do Inc(iWidth, Sender.Column[I].Width);
      tmpTextOut:=StringOfChar('*', Length(Item.SubItems[Pred(SubItem)]));
      Sender.Canvas.TextOut(tmpRect.Left + iWidth + 1, tmpRect.Top, tmpTextOut);
   End;
   DefaultDraw:=(SubItem <> 2); // CustomDraw in Abhängigkeit von der Spalte setzen...
   // Wie empfohlen also alle außer Spalte 2 auf True gesetzt.
End;
Leider bringt das (noch) nicht das gewünschte Ergebnis.

Gruß, Alex

Schwedenbitter 14. Sep 2013 15:23

AW: ListView mit PasswordChar
 
Dein Hinweis brachte mich aber auf die richtige Spur!
Es liegt am FontStyle, der aus unerfindlichen Gründen nicht (zurückgesetzt?) wird. Unerfindlich deshalb, weil er durch den Code - für mich ersichtlich - überhaupt nicht angefasst wurde. Folgender Code funktioniert jetzt bei mir jedenfalls:
Delphi-Quellcode:
Procedure ...
Var
   tmpRect : TRect;
   iWidth, i : Integer;
   tmpTextOut : String;
begin
   DefaultDraw:=(SubItem <> 2);
   If (SubItem = 2) Then
   Begin
      tmpRect:=Item.DisplayRect(drBounds);
      If (cdsFocused In State) And (cdsSelected In State) Then
      Begin
         Sender.Canvas.Brush.Color := clBlue;
         Sender.Canvas.Font.Color := clWhite; // Nur color nicht style wird geändert!
      End;

      iWidth:=0;
      For I:=0 To Pred(SubItem) Do Inc(iWidth, Sender.Column[I].Width);
      tmpTextOut:=StringOfChar('*', Length(Item.SubItems[Pred(SubItem)]));
      Sender.Canvas.TextOut(tmpRect.Left + iWidth + 1, tmpRect.Top, tmpTextOut);
   End
   Else
   Begin
      Sender.Canvas.Font.Style:=[fsItalic];
      Sender.Canvas.Font.Style:=[];
   End;
End;
Danke nochmal insoweit auch an die Leute von StackOverflow!

Gruß, Alex

Aviator 14. Sep 2013 15:27

AW: ListView mit PasswordChar
 
Dann ist das ja jetzt perfekt :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz