Dynamisches Erstellen von TLabel

Rund um die LCL und andere Komponenten
Antworten
downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Dynamisches Erstellen von TLabel

Beitrag von downloaditweb »

Ich hab folgendes Problem:
Mein Programm analysiert Daten und gibt sie formatiert als Übersicht aus (verschiedene Farben, Fonts // Grafiken etc..);

Ich hab keine Möglichkeit gefunden dies irgendwie dynamisch zu realisieren;
im Moment hab ich einfach 20 Label erstellt, die ich entsprechend formatiere.
Wenn ich Label nicht dynamisch erstellen kann, kann ich die bestehenden Statischen irgendwie als Array oder mit Zeigern dynamisch
ansprechen??

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamisches Erstellen von TLabel

Beitrag von theo »

Ich nehme mal an du meinst mit "statisch" zur Entwurfszeit und "dynamisch" zur Laufzeit.

Zur Laufzeit kannst du Labels so erzeugen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var aComp:TComponent;
i:integer;
begin
  With TLabel.Create(self) do
  begin
    Parent:=Self;
    Caption:='test';
    Left:=10;
    Top:=10;
    Name:='test1';
  end;
end;
Der "Besitzer" (meistens das Formular) hat nun die Komponente in einer Liste gespeichert und man kann sie wieder ansprechen:

Code: Alles auswählen

aComp:=FindComponent('test1');
  if aComp is TLabel then TLabel(AComp).Caption:='Label test1 gefunden';
Oder:

Code: Alles auswählen

for i:=0 to ComponentCount-1 do
    if Components[i] is TLabel then TLabel(Components[i]).Caption:='auch ein Label gefunden';

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Dynamisches Erstellen von TLabel

Beitrag von Ralph59 »

Hallo downloaditweb,

der Vorschlag vom heo zeig dir schon ganz gut, wie es geht.

Wenn Du zum Beispiel die Daten aus einer Tabelle oder Datenbank holst, dann kannst du es sicher auch so machen, dass deine Labels in einem Array stehen. Ich verwende zu diesem zweck dann immer einen owner z.b. ein panel, dass ich dann z.B. mit panel1.free auch einfach wieder ablöschen kann.

Code: Alles auswählen

private oder public oderzu einer Klasse
    panel1 : TPanel;
    aLabel1: Array of TLabel;
 
procedure TForm1.Button1Click(Sender: TObject);  
    panel1 := TPanel.Create(self);
    panel1.SetBounds(10,10,100,100);
    //oder z.b. aus einer Tabelle
    panel1.SetBounds(strtoint( dbp_left.Text ), strtoint( dbp_top.Text ), strtoint( dbp_with.Text ), strtoint( dbp_height.Text ));
    panel1.Parent := Form1;
    panel1.Visible:=true;
    Datasource1.DataSet.First;
    SetLength(aLabel1, Datasource1.DataSet.FieldByName('nindex').AsInteger+1)
    while Datasource1.DataSet.EOF = false do begin
        aLabel1[nindex]:=TLabel.Create(Panel1);   
        aLabel1[nindex].Parent:=Panel1;
        aLabel1[nindex].Caption:=Datasource1.DataSet.FieldByName('Caption').AsString; 
        aLabel1[nindex].Left:=10;  //oder berechnet oder auch  aus der Datentabelle
        aLabel1[nindex].Top:=10 * nindex;  //oder auch  aus der Datentabelle
 
        Datasource1.DataSet.Next;
    end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);  
    panel1.Free;
end;
Na ja, so ähnlich sollte es auch gehen.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

downloaditweb
Beiträge: 27
Registriert: Do 28. Jan 2010, 13:24
OS, Lazarus, FPC: openSuse Leap 42.3 (L 1.8 FPC 3.0.4)
CPU-Target: 64Bit

Re: Dynamisches Erstellen von TLabel

Beitrag von downloaditweb »

Vielen Dank für die schnellen Antworten,
sie haben mir viel weitergeholfen.

Antworten