Entwickler-Ecke

Sonstiges (Delphi) - Liste auf Labels


leviathan - Sa 11.01.03 23:54
Titel: Liste auf Labels
Hallo zusammen,

ich möchte auf einem Formular eine schön formatierte (mit Grafiken, verschiedenen Schriftarten etc.) Liste mit String-Arrays (Titel von Filmen, so etwa 20-30 Stück) erstellen. Soll ja nach was aussehen und nicht eine droege Standard-Auswahlliste werden. Ich habe nun eine Lösung, die zwar funktioniert, mir aber nicht besonders schön und effizient erscheint.

Auf mein Formular habe ich 20 Labels gesetzt, die ich dann im Programm über eine For-Schleife beschrifte. Mein Problem: Ich muss für jedes Label nochmal die ganze Litanei wiederholen. Besonders ausufernd kann es werden, wenn ich noch mehrere Arrays habe. Später möchte ich über einen Klick auf das Label übrigens auch noch den Film auswählen können.



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.ShowAVFilmsClick(Sender: TObject);
var x : byte;
    geschrieben : boolean;
begin
label1.caption := ' '; // Labels "leeren"
label2.caption := ' ';
label3.Caption := ' ';

   For x := 1 to n do  
   begin
   geschrieben := false;
       If label1.caption = ' ' then begin   // Wenn Label leer 
       label1.Caption := Film[x].Titel;     // dann beschriften 
       geschrieben := true;                 // verhindert Mehrfacheintragung
       end;
     
       If (label2.caption=' ') AND (geschrieben=false) then begin
       label2.Caption := Film[x].Titel;
       geschrieben := true;
       end;
     
       If (label3.caption=' ') AND (geschrieben=false) then begin
       label3.Caption := Film[x].Titel;
       geschrieben := true;
       end;
       // etc. etc. etc.

    end;

end;



Das geht doch bestimmt eleganter, oder nicht?


Besten Dank und Gruß,
Levi

Klabautermann: Code Tags hinzugefügt.


Andreas Pfau - So 12.01.03 00:50

Du kannst Objekte auch über ihren Namen ansprechen:

Quelltext
1:
(FindComponent('Label1') As TButton).Caption := 'Hello world';                    


Damit kannst Du dir sicher 'ne Menge Arbeit sparen.


Wolff68 - So 12.01.03 00:56

Also in Deinem Fall wäre es sinnvoller die Labels genau wie die Filme in einem Array zu haben. Dazu musst Du sie aber selber erzeugen.
Das mit dem Erzeugen ist nur ein kurzer Mehraufwand, aber dafür hast Du es später wesentlich einfacher.

Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
type Film = Record
              Titel : String;
              Sonstwas : String;
            end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure aLabelClick(Sender: TObject);
  public
    { Public-Deklarationen }
    aLabel : Array[1..20] of TLabel;
    aFilm  : Array[1..20] of Film;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i : byte;
begin
  for i := 1 to 20 do begin
    { Labels erstellen }
    aLabel[i] := TLabel.Create(self);
    with aLabel[i] do begin
      Parent := Form1; // Wichtig !!!
      Name := 'Label'+IntToStr(i); // Nicht so wichtig
      Caption := ''; // Wenn Name vergeben wird sonst dieser als Caption gesetzt
      Left := 8; // Positionierung
      Top := i * 16 - 8; // Positionierung
      Tag := i; // Damit hast die Nummer einfacher als Integer zur Hand
      OnClick := aLabelClick; // Logo. Der Aufruf der OnClick-Prozedur
    end;
  end;

  { Nur zum Test }
  For i := 1 to 20 do aFilm[i].Titel := 'Film Nummer '+IntToStr(i);
end;

procedure TForm1.aLabelClick(Sender: TObject);
begin
  { Beispiel den angeklickten Film anzuzeigen }
  ShowMessage('Du hast folgenden Film ausgewählt:'+#13#10
             +(Sender as TLabel).Caption);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : byte;
begin
  { Füllt die Labels mit den Filmnamen }
  For i := 1 to 20 do begin
    aLabel[i].Caption := aFilm[i].Titel;
  end;
end;


Delete - So 12.01.03 06:17

Wie wäre es mit einer Listbox und die Items sleber zeichen? Beispiele haben wir hier genug.


Andreas Pfau - So 12.01.03 12:41

Hallo @Luckie,

Zitat:
Soll ja nach was aussehen und nicht eine droege Standard-Auswahlliste werden.


Es sei denn, man verändert die Liste so extem, dass sie nicht mehr nach Liste aussieht. Und da sind Labels einfacher, man kann einen Hintergrund dahinterstzen, keine ekligen Auswahl-Rechtecke, usw...


matze - So 12.01.03 13:09

wenn du aber die listbox selber zeichnest, dann kannst du auch die hintergrundfarbe und das aussehgen bei arkierung selber zeichnen. du kannst es so machen, wei du willst behältst aber die vorteile einer listbox !!!


Andreas Pfau - So 12.01.03 14:34

Ich glaube, es ist Witzlos, darüber zu Streiten. Du hast recht, klar, aber es kommt eben darauf an, wozu man das ganze benötigt.

PS: für ein absolut perfektes Ergebnis würde ich weder Labels noch ListBoxen verwenden, sondern würde es direkt per GDI in ein form zeichnen, mit Texturen, Pixelgenauer Positionnierung, Symbolen etc., wenn nicht sogar mit OpenGL (aber das wäre dann wieder zu perfekt). Es soll ja nur eine Liste sein, die nicht zu sehr nach Common.dll aussieht.