2013-02-07 18 views
9

Phiên bản Application được tạo ở đâu và khi nào? (Tương tự với trường hợp Screen).Trường hợp và khi nào ứng dụng (TApplication) được tạo ra?

Tôi không thấy gì trong phần Forms hoặc Systeminitialization.
Trong cửa sổ CPU trước Application.Initialize, tôi thấy một cuộc gọi đến @_InitExe (SysInit) - dẫn đến _StartExe (Hệ thống) và toàn bộ mã asm - Không tạo được trường hợp Application.

Tôi thiếu gì ở đây?

Trả lời

12

Thật dễ dàng để làm việc này từ mã. Bạn chỉ cần thực hiện tìm kiếm văn bản cho TApplication.Create. Ví dụ sử dụng tính năng Tìm trong tập tin của IDE.

Nhưng bạn luôn có thể lười biếng và yêu cầu trình gỡ lỗi thực hiện.

  1. Bật DCU gỡ lỗi.
  2. Đặt điểm ngắt tại TApplication.Create.
  3. Chạy.

Khi chương trình bị hỏng, hãy nhìn vào ngăn xếp cuộc gọi. Bạn sẽ thấy rằng đối tượng TApplication được khởi tạo từ InitControls trong đơn vị Controls. Và InitControls được gọi từ phần initialization của đơn vị Controls.

Cuộc gọi đầy đủ ngăn xếp cho một ứng dụng vani VCL đồng bằng trông như thế này:

 
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 

Làm điều tương tự với TScreen.Create, bạn sẽ thấy rằng đối tượng TScreen cũng được thuyết minh trong InitControls().

Tôi sẽ không cố gắng giải thích tất cả những điều này. Tôi nghĩ có đủ thông tin và lời khuyên ở đây để bạn có thể làm việc đó từ đây. Mặc dù đây là ngăn xếp cuộc gọi từ một ứng dụng XE3, nó sẽ trông giống hệt cho ứng dụng Delphi 5 của bạn.

+3

Làm cho tôi tự hỏi tại sao ứng dụng được khai báo trong đơn vị hình thức ở nơi đầu tiên (Điều khiển sử dụng hình thức, hình thức sử dụng Controls) .. – kobik

+0

Điều khiển chỉ sử dụng Biểu mẫu đang triển khai. TApplication phải được khai báo cao hơn TForm vì nó đề cập đến TForm trong phần giao diện của nó. –

10

Ví dụ ứng dụng được tạo trong thủ tục InitControls của đơn vị Vcl.Controls.pas.

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

InitControls được gọi là trong phần khởi tạo của đơn vị giống nhau:

initialization 
  ... 
  InitControls; 
Các vấn đề liên quan