È 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.
- Abilita debug DCU.
- Impostare un punto di interruzione in
TApplication.Create
.
- 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.
fonte
2013-02-07 17:37:09
mi domando il motivo per cui applicazione viene dichiarata in unità di forme, in primo luogo (Controlli ricorre a forme, forme utilizza controlli) .. – kobik
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. –