![]() |
Delphi-Version: 10.4 Sydney
Ansprechen von während Laufzeit erzeugter Komponenten
Hallo Delphianer,
mein Problem: Schritt 1: erzeuge in Form1.create insgesamt 81 Labels während der Laufzeit. Alles i. O. Schritt 2: Lesen Daten von einer Datei in ein Integer-Array[1..9,1..9] ein. Alles i. O. Schritt 3: Will nun (falls F[i,k]>0) ein Label ansprechen und beschriften. Wie kann ich dieses Label ansprechen? Der Compiler kennt ja dieses Label nicht, da es zur Entwurfszeit nicht existiert. Allen Labels ist die gleiche onClick-prozedur zugeordnet. Diese soll ebenfalls das Label beschriften. Die Labels könnten über ihren Namen angesprochen werden. Habe Hilfen und Tutorials tonnenweise gelesen, aber dort läßt man sich nur zum Generieren der Komponenten aus und nicht wie ich von einer anderen prozedur der gleichen Form diese dann anspreche/aufrufen. Für nützliche Hinweise bin ich dankbar. Im Schritt 1 klappt lediglich die Farbzuordnung nicht.
Delphi-Quellcode:
MfG
.
. . i:=1; while i<= 9 do begin j:=1; while j<= 9 do begin n_lbl:='Feld'+IntToStr(j)+IntToStr(i); begin ALabel:=TLabel.Create(Self); ALabel.Name := n_lbl; ALabel.Left := left_M+(i-1)*sw-5; ALabel.Top := top_m+(j-1)*sw-5; ALabel.height:=sw-12; ALabel.width:=sw-12; ALabel.Transparent:=false; ALabel.color:=clSilver; ALabel.visible:=true; ALabel.Caption:=n_lbl; ALabel.Parent := GroupBox1; ALabel.OnClick:=PanelClick; Inc(j); end; end; Inc(i); end; Kurt Wallander |
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Du gönnst dir ja nur eine Variable
Delphi-Quellcode:
und packst da das grade zuletzt erstellte rein. Du musst dir das schon dauerhaft merken (z.B. in einem Array, Dictionary oder was auch immer).
ALabel
Du wirst bestimmt auch Vorschläge bekommen, das Label später anhand der
Delphi-Quellcode:
wiederzufinden, aber das ist mMn der falsche Weg.
Caption
|
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Ich iteriere in einem solchen Fall immer durch alle Compontenten des Parents. je nach Situation spreche ich die Komponeten dann über ihren Namen an oder einen vergebenen Tag. In etwa so:
Delphi-Quellcode:
var Temp: TComponent
... for I := 0 to ScrollBox1.ComponentCount - 1 do begin Temp := ScrollBox1.Components[I]; if Temp is TLabel then begin if TLabel(Temp).Name = 'blablub123' then begin //Machwas end; end; end; |
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Zitat:
|
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Zitat:
|
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Ich könnte nur Günther's Beitrag wiederholen, da war schon alles richtig. Im Übrigen finde ich es durchaus konstruktiv, bad practices zu kritisieren.
|
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Zitat:
Delphi-Quellcode:
Auf diese Weise werden nur soviel Labels erstellt wie du strings übermittelst und alles wäre innerhalb des arrays ansprechbar.
procedure LabelsDing(const ATarget: TGroupBox; const ALabels: Array of String);
var LblArr: Array of TLabel; Counter: Integer; begin SetLength(LblArr, Pred(Length(ALabels))); for Counter := Low(ALabels) to High(ALabels) do begin LblArr[Counter] := TLabel.Create(ATarget); LblArr[Counter].Parent := ATarget; LblArr[Counter].Caption := ALabels[Counter]; LblArr[Counter].Align := alTop; LblArr[Counter].Alignment := taCenter; |
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Zitat:
Man kann die Labels dann bei bedarf auch leicht zusätzliche Labels anfügen und sie jederzeit finden. Parent sollte man allerdings zuletzt zuweisen und ATarget Begin/EndUpdate verwenden. |
AW: Ansprechen von während Laufzeit erzeugter Komponenten
Ich schlage Array[1..9,1..9] of TLabel vor.
@KodeZwerg: a) LblArr[Counter] nicht merhfach verwenden. Besser noch eine einfache lokale Variable, die zuerst benutzen und dann am Ende ins Array umfüllen. b) Eigenschaft Parent besser erst am Ende zuweisen. |
AW: Ansprechen von während Laufzeit erzeugter Komponenten
- Label.ParentColor := False // = eigene Farbe verwenden
- Konstanten machen den Code verständlicher und wartbarer - For-Schleifen sind für eine vorher bekannte Anzahl von Durchläufen besser geeignet - Koordinaten werden normalerweise mit x, y, ... bezeichnet - Variablen sollten nicht mit A.. beginnen, das ist eigentlich Parametern vorbehalten (ALabel)
Delphi-Quellcode:
{Konstanten die an mehreren Stellen berücksichtigt werden}
const xmin = 1; xmax = 9; ymin = 1; ymax = 9; type TForm1 = class(TForm) {...} procedure PanelClick(Sender: TObject); private FMyIntegerArr: array[xMin..xMax, yMin..yMax] of Integer; FMyLabelArr: array[xMin..xMax, yMin..yMax] of TLabel; procedure InitMyLabel; function GetMyLabelPos(ALabel: TLabel): TPoint; end; implementation procedure TForm1.InitMyLabel; var x, y: Integer; L: TLabel; begin for y := ymin to ymax do begin for x := xmin to xmax do begin L := TLabel.Create(Self); L.Left := left_M - 5 + (x - xmin) * sw; L.Top := top_m - 5 + (y - ymin) * sw; L.Width := sw - 12; L.Height := sw - 12; L.Name := 'Feld' + IntToStr(y) + IntToStr(x); L.Caption := L.Name; l.ParentColor := False; L.Color := clSilver; L.Transparent := False; L.Parent := GroupBox1; L.OnClick := PanelClick; FMyLabelArr[x, y] := L; end; end; end; function TForm1.GetMyLabelPos(ALabel: TLabel): TPoint; var x, y: Integer; begin for y := ymin to ymax do begin for x := xmin to xmax do begin if FMyLabelArr[x, y] = ALabel then begin Result := TPoint(x, y); Exit; end; end; end; {nicht gefunden} Result := TPoint(-1, -1); end; procedure TForm1.PanelClick(Sender: TObject); var P: TPoint; i: Integer; begin P := GetMyLabelPos(Sender as TLabel); i := FMyIntegerArr[P.x, P.y]; {...} end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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