Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Es funktioniert, und ich verstehe nicht warum o.O (https://www.delphipraxis.net/171330-es-funktioniert-und-ich-verstehe-nicht-warum-o-o.html)

Memnarch 31. Okt 2012 21:47

Es funktioniert, und ich verstehe nicht warum o.O
 
NAbend,
Also aufgrund eines versehens etwas komisches festgestellt.

Ich habe eine Form TMainForm. Dann habe ich meinem Projekt ein Datenmodul(TIDEActions genannt, name = IDEActions) hinzugefügt. Selbiges beinhaltet eine actionlist mit allen actions und properties die AUf Objectinstanzen verweisen, die extern zugewiesen werden. Das datenmodul ist aus dem Autocreate rausgenommen. Die globale variable die in TIDEActions generiert wurde(IDEActions) habe ich gelöscht, weil ich keine globale instanz wollte.

Meine MainForm besitzt eine private Feldvariable FIdeActions vom typ TIDEActions.
Diese wird im Constructor erstellt und Properties gesetzt.(Dabei handelt es sich um instanzen anderer klassen).

SO und jetzt wirds merkwürdig:

Ich kann auf der MainForm im Formeditor trotzdem bei buttons im ActionFeld

IDEActions.MeineAction

anwählen UND zur laufzeit wird die TIDEActions instanz genommen die ich in meiner feldvariable FIDEActions hinterlegt habe.

HÄ?!

In meinem kopf sagt eine stimme "Kann gar nicht sein". WOher nimmt Delphi die richtige instanz? Müsste das nicht ne NIL pointer exception geben? Ich kann alles völlig normal nutzen.

Jemand ne erklärung?

BUG 31. Okt 2012 22:00

AW: Es funktioniert, und ich verstehe nicht warum o.O
 
Ich würde es mir so erklären: Im OI weist du nur eine Referenz auf FIdeActions zu, so dass der Inhalt dieser Variablen dann benutzt wird (der dann nicht nil ist).

Vielleicht weiß ja jemand, wie es wirklich funktioniert :mrgreen:

Memnarch 31. Okt 2012 22:14

AW: Es funktioniert, und ich verstehe nicht warum o.O
 
Denkfehler an der sache: der OI hat keine infos über privat feldvariablen :|

Uwe Raabe 31. Okt 2012 23:41

AW: Es funktioniert, und ich verstehe nicht warum o.O
 
Wenn ich dich richtig verstanden habe, kann ich das erklären. Beim Laden eines Forms werden am Schluß alle Referenzen auf andere Komponenten aufgelöst, wobei der Name der Komponente das Kriterium ist. Zunächst wird in der aktuellen Komponente (dem Form) nach untergeordneten Komponenten gesucht. Danach wird die Suche global ausgeweitet. Bei der globalen Suche werden alle Forms und alle DataModules einbezogen, die sich Screen.Forms und Screen.DataModules registrieren.

Wenn du beim erzeugen des DataModules das Form als Owner angegeben hast, wird es als lokale Komponente gefunden. Andernfalls über die globale Suche.

Es spielt also keine Rolle, wo die Instanz-Variable eines DataModules deklariert ist und ob überhaupt eine existiert. Diese Variablen dienen wie deine Feld-Instanz nur dazu, daß du in deinem Source-Code darauf zugreifen kannst. Das Ganze würde auch funktionieren, wenn du das Datenmodul einfach nur erzeugst, ohne es einer Variablen zuzuweisen.

Memnarch 1. Nov 2012 13:44

AW: Es funktioniert, und ich verstehe nicht warum o.O
 
Hui, klasse automatismus :)


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