[GELÖST] Komponenten zur Laufzeit erzeugen und bennen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

[GELÖST] Komponenten zur Laufzeit erzeugen und bennen

Beitrag von compmgmt »

Ich hätte mal eine Frage. Ich habe in meinem Programm mehrere dynamisch erzeugte Objekte vom Typ TImage. Wenn ich diese mit "Name" bennen möchte, kann ich diese später nciht mit diesem Namen aufrufen und habe beim Debuggen festgestellt, dass der Name leer ist.

Code: Alles auswählen

var
	NewObj: TImage;
begin
	NewObj := TImage.Create(self);
	// Image, Events usw. festlegen
	NewObj.Name := 'Irgendetwas';
end;
Wenn ich jetzt allerdings die vorher angegeben OnClick-Prozedur aufrufe, ist der Wert (Sender as TImage).Name $0. Das heißt, dass der Name nicht übertragen wird. Weiß jemand wieso das so ist bzw. wie man das umgehen kann?

Vielen Dank für eine Antwort im Vorraus
compmgmt

NACHTRAG:
Problem gelöst. Wie immer, war es meine eigene Dummheit ^^ . Ich habe Name := statt NewObj.Name := angegeben. Aua! Meine eigene Dummheit tut mir schon weh!

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: [Problem] Komponenten zur Laufzeit erzeugen und bennen

Beitrag von wp_xyz »

Der Variablenname und der "Name" einer Komponente haben primär nichts miteinander zu tun. Am wichtigsten ist der Variablenname, NewObj in deinem Beispiel. Unter diesem Bezeichner sprichst du die Instanz der Klasse in deinem Code an. Das Feld "Name" einer laufzeit-generierten Instanz kann dagegen leer sein. Er wird nur wichtig zur Entwurfszeit, weil daraus der Variablenname generiert wird. Falls du trotzdem diesen Namen verwenden willst, musst du die Instanz erst mit "FindComponent(name)" suchen.

Code: Alles auswählen

procedure TForm1.IrgendeineMethode;
var
  NewObj: TImage;
  gesucht: TComponent;
begin
  NewObj := TImage.Create(self);
  NewObj.Name := 'Irgendwas';
  gesucht := FindComponent('Irgendwas');
  if gesucht <> NewObj then
    ShowMessage('Hier ist etwas faul');

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: [Problem] Komponenten zur Laufzeit erzeugen und bennen

Beitrag von compmgmt »

wp_xyz hat geschrieben:Falls du trotzdem diesen Namen verwenden willst, musst du die Instanz erst mit "FindComponent(name)" suchen.
Das wusste ich ja schon. Mein Problem war eben nur ein kleiner Leichtsinnsfehler. Ich hatte aus irgendeinem dummen Grund Das Objekt vergessen anzugeben.

Aber trotzdem dankeschön :D

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten