Autor Beitrag
leviathan
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 11.01.03 23:54 
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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: So 12.01.03 00:50 
Du kannst Objekte auch über ihren Namen ansprechen:
ausblenden Quelltext
1:
(FindComponent('Label1') As TButton).Caption := 'Hello world';					


Damit kannst Du dir sicher 'ne Menge Arbeit sparen.
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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:
ausblenden volle Höhe 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;

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 !!!

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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.