delphi应用代码执行的过程和步骤
第1步:加载LApp应用程序的项目单元并执行LApp
program LApp;
// 1.1 加载引用单元:
uses
System.StartUpCopy,
FMX.Forms,
MasterDetail in 'MasterDetail.pas' {MasterDetailForm};// 1.2 加载引用单元:
{$R *.res}
// 1.3 定义应用程序级别的变量、类或方法、函数等:
type TaClass = class //:或: type TaClass = TObject //: 需在上面引用sysytem的相关单元
private
{ Private declarations }
public
{ Public declarations }
end;
var LApp2:Integer;
procedure global1;
implementation
procedure global1;
begin // ...
end; begin
// 1.4 LApp应用程序初始化前要执行的代码 ,比如:
ReportMemoryLeaksOnShutdown := True; //:内存泄漏报警
if WebRequestHandler <> nil then WebRequestHandler.WebModuleClass := WebModuleClass; //:初始化类(如果有的话)
再如,需要的话:
// uses System.SysUtils 系统时间截格式设定 及货币格式 :
///TFormatSettings.create(LANG_CHINESE);
// 设置WINDOWS系统的短日期的格式:
{$IFDEF MSWINDOWS}
SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd');
//SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SLONGDATE, 'yyyy-MM-dd');
{$ENDIF MSWINDOWS}
//Application.UpdateFormatSettings := False; //UpdateFormatSettings 失效
// 设定程序本身所使用的日期时间格式: 毫秒格式符.ms
with FormatSettings do
begin
ShortDateFormat := 'yyyy-mm-dd';
LongDateFormat := 'yyyy-mm-dd';
ShortTimeFormat := 'hh:nn:ss';
LongTimeFormat := 'hh:nn:ss.zzz'; //长时间: 毫秒.ms
//LongTimeFormat := 'hh:nn:ss.ms'; //长时间: 毫秒.ms
DateSeparator := '-';
TimeSeparator := ':';
end;
// 1.5 LApp应用程序初始化
Application.Initialize;
// 1.6 LApp应用程序产生你指定的应用主窗体
Application.CreateForm(TMasterDetailForm, MasterDetailForm);
// 1.7 LApp应用程序运行并执行你指定的应用主窗体(假设窗体单名元名为main,实例名为fmxMain)
Application.Run;
end.
第2步:加载应用主窗体
unit main;
2.1 执行窗体的接口及引用的单元:
interface
uses
System.SysUtils, System.Types,
System.UITypes, System.Classes,
System.Variants,
System.Math,
System.StrUtils
//...
;
2.2 定义该窗体的类、变量、过程和方法:(如果有的话)
type
TfmxMain = class(TForm) //:定义本窗体类:必须
private
//...
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmxMain: TfmxMain; // : 实例化该窗体类:必须
2.3 定义独立于窗体类的类、变量、过程和方法:(如果有的话),比如:
type
//...类
private
{ Private declarations }
public
{ Public declarations }
end;
///<summary>汉子首字缩进字符串FIntendCN:=DupeString(#32,8);</summary>
///<remarks>DupeString:将字符串重复N次:uses StrUtils;</remarks>
var FIntendCN:string; //:...变量
var FlblName,FlblTitle:TStrings;
procedure Init; //:...方法或函数
// 2.4的代码应当写在窗体类的任何代码的最后,但它先于窗体类的任何代码执行:
2.4 执行应用主窗体的initialization部分的代码:与窗体类无关的代码(如果有的话)
initialization
//:初始化与窗体类无关的代码
//:执行窗体类执行前的包括FormCreate:
FIntendCN:=DupeString(#32,8);
FlblName:=nil; FlblTitle:=nil;
Init;
ShowMessage('第2.4步单元初始化initialization开始画:在主窗体FormCreate并因此显示出来之前');
// 2.5的代码应当写在该窗体的最后,且它滞后于窗体类的任何代码执行
2.5 执行应用主窗体的finalization部分的代码:与窗体类无关的代码(如果有的话)
finalization
//:结束与窗体类无关的代码:
FlblName.Free;
FlblTitle.Free;
end. //:结束窗体的执行
2.6 执行应用主窗体的FormCreate代码:
procedure TfmxMain.FormCreate(Sender: TObject);
begin
FlblName:=TStringList.Create;
FlblTitle:=TStringList.Create;
Memo1.Lines.Add('第2.6步窗体Form初始化FormCreate开始画');
end;
2.7 执行应用主窗体的FormShow代码:
procedure TfmxMain.FormShow(Sender: TObject);
begin
Memo1.Lines.Add('第2.7步窗体FormShow开始画');
end;
2.8 执行应用主窗体的FormPaint代码:
procedure TfmxMain.FormPaint(
Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
Memo1.Lines.Add('第2.8步才会执行窗体自身开始画');
end;
2.9 执行应用主窗体中的组件OnPaint代码:
procedure TfmxMain.ListView1Paint(
Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
Memo1.Lines.Add('第2.9步才会开始画窗体内的组件');
end;
演示一下:窗体消息的传递:
在窗体还未显示出来之前:
点确定后: