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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!