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 Optische Anordnung ListBox (https://www.delphipraxis.net/141698-optische-anordnung-listbox.html)

DutchmanTom 14. Okt 2009 10:35


Optische Anordnung ListBox
 
Moin Leuts,

ich bin imme rncoh bei meinem Adressbuch.
Mittlerweile ist es so gut wie feritg. Im Moment fehlen nur noch optische feinheiten.

Jetzt würde ich gerne, dass die Liste der Adressen nicht einefan so aussieht:

Mustermann, Max
Schröder, Gerhard
Merkel, Angela
usw.

Sondern dass die Vorname alle auf einer Linie anfangen. (verständlich was ich will?)

Habt ihr da irgendwelche Ideen?

Die einzige die ich habe ist umständlich und unschön^^
Nämlich besteht die daraus, die Schriftart zu wählen, in der jeder Buchstabe dieselbe Breite hat, dann die Zeichen des Nachnamens zu zählen und dann z.b. 25-(Wortzeichenanzahl) Leerzeichen einzufügen bevor der Vorname kommt.

gruß
DutchmanTom

DeddyH 14. Okt 2009 10:36

Re: Optische Anordnung ListBox
 
Nimm statt einer ListBox eine ListView mit ViewStyle vsReport.

DutchmanTom 14. Okt 2009 10:48

Re: Optische Anordnung ListBox
 
Das kam auch von nem Kolegen ^^

gibts irgend eine möglichkeit wie ich miene ListBox, die schon in die komplette Programierung mit eingebaut ist, schnell ersetzen kann?

Einfach ersetzen und selber name hat leider nit geklappt :(

DeddyH 14. Okt 2009 10:52

Re: Optische Anordnung ListBox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit der TListview geht das etwas anders, da Du auch SubItems brauchst. Hier einmal ein Beispiel (alles im Quellcode gemacht, was auch im OI ginge):
Delphi-Quellcode:
procedure TfrmListViewDemo.FormCreate(Sender: TObject);
var Item: TListItem;
    Column: TListColumn;
begin
  //Einstellen des ViewStyle
  ListView1.ViewStyle := vsReport;

  //Anlegen von 2 Spalten
  Column := ListView1.Columns.Add;
  Column.Width := 150;
  Column.Caption := 'Name';
  Column := ListView1.Columns.Add;
  Column.Width := 150;
  Column.Caption := 'Vorname';

  //Einfügen der Einträge
  Item := ListView1.Items.Add;
  Item.Caption := 'Mustermann';
  Item.SubItems.Add('Max');
  Item := ListView1.Items.Add;
  Item.Caption := 'Korn';
  Item.SubItems.Add('Klara');
  Item := ListView1.Items.Add;
  Item.Caption := 'Walker';
  Item.SubItems.Add('Johnny');
end;
Das sieht dann so aus wie im Anhang.

iKilledKenny 14. Okt 2009 11:13

Re: Optische Anordnung ListBox
 
Eine andere Möglichkeit wäre das selber zu zeichnen -> OwnerDraw

DutchmanTom 14. Okt 2009 14:06

Re: Optische Anordnung ListBox
 
Zitat:

Zitat von DeddyH
Mit der TListview geht das etwas anders, da Du auch SubItems brauchst. Hier einmal ein Beispiel (alles im Quellcode gemacht, was auch im OI ginge):
Delphi-Quellcode:
procedure TfrmListViewDemo.FormCreate(Sender: TObject);
var Item: TListItem;
    Column: TListColumn;
begin
  //Einstellen des ViewStyle
  ListView1.ViewStyle := vsReport;

  //Anlegen von 2 Spalten
  Column := ListView1.Columns.Add;
  Column.Width := 150;
  Column.Caption := 'Name';
  Column := ListView1.Columns.Add;
  Column.Width := 150;
  Column.Caption := 'Vorname';

  //Einfügen der Einträge
  Item := ListView1.Items.Add;
  Item.Caption := 'Mustermann';
  Item.SubItems.Add('Max');
  Item := ListView1.Items.Add;
  Item.Caption := 'Korn';
  Item.SubItems.Add('Klara');
  Item := ListView1.Items.Add;
  Item.Caption := 'Walker';
  Item.SubItems.Add('Johnny');
end;
Das sieht dann so aus wie im Anhang.

Das könnte funktionieren.
Nur iwie schaff ichs nit den code so an zu passen, dass der mein offenes Array akzeptiert

DutchmanTom 14. Okt 2009 15:49

Re: Optische Anordnung ListBox
 
Ok, ich hab die ListBox mittlerweile durch eine ListView erstezt.

Jetzt bekomm ich leider jedes mal, wenn ich von der Darstellung "Nachname, Vorname" ind die Darstellung "Vorname, Nachname" wechseln will eine Fehlermeldung a la Zugriffsverletzung.

Code für Wechseln der Darstellung:
Delphi-Quellcode:
procedure TForm1.CBAnordnungChange(Sender: TObject);
var i : Integer;
begin
  LVAdressen.Clear;
  for i := 0 to High(Adressen) do
   AdressdarstellungEdit ( i, Adressen[i] );
end;
Das im Code genannte AdressDarstellungEdit sieht volgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.AdressdarstellungEdit ( index: integer; AAdresse: TAdresse );
var   Item: TListItem;
    Column : TListColumn;
begin
  Item := LVAdressen.Items[index];
  Item.SubItems.Clear; <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- <--

  if CBAnordnung.ItemIndex = 0
[und so weiter]
gruß
DutchmanTom

PS: Da wo die ganze <-- sind, befindet sich die Zeile an der die Zugriffsverletzung eintritt

s.h.a.r.k 14. Okt 2009 15:55

Re: Optische Anordnung ListBox
 
wenn du es noch komplexer haben willst (aber natürlich mit viel mehr optionen und möglichkeiten) kannst du auch einen virtualstringtree nehmen ;)

Matze 14. Okt 2009 16:58

Re: Optische Anordnung ListBox
 
Das Ganze lässt sich schon mit einer ListBox realisieren. Einen Beispielcode gibt's im SDC: ...in einer Listbox Spalten mit unterschiedlich weiten Tabulatoren anzeigen?.

DeddyH 14. Okt 2009 18:01

Re: Optische Anordnung ListBox
 
Wenn Du die Items mit Clear aus der ListView löschst, kannst Du natürlich anschließend nicht mehr darauf zugreifen, sondern musst sie neu erzeugen.
Delphi-Quellcode:
procedure TForm1.AdressdarstellungEdit ( index: integer; AAdresse: TAdresse );
var   Item: TListItem;
    Column : TListColumn;
begin
  Item := LVAdressen.Items.Add; //Item neu anlegen
  //Item.SubItems.Clear; //unnötig, da noch keine SubItems vorhanden

  if CBAnordnung.ItemIndex = 0
[und so weiter]
[edit] Ich hab das Ganze jetzt mal unter Lazarus geschrieben. FAdressen ist ein array of record. Die folgende Routine wird aufgerufen, wenn das Array befüllt ist oder sich die ComboBoxReihenfolge ändert.
Delphi-Quellcode:
procedure TForm1.ListAdresses;
var i: integer;
    Item: TListItem;
begin
  LVAdressen.Items.BeginUpdate;
  try
    LVAdressen.Items.Clear;
    case ComboBoxReihenfolge.ItemIndex of
      0: begin
           LVAdressen.Columns[0].Caption := 'Name';
           LVAdressen.Columns[1].Caption := 'Vorname';
         end;
      1: begin
           LVAdressen.Columns[1].Caption := 'Name';
           LVAdressen.Columns[0].Caption := 'Vorname';
         end;
    end;
    for i := Low(FAdressen) to High(FAdressen) do
      begin
        Item := LVAdressen.Items.Add;
        case ComboBoxReihenfolge.ItemIndex of
          0: begin
               Item.Caption := FAdressen[i].Name;
               Item.SubItems.Add(FAdressen[i].Vorname);
             end;
          1: begin
               Item.Caption := FAdressen[i].Vorname;
               Item.SubItems.Add(FAdressen[i].Name);
             end;
        end;
      end;
  finally
    LVAdressen.Items.EndUpdate;
  end;
end;
[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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