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 Auf Dynamisch erstellte Labels zugreifen (https://www.delphipraxis.net/79318-auf-dynamisch-erstellte-labels-zugreifen.html)

150gozilla 20. Okt 2006 10:32


Auf Dynamisch erstellte Labels zugreifen
 
Hallo, ich habe mir in meinem Programm dynamische Labels erstellt(Schleife).
Es sind 81 und haben den Namen "Label1, Label2, etc...)

Wie kann ich jetzt auf ein einzelnes Label, sagen wir Label43 zugreifen, weil ich dort die Farbe einstellen möchte.

Delphi-Quellcode:
   var
   Labels:TLabel;
   ...
   Labels:= TLabel.Create(self);
   Labels.Parent:= Form1;
   ...

chaosben 20. Okt 2006 10:35

Re: Auf Dynamisch erstellte Labels zugreifen
 
Du bekommst ja in "Labels" eine Referenz auf das neu erstellte Element zurück. Damit kannst du auf das Label zugreifen.
In deinem Fall würde sich ein Array anbieten:
Delphi-Quellcode:
var
  Labels : array of TLabel;
  idx: Integer;
begin
  for idx:=0 to 100 do
  begin
    SetLength(Labels,idx+1);
    Labels[idx]:=TLabel.Create(Form1);
    ...
  end;

  Labels[74].Color:=clGreen;
end;
Danach das freigeben der Labels und das Zurücksetzen der Länge des Arrays nicht vergessen. :)

freak4fun 20. Okt 2006 10:37

Re: Auf Dynamisch erstellte Labels zugreifen
 
Delphi-Quellcode:
Label43.Caption := 'Hallo Welt?!';
So wie auf jedes andere Element auch. ;)

MfG
freak

Mavarik 20. Okt 2006 10:52

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von freak4fun
So wie auf jedes andere Element auch. ;)

Sicherlich nicht, da dynamisch erzeugt...

@150gozilla

Du kannst die Labels nicht einfach ins "Blaue" erzeugen, sonder musst Dir eine Liste (Array) mit den Pointern (Objectzeigern) erzeugen...

Frank :coder:

150gozilla 20. Okt 2006 11:00

Re: Auf Dynamisch erstellte Labels zugreifen
 
Im moment sieht es bei mir so aus:

Delphi-Quellcode:
for index2:=0 to 100 do
    begin
     SetLength(Labels,index2+1);
     Labels[index2]:=TLabel.Create(self);
     Labels[index2].Top := ((i-1)* lg)+13;
     Labels[index2].Parent:= Form1;
     Labels[index2].AutoSize := false;
     Labels[index2].Font.Size := 12;
     Labels[index2].Left := 10 + lg *(j-1);
     Labels[index2].Height:= lg;
     Labels[index2].Width:=lg;
     Labels[index2].Caption:= IntToStr(i)+','+(IntToStr(j));
     Labels[index2].Alignment := tacenter;
    end;
Und wenn ich sie blau färben will "
Delphi-Quellcode:
Labels[2].Color := clblue;
"funktioniert es nicht. Allein das Kompilieren dauert 2 Minuten... und das Fenster schließt sich nach einer Minute. könntet ihr mir helfen ?

MfG, Chris

chaosben 20. Okt 2006 11:01

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von 150gozilla
funktioniert es nicht

Was funktioniert nicht? Welche Fehlermeldung?

150gozilla 20. Okt 2006 11:02

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von chaosben
Zitat:

Zitat von 150gozilla
funktioniert es nicht

Was funktioniert nicht? Welche Fehlermeldung?

Es passiert nichts :(

chrisw 20. Okt 2006 11:12

Re: Auf Dynamisch erstellte Labels zugreifen
 
musst Du nicht i und j in deiner Schleife auch ändern, bzw index2 für left und top nutzen

chaosben 20. Okt 2006 11:12

Re: Auf Dynamisch erstellte Labels zugreifen
 
@Gozilla: Da muss es an einem Teil des Codes liegen, den du noch nicht gepostet hast.

150gozilla 20. Okt 2006 11:25

Re: Auf Dynamisch erstellte Labels zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Labels: array of TLabel;


implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
 i,           // Zeilenzähler
 j,           // Spaltenzähler
 lg,          // Labelgröße
 bg :Integer; // Boxgröße
 s :String;
 index2: integer;
begin
 Form1.Height := round(screen.height*0.8);
 Form1.Width := Form1.Height;
 bg := Round((Form1.Height-20)/3);
 lg := Round((bg-5)/3);
  for i:=1 to 9 do
  begin
   for j:= 1 to 9 do
   begin
    for index2:=1 to 81 do
    begin
     SetLength(Labels,index2+1);
     Labels[index2]:=TLabel.Create(self);
     Labels[index2].Top := ((i-1)* lg)+13;
     Labels[index2].Parent:= Form1;
     Labels[index2].AutoSize := false;
     Labels[index2].Font.Size := 12;
     Labels[index2].Left := 10 + lg *(j-1);
     Labels[index2].Height:= lg;
     Labels[index2].Width:=lg;
     Labels[index2].Caption:= IntToStr(i)+','+(IntToStr(j));
     Labels[index2].Alignment := tacenter;
     //SetLength(Labels, 1);
    end;
    Labels[10].Color:= clblue; // Funzt nicht.
  end;
 end;
end;
end.
Den Timercode habe ich mal rausgenommen, da er nur die linien zeichnet, und das hier unwichtig ist

Ich soll Sudoku nachprogrammieren mit einer 9x9 Matrix, daher die schleifen j und i im moment sieht es so aus "siehe anhang"
Die schwarzen linien hab ich mit paint dazu gemacht zur besseren übersicht

Ich bin zwar kein frischling, aber auch nicht mehr der fitteste :oops:

MfG, Chris

Mavarik 20. Okt 2006 11:27

Re: Auf Dynamisch erstellte Labels zugreifen
 
hmm

Du erzeugst 6561 Labels!

Frank

chrisw 20. Okt 2006 11:27

Re: Auf Dynamisch erstellte Labels zugreifen
 
Das sind ja 6561 Label, die Du erzeugst ! Für Sudoko ein bisschen zu viel, oder?


Davon legst du aber nur 81 im Array ab !


Was willst Du denn damit ?

150gozilla 20. Okt 2006 11:29

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von chrisw
Das sind ja 6561 Label ! Für Sudoko ein bisschen zu viel, oder?


Das stimmt.

Wie könnte ich die Schleifen am besten verschachteln ?

chrisw 20. Okt 2006 11:32

Re: Auf Dynamisch erstellte Labels zugreifen
 
Die Schleife mit dem index2 einfach weglassen und einen Zähler in der inneren Schleife von 1 bis 81 zählen (inc())

Mavarik 20. Okt 2006 11:32

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von 150gozilla
Wie könnte ich die Schleifen am besten verschachteln ?

Delphi-Quellcode:
 SetLength(Labels,81);
 index2 := 0;

  for i:=1 to 9 do
  begin
   for j:= 1 to 9 do
   begin
     Labels[index2]:=TLabel.Create(self);
     Labels[index2].Top := ((i-1)* lg)+13;
     Labels[index2].Parent:= Form1;
     Labels[index2].AutoSize := false;
     Labels[index2].Font.Size := 12;
     Labels[index2].Left := 10 + lg *(j-1);
     Labels[index2].Height:= lg;
     Labels[index2].Width:=lg;
     Labels[index2].Caption:= IntToStr(i)+','+(IntToStr(j));
     Labels[index2].Alignment := tacenter;
    inc(index2);
   end;
  end;

Frank :coder:

150gozilla 20. Okt 2006 11:39

Re: Auf Dynamisch erstellte Labels zugreifen
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von 150gozilla
Wie könnte ich die Schleifen am besten verschachteln ?

Delphi-Quellcode:
 SetLength(Labels,81);
 index2 := 0;

  for i:=1 to 9 do
  begin
   for j:= 1 to 9 do
   begin
     Labels[index2]:=TLabel.Create(self);
     Labels[index2].Top := ((i-1)* lg)+13;
     Labels[index2].Parent:= Form1;
     Labels[index2].AutoSize := false;
     Labels[index2].Font.Size := 12;
     Labels[index2].Left := 10 + lg *(j-1);
     Labels[index2].Height:= lg;
     Labels[index2].Width:=lg;
     Labels[index2].Caption:= IntToStr(i)+','+(IntToStr(j));
     Labels[index2].Alignment := tacenter;
    inc(index2);
   end;
  end;

Frank :coder:

Dankeeeeeeee, das klappt 100%ig.

Danke an alle die mir geholfen haben :)
Hab wieder was gelernt =)
Danke nochmal =)

chrisw 20. Okt 2006 11:43

Re: Auf Dynamisch erstellte Labels zugreifen
 
Wobei hier ein dynamisches Array eigentlich keinen sonderlichen Sinn verfolgt (ein statisches hätt's auch getan, am besten 2 dimensional (array [1..9,1..9] of TLabel))
a la
Delphi-Quellcode:
const MaxWidthHeight = 9;
...
Labels : array [1..MaxWidthHeight ,1..MaxWidthHeight ] of TLabel;
....

for i:=1 to MaxWidthHeight do
  begin
   for j:= 1 to MaxWidthHeight do
   begin
     Labels[i,j]:=TLabel.Create(self);
     Labels[i,j].Top := ((i-1)* lg)+13;
     Labels[i,j].Parent:= Form1;
     Labels[i,j].AutoSize := false;
     Labels[i,j].Font.Size := 12;
     Labels[i,j].Left := 10 + lg *(j-1);
     Labels[i,j].Height:= lg;
     Labels[i,j].Width:=lg;
     Labels[i,j].Caption:= IntToStr(i)+','+(IntToStr(j));
     Labels[i,j].Alignment := tacenter;
   end;
  end;



Ist mglw später einfacher anzusprechen !!!

hoika 20. Okt 2006 13:39

Re: Auf Dynamisch erstellte Labels zugreifen
 
Hallo,

noch zum Zugriff.
Beim Erzeugen kann man ja Namen selber vorgeben

Label.Name:= 'Label_Suduko_1'.

Der Zugriff erfolgt dann über TLabel(FindComponent('Label_Suduko_1'))


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 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 by Thomas Breitkreuz