Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Inhalt zur Laufzeit erzeugter Komponenten zugreifen (https://www.delphipraxis.net/26620-auf-inhalt-zur-laufzeit-erzeugter-komponenten-zugreifen.html)

aschne1 26. Jul 2004 18:39


Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Hallo

Ich erzeuge zur Laufzeit einige Komponenten und das funktioniert auch prima. Leider kann ich aber auf den Inhalt nicht zugreifen. Beim Compilieren ist fertig. Die erzeugte Komponenten wird als 'ungültiger Bezeichner' erkannt!
Kann mir jemand weiterhelfen :?:

Besten Dank zum Voraus

Gruss Armin

Delphi-Quellcode:
// Erzeugen der Komponente
procedure TForm1.CreateEdit(name: String; links, oben, breite, hoehe: Integer);
begin
 if TEdit(FindComponent(name)) = nil then                      // Feld nicht vorhanden
 begin
  edi_feld := TEdit.Create(Self);
  with edi_feld do
  begin
   Parent := Self;
   Name := name;
   AutoSize := False;
   SetBounds(links, oben, breite, hoehe)
  end;
  abstand := links + breite + 3                                 // Position aktualisieren
 end
end;
...
// Zugriff auf die erzeugte Komponente - Hier meckert der Compiler !
 if TEdit(FindComponent(name)) <> nil then Stringvariable := 'name der komponente'.Text;

mischerr 26. Jul 2004 18:45

Re: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Das geht so nicht!

Code:
Name := name;
Nenn die übergebene Variable um z.B. AName! Also

Code:
Name := AName;
Grüsse!

aschne1 26. Jul 2004 19:16

Re: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Hallo mischerr

Danke für Deine rasche Hilfe. Ich musste nur noch den Zugriff ändern, dann funktionierte es. :cheers: Gibt es eine elegantere Variante?

Delphi-Quellcode:
 if TEdit(FindComponent(AName)) <> nil then Stringvariable := TEdit(FindComponent(AName)).Text;
mfg Armin

MacGuyver 29. Mär 2011 09:47

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Klar! Auf with verzichten. Diese unübersichtliche, tippfaule, nebulöse Programmierung bringt nur Nachteile. Na gut, man spart sich ein paar Tastaturanschläge - legt die beim Debuggen locker mehrfach drauf. :warn:

WM_CLOSE 29. Mär 2011 10:34

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
stimmt nicht! es ist laut Delphi Hilfe effizienter. Aber dann sparsam und nur in performancekritischen Schleifen einsetzen. Der Debugger mag das nicht D2009). Außerdem wird es mit zunehmender Länge der Blöcke schwer verständlich.

DeddyH 29. Mär 2011 10:41

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Zitat:

Zitat von WM_CLOSE (Beitrag 1091691)
stimmt nicht! es ist laut Delphi Hilfe effizienter.

Wo hast Du das gelesen? Abgesehen davon überwiegen die Nachteile derart, dass man wirklich nur von with abraten kann, Beispiele dafür gibt es haufenweise hier im Forum.

WM_CLOSE 29. Mär 2011 11:02

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Aus der Delphi 2009 Hilfe: Deklarationen und Anweisungen

Zitat:

with-Anweisungen
Eine with-Anweisung stellt eine einfache und bequeme Möglichkeit dar, die Felder eines Records oder die Felder, Eigenschaften und Methoden eines Objekts zu referenzieren. Die Syntax für eine with-Anweisung lautet

Delphi-Quellcode:
with Objekt do Anweisung, oder
with Objekt1, ..., Objektn do Anweisung
Hierbei ist Objekt ein Ausdruck mit einer Referenz auf einen Record, eine Objektinstanz, eine Klasseninstanz, eine Interface- oder Klassentyp (Metaklassen)-Instanz. Anweisung ist eine einfache oder eine strukturierte Anweisung. Innerhalb von Anweisung brauchen Felder, Eigenschaften und Methoden von Objekt nur über ihren Bezeichner referenziert zu werden. Die Angabe von Qualifizierern ist nicht erforderlich.

Ausgehend von den Deklarationen
Delphi-Quellcode:
type
  TDate = record
    Day: Integer;
    Month: Integer;
    Year: Integer;
  end;

var
  OrderDate: TDate;

with OrderDate do
 if Month = 12 then
   begin
     Month := 1;
     Year := Year + 1;
   end
 else
   Month := Month + 1;
if OrderDate.Month = 12 then
  begin
   OrderDate.Month := 1;
   OrderDate.Year := OrderDate.Year + 1;
  end
else
  OrderDate.Month := OrderDate.Month + 1;
Wenn die Interpretation von Objekt die Indizierung von Arrays oder die Dereferenzierung von Zeigern verlangt, werden diese Aktionen einmal durchgeführt, bevor die Anweisung ausgeführt wird. Dies macht with-Anweisungen sowohl effizient als auch kurz. Außerdem können sich während der aktuellen Ausführung der with-Anweisung Zuweisungen an eine Variable innerhalb von Anweisung nicht auf die Interpretation von Objekt auswirken.

Jede Variablenreferenz und jeder Methodenname in einer with-Anweisung wird, wenn möglich, als Element des angegebenen Objekts bzw. Records interpretiert. Wenn in der with-Anweisung auf eine andere Variable oder Methode mit demselben Namen zugegriffen werden soll, ist ein Qualifizierer erforderlich:

Delphi-Quellcode:
with OrderDate do
  begin
    Year := Unit1.Year;
       ...
  end;
Wenn auf with mehrere Objekte oder Records folgen, wird die gesamte Anweisung als Folge von verschachtelten with-Anweisungen behandelt. Die Anweisung:

Delphi-Quellcode:
with Objekt1, Objekt2, ..., Objektn do Anweisung
ist gleichbeudeutend mit

Delphi-Quellcode:
with obj1 do
  with obj2 do
    ...
    with objn do
      // Anweisung
In diesem Fall wird jede Variablenreferenz und jeder Methodenname in Anweisung als Element von Objektn behandelt, wenn dies möglich ist. Andernfalls wird die Referenz bzw. der Name als Element von Objektn1 interpretiert usw. Dieselbe Regel gilt für die Interpretation der Objekte selbst. Ist beispielsweise Objektn sowohl ein Element von Objekt1 als auch von Objekt2, wird es als Objekt2.Objektn interpretiert

DeddyH 29. Mär 2011 11:40

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Ich lese daraus nicht, dass with effizienter sein soll als der Verzicht darauf.

shmia 29. Mär 2011 12:05

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Nun, wir haben es hier mit einer Kollison des Scope zu tun.
Sowohl das dynamisch angelegte TEdit als auch das übergeordnete TForm besitzen teilweise die gleichen Properties (Name, Parent, Autosize, SetBounds).
Durch die Verwendung von With kann der Programmierer nicht mehr zuverlässig unterscheiden, welches Objekt konkret angesprochen wird.

Sobald aber nur die geringste Unsicherheit besteht, sollte man von With die Finger lassen.
Der Gewinn von Zeit im Mikrosekundenbereich ist es einfach nicht wert.

Patito 29. Mär 2011 13:43

AW: Auf Inhalt zur Laufzeit erzeugter Komponenten zugreifen
 
Von With-statements sollte man bekanntlich grundsätzlich die Finger lassen.
Von dem Beispiel aus der Delphi 2009 Hilfe kriegt man ja ganz blutige Augen... Aua!

Ausserdem sieht oben im Code die Verwendung von FindComponent() noch ein wenig nach
einer zweiten Sollbruchstelle aus. Normalerweise sollte man Objekte über vernünftige Objekt-Referenzen
verwalten. Zur Laufzeit mit Objekt-Namen herumzuhantieren sieht immer etwas amateurhaft aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.
Seite 1 von 2  1 2      

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