AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Ansprechen von während Laufzeit erzeugter Komponenten
Thema durchsuchen
Ansicht
Themen-Optionen

Ansprechen von während Laufzeit erzeugter Komponenten

Offene Frage von "TiGü"
Ein Thema von Kurt Wallander · begonnen am 7. Mär 2022 · letzter Beitrag vom 10. Mär 2022
Antwort Antwort
Seite 1 von 2  1 2      
Kurt Wallander

Registriert seit: 11. Mai 2020
Ort: Freiberg
35 Beiträge
 
Delphi 10.4 Sydney
 
#1

Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 17:00
Delphi-Version: 10.4 Sydney
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:
   .
   .
   .
   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;
MfG
Kurt Wallander

Geändert von Kurt Wallander ( 7. Mär 2022 um 17:04 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 18:02
Du gönnst dir ja nur eine Variable ALabel 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).

Du wirst bestimmt auch Vorschläge bekommen, das Label später anhand der Caption wiederzufinden, aber das ist mMn der falsche Weg.
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 19:03
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 = 'blablub123then
      begin
      //Machwas
      end;
    end;
   end;
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 22:07
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:
Alternativ könntest du auch ein paar Do-Nothing-Loops einbauen; verschwendet auch unnötig CPU Zyklen, ist aber wartbarer!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 22:29
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:
Alternativ könntest du auch ein paar Do-Nothing-Loops einbauen; verschwendet auch unnötig CPU Zyklen, ist aber wartbarer!
Dann wäre ein konstruktiver Vorschlag für den TE vielleicht hilfreich?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 22:35
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 7. Mär 2022, 23:01
Du gönnst dir ja nur eine Variable ALabel 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).
Da das mit der Caption bereits geklärt ist hier ein Vorschlag zum erstellen der labels (nur hier per editor getippst...)
Delphi-Quellcode:
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;
Auf diese Weise werden nur soviel Labels erstellt wie du strings übermittelst und alles wäre innerhalb des arrays ansprechbar.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 7. Mär 2022 um 23:13 Uhr)
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
240 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 8. Mär 2022, 06:25
LblArr: Array of TLabel;
So ähnlich mache ich das immer. Allerdings müsste LblArr eine variable des Forms sein, am besten eine TList<Label>.

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.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 8. Mär 2022, 08:44
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.

Geändert von freimatz ( 8. Mär 2022 um 08:46 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Ansprechen von während Laufzeit erzeugter Komponenten

  Alt 8. Mär 2022, 08:51
- 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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz