Einzelnen Beitrag anzeigen

Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Instanzieren von Komponenten

  Alt 27. Mai 2007, 14:00
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;
  Mit Zitat antworten Zitat