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 passwörter (***) in der listview? (https://www.delphipraxis.net/47447-passwoerter-%2A%2A%2A-der-listview.html)

100nF 11. Jun 2005 10:32


passwörter (***) in der listview?
 
hi,

ich wollte mal fragen ob es möglich ist, EINE(nicht alle!) spalte in der listview(vsReport) als passwort anzeigen lassen, dass nur *** angezeigt werden. man sollte in programm einstellen können, ob es als passwort angezeigt werden soll oder als klartext.

ich hoffe es ist möglich...

gruss
urbanbruhin

phlux 11. Jun 2005 11:09

Re: passwörter (***) in der listview?
 
Hi!

Ich denke mal das musst du per Hand übernehmen ;)

mfg phlux :hi:

100nF 11. Jun 2005 12:22

Re: passwörter (***) in der listview?
 
hi,

und wie macht man das?

jfheins 11. Jun 2005 12:26

Re: passwörter (***) in der listview?
 
In einer for-Schleife die items durchgehen, und ein bestimmtes Subitem durch Sternchen ersetzen (StringofChar) ;)

phlux 11. Jun 2005 15:01

Re: passwörter (***) in der listview?
 
Zitat:

Zitat von urbanbruhin
hi,

und wie macht man das?

na du musst doch wissen, wann deine tlistview mit den items befüllt wird, dann fragts du einfach ab ob der benutzer angewählt hat ob er die pw's im klartext sehen will oder als *** und dementsprechend schreibst du halt das item in die tlistview ;)

malo 11. Jun 2005 15:07

Re: passwörter (***) in der listview?
 
Ihr vergesst dabei aber, dass der String dann auch *** ist!

Eine Abfrage des Passworts wird dabei z.B. unmöglich! ;)

//edit: Man könnte das Passwort im Klartext dann auch in eine Variable speichern, mit der man dann abfragt.

100nF 11. Jun 2005 17:54

Re: passwörter (***) in der listview?
 
Delphi-Quellcode:
Man könnte das Passwort im Klartext dann auch in eine Variable speichern, mit der man dann abfragt.
also am besten eine stringlist, oder?

Matze 11. Jun 2005 18:12

Re: passwörter (***) in der listview?
 
Zum Beispiel. Das ist in dem Falle wohl das einfachste, da der Itemindex sogar gleich mit dem der ListView übereinstimmt.

100nF 11. Jun 2005 18:33

Re: passwörter (***) in der listview?
 
ok, dann probiere ich es mal so...


danke für die antworten!

MFG
urbanbruhin

Sharky 12. Jun 2005 08:02

Re: passwörter (***) in der listview?
 
Hai,

am einfachsten dürfte es wohl sein einfach die Ausgabe des Textes zu ändern ;-)
Wozu extra eine Stringliste verwalten wenn es doch nur darum geht das die Passwörter nicht angezeigt werden :stupid:

Der Code geht davon aus das die Passwörter in der zweiten Spalte (SubItem = 1) stehen. Über CheckBox1 wird entschieden ob sie gezeigt werden oder nicht.
Delphi-Quellcode:
uses
  CommCtrl;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  ListView1.Repaint;
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: integer; State: TCustomDrawState; var DefaultDraw: boolean);
var
  rect: TRect;
begin
  if (SubItem = 1) and (CheckBox1.Checked) then
  begin
    DefaultDraw := False;
    ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @rect);
    DrawText(Sender.Canvas.Handle,
      PChar('******'),
      Length('******'),
      rect,
      DT_SINGLELINE or DT_END_ELLIPSIS);
  end
  else
  begin
    DefaultDraw := True;
  end;
end;

procedure TForm1.ListView1Click(Sender: TObject);
begin
  Edit1.Text := ListView1.Items[ListView1.ItemIndex].SubItems[0];
end;

100nF 12. Jun 2005 09:19

Re: passwörter (***) in der listview?
 
hi Sharky,

vielen dank für deine antwort!!
si funktioniert FAST...

also das erste problem ist noch, dass als passwort immer ***** angezeigt wird. das problem dabei ist, dass die länge nicht mit der länge des passworts überrein simmt. ich habe schon ein bisschen herumprobiert, aber ich habe es nicht rausgefunden, wie man das ändern lönnte.

das zweite problem ist, dass der text der spalten hinter der passwort-spalte fett ist. ich kann mir einfach nicht erklären, wieso...

ich wäre sehr dankbar, wenn du eine lösung dazu hättest :mrgreen:

edit: ich glaube die spalten hinter der passwort-spalte werden nicht fett, sondern eine size grösser, und die schriftart wird geändert.


gruss
urbanbruhin

alzaimar 12. Jun 2005 09:25

Re: passwörter (***) in der listview?
 
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
Delphi-Quellcode:
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 :wink:

@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.

DP-Maintenance 12. Jun 2005 09:30

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "VCL / WinForms / Controls" verschoben.
Es geht um eine VCL-Komponente, deshalb schiebe ich es mal in die entsprechende Sparte...

100nF 12. Jun 2005 09:43

Re: passwörter (***) in der listview?
 
hi alzaimar,

danke für deine antwort, aber irgendwie bekomme ich die nicht zum laufen. ich blick auch nicht durch, wie sie funktionieren sollte.

trotzdem danke.

Zitat:

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.
du hast da etwas falsch verstanden. diese passwörter kann nur der benutzer sehen, dem sie auch gehören. dieser loggt sich mit einem passwort ein, und bekommt dann nur seine passwörter zu sehen, und keine anderen. falls er eines vergessen hat, kann er die passwörter anzeigen lassen.


gruss
urbanbruhin

alzaimar 12. Jun 2005 10:08

Re: passwörter (***) in der listview?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab gerade für ein anderes Forum (die Konkurrenz :stupid:) ein Beispielprojekt mit OwnerData-Listviews erstellt. Schau's Dir an.
Achte darauf, das die ListView 10.000 Einträge hat. Geht auch mit 2.000.000.000! Dort ist auch Code, um die Checkbox-Funktionalität, die normalerweise vorhanden ist, nachzubilden.

Ich finde das Verfahren mit OwnerData=True aufgeräumt, weil das Befüllen der ListItems zentral an einer Stelle stattfindet und strikt zwischen Daten und Darstellung getrennt wird.

Zu den '*': Wenn nur der Anwender seine Passwörter sehen kann, wozu dann mit '*' verstecken? Wegen der Spione, die ihm über die Schulter schauen? Na dann doch erst Recht verschleiern... Aber, is deine Sache (wie sowieso Alles andere auch :zwinker:)

Sharky 12. Jun 2005 10:24

Re: passwörter (***) in der listview?
 
Und hier noch einmal das ganze im OnDrawSubItem ;-)

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: integer; State: TCustomDrawState; var DefaultDraw: boolean);
var
  rect: TRect;
  Text: string;
begin
  DefaultDraw := False;
  if (SubItem = 1) and (CheckBox1.Checked) then
  begin
    Text := StringOfChar('*',Length(Item.SubItems[0]))
  end
  else
  begin
    Text := Item.SubItems[SubItem - 1]
  end;
  ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @rect);
  (Sender as TListView).Canvas.TextRect(rect, Text);
end;

100nF 12. Jun 2005 10:26

Re: passwörter (***) in der listview?
 
hi,

mit dem anhang konnte ich leider nicht viel anfangen, da ich keine checkboxes in der listview habe...

Zitat:

Wenn nur der Anwender seine Passwörter sehen kann, wozu dann mit '*' verstecken?
es könnte ja mal sein, dass jemand die tür reinkommt... und wenn man nur ein passwort hinzufügen will, braucht man ja die anderen passwörter nicht zu sehen...

auf jeden fall ist es so sicherer :mrgreen:

100nF 12. Jun 2005 10:50

Re: passwörter (***) in der listview?
 
@Sharky :

dein code funktioniert wunderbar!!
ein nachteil ist, dass nicht mehr die ganze zeile markiert werden kann, aber ich glaube dass lass ich sein.

vielen dank!! :mrgreen:

MFG
urbanbruhin

Sharky 12. Jun 2005 11:14

Re: passwörter (***) in der listview?
 
Zitat:

Zitat von urbanbruhin
...aber ich glaube dass lass ich sein. ...

Hmmm.... dann musst Du die "markierung" einfach selber zeichnen ;-)

100nF 12. Jun 2005 11:18

Re: passwörter (***) in der listview?
 
Zitat:

Hmmm.... dann musst Du die "markierung" einfach selber zeichnen
das habe ich auch schon probiert, aber in diesem gebiet bin ich halt kein profi. darum habe ichs auch nicht hinbekommen.

wenn du das auch noch programmieren würdenst, wäre ich sehr dankbar!

zur information:
die listview hat vier spalten. die hinteren drei werden nicht markiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.

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