Ich würde es über die OwnerData-Property versuchen. Dann musst Du das OnData-Eregnis angeben, das für jedes ListViewItem aufgerufen wird. Dadrin füllst Du alle Werte des ListItems und die entsprechende Spalte mit '*' oder dem Klartext.
Delphi-Quellcode:
Procedure ListView1Data(Sender: TObject; Item: TListItem);
Begin
Item.Caption := MyUserData[Item.Index].UserName;
Item.ImageIndex := MyUserData[Item.Index].UserGroupIndex; // <-- Verschiedene bmps für Usergruppen z.B.
If UserWantsToSeePassword Then
Item.SubCaptions.Add(MyUserData[Item.Index].UserPassword)
Else
Item.SubCaptions.Add('****************');
End;
Das OnChange-Event der 'Klartextpasswärter anzeigen'-Checkbox macht dann nur noch das:
Delphi-Quellcode:
Procedure Checkbox1Change (Sender : TObject);
Begin
UserWantsToSeePassword := Checkbox1.changed;
ListBox1.Invalidate;
End;
Füllen brauchst Du die Listview dann nicht mehr, du setzt nur noch
ListView1.Items.Count = MyUserData.Count
Beim Einfügen und Löschen von MyUserData-Einträgen setzt Du die Count-Eigenschaft einfach neu. Nochmal: Die ListView.Items fässt Du nie direkt an!
IMHO sollten die OnDraw-Events nur dann verwendet werden, wenn man etwas am Layout ändern will. z.B. Progressbars in Spalten reinmalen oder so.
Aber nix gegen die Lösung von Sharky, denn viele Wege führen zum Ziel
@urbanbruhin: Ich würde die Anzahl der * nicht mit der Länge des Passwortes gleichsetzen, weil man dann gleich sehen kann, wer ein 'schwaches' Passwort hat.