2013-02-07 13 views
9

Gdzie i kiedy tworzona jest instancja Application? (To samo dotyczy instancji Screen).Gdzie i kiedy tworzona jest instancja aplikacji (TApplication)?

Nie widzę niczego w sekcji Forms lub Systeminitialization.
W oknach procesorów przed Application.Initialize, widzę wywołanie @_InitExe (SysInit) - które prowadzi do _StartExe (System) i wiele kodu asm - Który nie tworzy instancji Application, o ile mogę powiedzieć.

Czego mi tu brakuje?

Odpowiedz

12

Jest to dość łatwe do zrozumienia tego z kodu. Wystarczy wyszukać tekst za TApplication.Create. Na przykład za pomocą funkcji Znajdź w plikach IDE.

Ale zawsze można być leniwym i uruchomić debugger.

  1. Włącz debugowanie DCU.
  2. Ustaw punkt przerwania w TApplication.Create.
  3. Uruchom.

Kiedy program się zepsuje, spójrz na stos wywoławczy. Zobaczysz, że obiekt TApplication jest tworzony od InitControls w jednostce Controls. I InitControls jest wywoływane z sekcji initialization jednostki Controls.

Pełne stos nabór zwykły waniliowy aplikacji VCL wygląda następująco:

 
Vcl.Forms.TApplication.Create(nil) 
Vcl.Controls.InitControls 
Vcl.Controls.Vcl.Controls 
System.InitUnits 
System._StartExe(???,???) 
SysInit._InitExe($5A81BC) 
Project1.Project1 
:749933aa kernel32.BaseThreadInitThunk + 0x12 
:76f09ef2 ntdll.RtlInitializeExceptionChain + 0x63 
:76f09ec5 ntdll.RtlInitializeExceptionChain + 0x36 

robi to samo z TScreen.Create, widać, że obiekt TScreen również wystąpienia w InitControls().

Nie będę starał się wyjaśniać tego wszystkiego. Sądzę, że jest tu wystarczająco dużo informacji i porad, abyś mógł to wszystko opracować. Chociaż jest to stos wywołań z aplikacji XE3, będzie wyglądać tak samo dla twojej aplikacji Delphi 5.

+3

Sprawia, że ​​zastanawiam się, dlaczego Aplikacja została zadeklarowana w postaci jednostkowych na pierwszym miejscu (Kontrola używa Formularze, Formularze wykorzystuje kontrole) .. . – kobik

+0

Sterowanie używa tylko formularzy w implementacji. TApplication musi być deklarowane wyżej niż TForm, ponieważ odnosi się do TForm w sekcji interfejsu. –

10

Instancja aplikacji jest tworzona w procedurze InitControls jednostki Vcl.Controls.pas.

procedure InitControls; 
begin 
... 
    Application := TApplication.Create(nil); 
... 

InitControls nazywa się w sekcji inicjalizacji tej samej jednostki:

initialization 
  ... 
  InitControls; 
Powiązane problemy