Delphi-PRAXiS

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 Instanzieren von Komponenten (https://www.delphipraxis.net/92846-instanzieren-von-komponenten.html)

Jelly 27. Mai 2007 14:00


Instanzieren von Komponenten
 
Mich beschäftigt grad eine Frage.

Wo im Code werden eigentlich Komponenten bei Ausführung des Programm erzeugt. Ich meine, ich lege irgendein Control zur Design Time auf ein Formular. Von der Klasse muss ja irgendwann zur Laufzeit eine Instanz erstellt werden, und ich denke auch die Stele gefunden zu haben, nämlich der Constructor von TWinControl, wo ein MakeObjectInstances aus der Unit Classes aufgerufen wird. Dazu hier mal der Code. Aber verstehen tu ich den nicht. Also was passiert da im Hintergrund:
Delphi-Quellcode:
function MakeObjectInstance(Method: TWndMethod): Pointer;
const
  BlockCode: array[1..2] of Byte = (
    $59,      { POP ECX }
    $E9);     { JMP StdWndProc }
  PageSize = 4096;
var
  Block: PInstanceBlock;
  Instance: PObjectInstance;
begin
  if InstFreeList = nil then
  begin
    Block := VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Block^.Next := InstBlockList;
    Move(BlockCode, Block^.Code, SizeOf(BlockCode));
    Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdWndProc));
    Instance := @Block^.Instances;
    repeat
      Instance^.Code := $E8; { CALL NEAR PTR Offset }
      Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code);
      Instance^.Next := InstFreeList;
      InstFreeList := Instance;
      Inc(Longint(Instance), SizeOf(TObjectInstance));
    until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock);
    InstBlockList := Block;
  end;
  Result := InstFreeList;
  Instance := InstFreeList;
  InstFreeList := Instance^.Next;
  Instance^.Method := Method;
end;

jbg 27. Mai 2007 14:06

Re: Instanzieren von Komponenten
 
Zitat:

Zitat von Jelly
Wo im Code werden eigentlich Komponenten bei Ausführung des Programm erzeugt. Ich meine, ich lege irgendein Control zur Design Time auf ein Formular. Von der Klasse muss ja irgendwann zur Laufzeit eine Instanz erstellt werden, und ich denke auch die Stele gefunden zu haben

Das ist gewiss nicht die Stelle, wo die Controls erzeugt werden. Die werden vom TReader beim Einlesen der DFM-Ressource erzeugt. MakeObjectInstance erzeugt "nur" einen WindowProc Stub, der die WindowProc an eine WndProc einer Objekt-Instance bindet.

Jelly 27. Mai 2007 14:24

Re: Instanzieren von Komponenten
 
Zitat:

Zitat von jbg
Die werden vom TReader beim Einlesen der DFM-Ressource erzeugt.

Und wo passiert das. Hab mich jetzt mal bischen durch die ganzen constructors gewühlt, und nichts dazu gefunden. Neben dem Instanzieren passiert ja wohl noch mehr, denn die ganzen published properties die zur Designstime im OI gesetzt werden, müssen zur Laufzeit ja auch eingelesen werden.
Zitat:

Zitat von jbg
MakeObjectInstance erzeugt "nur" einen WindowProc Stub, der die WindowProc an eine WndProc einer Objekt-Instance bindet.

OK, dem war mir nicht bekannt.

jbg 27. Mai 2007 14:47

Re: Instanzieren von Komponenten
 
Zitat:

Zitat von Jelly
Und wo passiert das. Hab mich jetzt mal bischen durch die ganzen constructors gewühlt, und nichts dazu gefunden.

Na dann schau mal in der Forms.pas nach TCustomForm.Create(). Und dort insbesondere den Aufruf der Funktion InitInheritedComponent() und alles was diese Funktion wiederum aufruft.

Jelly 27. Mai 2007 15:02

Re: Instanzieren von Komponenten
 
Alles klar, jetzt hab wirds klarer. Vielen Dank :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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