2013-02-07 25 views
9

Dove e quando viene creata l'istanza Application? (lo stesso vale per l'istanza Screen).Dove e quando viene creata l'istanza dell'applicazione (TApplicazione)?

Non vedo nulla nella sezione Forms o Systeminitialization.
Nelle finestre CPU prima di Application.Initialize, vedo una chiamata a @_InitExe (sysinit) - che porta a _StartExe (System) e un sacco di asm codice - che non crea l'istanza Application per quanto posso dire.

Cosa mi manca qui?

risposta

12

È abbastanza semplice risolvere questo problema dal codice. Basta fare una ricerca testuale per TApplication.Create. Ad esempio, utilizzando la funzione Trova nei file IDE.

Ma puoi sempre essere pigro e ottenere il debugger per farlo.

  1. Abilita debug DCU.
  2. Impostare un punto di interruzione in TApplication.Create.
  3. Esegui.

Quando il programma si interrompe, guarda lo stack di chiamate. Si vedrà che l'oggetto TApplication viene istanziato da InitControls nell'unità Controls. E InitControls viene chiamato dalla sezione initialization dell'unità Controls.

Lo stack di chiamate completa per un plain vanilla VCL app assomiglia a questo:

 
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 

Fare la stessa cosa con TScreen.Create, si vedrà che l'oggetto TScreen è anche un'istanza in InitControls().

Non cercherò di spiegare tutto questo. Penso che ci siano abbastanza informazioni e consigli per far funzionare tutto da qui. Sebbene questo sia lo stack di chiamate da un'applicazione XE3, sembrerà lo stesso per l'applicazione Delphi 5.

+3

mi domando il motivo per cui applicazione viene dichiarata in unità di forme, in primo luogo (Controlli ricorre a forme, forme utilizza controlli) .. – kobik

+0

Controlli utilizza solo moduli in fase di implementazione. TApplication deve essere dichiarato più alto di TForm poiché si riferisce a TForm nella sua sezione di interfaccia. –

10

L'istanza dell'applicazione viene creata nella procedura InitControls dell'unità Vcl.Controls.pas.

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

InitControls è chiamato nella sezione di inizializzazione della stessa unità:

initialization 
  ... 
  InitControls;