精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Delphi XE2對話框實現源碼分析

開發 開發工具
本文將給大家分析Delphi XE2對話框的實現源碼,分析ShowMessage,MessageBox等對話框運行原理,希望能幫助你理解Delphi。

  在這篇文章中,我將大概的從Delphi XE2 的Dialogs單元入手,分析ShowMessage,MessageBox等對話框運行原理,希望能幫助你理解Delphi,不求你愛上她,只求讓你能快速地解決問題。

  跟蹤代碼

  為了了解這些對話框的運行原理,我們需要跟蹤進源代碼中去,為此,你需要做如下設置

  1. 簡單創建一個使用了ShowMessage的VCL應用程序

  1.   unit Unit1;  
  2.   interface 
  3.   uses  
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  5.   Dialogs, StdCtrls;  
  6.   type  
  7.   TForm1 = class(TForm)  
  8.   Edit1: TEdit;  
  9.   Button1: TButton;  
  10.   procedure Button1Click(Sender: TObject);  
  11.   private 
  12.   { Private declarations }  
  13.   public 
  14.   { Public declarations }  
  15.   end;  
  16.   var  
  17.   Form1: TForm1;  
  18.   implementation  
  19.   {$R *.dfm}  
  20.   procedure TForm1.Button1Click(Sender: TObject);  
  21.   begin  
  22.   ShowMessage(Edit1.Text);  
  23.   MessageBox(Self.Handle,PChar(Edit1.Text),PChar(Application.Title),  
  24.   MB_ICONINFORMATION or MB_OK);  
  25.   MessageDlg(Edit1.Text,mtInformation,[mbOK,mbCancel],0);  
  26.   end;  
  27.   end.  
  28.   DFM文件代碼:  
  29.   object Form1: TForm1  
  30.   Left = 0  
  31.   Top = 0  
  32.   Caption = 'Form1' 
  33.   ClientHeight = 243  
  34.   ClientWidth = 472  
  35.   Color = clBtnFace  
  36.   Font.Charset = DEFAULT_CHARSET  
  37.   Font.Color = clWindowText  
  38.   Font.Height = -11  
  39.   Font.Name = 'Tahoma' 
  40.   Font.Style = []  
  41.   OldCreateOrder = False  
  42.   PixelsPerInch = 96  
  43.   TextHeight = 13  
  44.   object Edit1: TEdit  
  45.   Left = 128  
  46.   Top = 72  
  47.   Width = 209  
  48.   Height = 21  
  49.   TabOrder = 0  
  50.   TextHint = 'Message here' 
  51.   end  
  52.   object Button1: TButton  
  53.   Left = 192  
  54.   Top = 120  
  55.   Width = 75  
  56.   Height = 25  
  57.   Caption = 'Message box' 
  58.   TabOrder = 1  
  59.   OnClick = Button1Click  
  60.  end  
  61.   end 

  2. 在29行里設置一個斷點, 再在Edit里輸入一些內容,按下Message Box按鈕, 按F7跟蹤到Dialogs單元, 經過一段時間的仔細跟蹤, 你會發現程序運行到下面一段代碼:

  1.   function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType;  
  2.   Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;  
  3.   const HelpFileName: string): Integer;  
  4.   begin  
  5.   if (Win32MajorVersion >= 6) and UseLatestCommonDialogs and ThemeServices.ThemesEnabled then  
  6.   Result := DoTaskMessageDlgPosHelp('', Msg, DlgType, Buttons,  
  7.   HelpCtx, X, Y, HelpFileName)  
  8.   else 
  9.   Result := DoMessageDlgPosHelp(CreateMessageDialog(Msg, DlgType, Buttons),  
  10.   HelpCtx, X, Y, HelpFileName);  
  11.   end; 

  函數MessageDlgPosHelp指出, 如果當前系統是Vista,sever2008或以上版本的系統,那就調用DoTaskMessageDlgPosHelp函數進行對話框顯示, 否則調用DoMessageDlgPosHelp顯示對話框. 繼續跟蹤DoTaskMessageDlgPosHelp函數, 你會發現如下一段代碼:

  1.   function TCustomTaskDialog.DoExecute(ParentWnd: HWND): Boolean;  
  2.   const  
  3.   CTaskDlgFlags: array[TTaskDialogFlag] of Cardinal = (  
  4.   TDF_Enable_Hyperlinks, TDF_Use_Hicon_Main,  
  5.   tdf_Use_Hicon_Footer, TDF_ALLOW_DIALOG_CANCELLATION,  
  6.   TDF_USE_COMMAND_LINKS, TDF_USE_COMMAND_LINKS_NO_ICON,  
  7.   TDF_EXPAND_FOOTER_AREA, TDF_EXPANDED_BY_DEFAULT,  
  8.   TDF_VERIFICATION_FLAG_CHECKED, TDF_SHOW_PROGRESS_BAR,  
  9.   TDF_SHOW_MARQUEE_PROGRESS_BAR, TDF_CALLBACK_TIMER,  
  10.   TDF_POSITION_RELATIVE_TO_WINDOW, TDF_RTL_LAYOUT,  
  11.   TDF_NO_DEFAULT_RADIO_BUTTON, TDF_CAN_BE_MINIMIZED);  
  12.   CTaskDlgCommonButtons: array[TTaskDialogCommonButton] of Cardinal = (  
  13.   TDCBF_OK_BUTTON, TDCBF_YES_BUTTON, TDCBF_NO_BUTTON,  
  14.   TDCBF_CANCEL_BUTTON, TDCBF_RETRY_BUTTON, TDCBF_CLOSE_BUTTON);  
  15.   CTaskDlgDefaultButtons: array[TTaskDialogCommonButton] of Integer = (  
  16.   IDOK, IDYES, IDNO, IDCANCEL, IDRETRY, IDCLOSE);  
  17.   var  
  18.   LWindowList: TTaskWindowList;  
  19.   LModalResult: Integer;  
  20.   LRadioButton: Integer;  
  21.   LFlag: TTaskDialogFlag;  
  22.   LFocusState: TFocusState;  
  23.   LVerificationChecked: LongBool;  
  24.   LTaskDialog: TTaskDialogConfig;  
  25.   LCommonButton: TTaskDialogCommonButton;  
  26.   begin  
  27.   if Win32MajorVersion <6 then  
  28.   raise EPlatformVersionException.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SWindowsVistaRequired, [ClassName]);  
  29.   if not ThemeServices.ThemesEnabled then  
  30.   raise Exception.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SXPThemesRequired, [ClassName]);  
  31.   {$IF NOT DEFINED(CLR)}  
  32.   FillChar(LTaskDialog, SizeOf(LTaskDialog), 0);  
  33.   {$IFEND}  
  34.   with LTaskDialog do  
  35.   begin  
  36.   // Set Size, Parent window, Flags  
  37.  cbSize :SizeOf(LTaskDialog);  
  38.  hwndParent :ParentWnd;  
  39.   dwFlags :0;  
  40.   for LFlag :Low(TTaskDialogFlag) to High(TTaskDialogFlag) do  
  41.   if LFlag in FFlags then  
  42.   dwFlags :dwFlags or CTaskDlgFlags[LFlag];  
  43.  // Set CommonButtons  
  44.   dwCommonButtons :0;  
  45.   for LCommonButton :Low(TTaskDialogCommonButton) to High(TTaskDialogCommonButton) do  
  46.   if LCommonButton in FCommonButtons then  
  47.   dwCommonButtons :dwCommonButtons or CTaskDlgCommonButtons[LCommonButton];  
  48.   // Set Content, MainInstruction, Title, MainIcon, DefaultButton  
  49.   if FText <>'' then  
  50.   pszContent := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FText));  
  51.   if FTitle <>'' then  
  52.   pszMainInstruction := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FTitle));  
  53.   if FCaption <>'' then  
  54.   pszWindowTitle := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FCaption));  
  55.   if tfUseHiconMain in FFlags then  
  56.   hMainIcon :FCustomMainIcon.Handle  
  57.   else  
  58.   begin  
  59.   if FMainIcon in [tdiNone..tdiShield] then  
  60.   pszMainIcon :LPCWSTR(CTaskDlgIcons[FMainIcon])  
  61.   else  
  62.   pszMainIcon :LPCWSTR(MakeIntResourceW(Word(FMainIcon)));  
  63.   end;  
  64.   nDefaultButton :CTaskDlgDefaultButtons[FDefaultButton];  
  65.   // Set Footer, FooterIcon  
  66.   if FFooterText <>'' then  
  67.   pszFooter := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FFooterText));  
  68.   if tfUseHiconFooter in FFlags then  
  69.   hFooterIcon :FCustomFooterIcon.Handle  
  70.   else  
  71.   begin  
  72.   if FFooterIcon in [tdiNone..tdiShield] then  
  73.   pszFooterIcon :LPCWSTR(CTaskDlgIcons[FFooterIcon])  
  74.   else  
  75.   pszFooterIcon :LPCWSTR(MakeIntResourceW(Word(FFooterIcon)));  
  76.   end;  
  77.   // Set VerificationText, ExpandedInformation, CollapsedControlText  
  78.   if FVerificationText <>'' then  
  79.   pszVerificationText := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FVerificationText));  
  80.   if FExpandedText <>'' then  
  81.   pszExpandedInformation := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FExpandedText));  
  82.   if FExpandButtonCaption <>'' then  
  83.   pszCollapsedControlText := {$IFNDEF CLR}PWideChar{$ENDIF}(WideString(FExpandButtonCaption));  
  84.   // Set Buttons  
  85.   cButtons :FButtons.Count;  
  86.   if cButtons >0 then  
  87.   pButtons :FButtons.Buttons;  
  88.   if FButtons.DefaultButton <>nil then  
  89.   nDefaultButton :FButtons.DefaultButton.ModalResult;  
  90.   // Set RadioButtons  
  91.   cRadioButtons :FRadioButtons.Count;  
  92.   if cRadioButtons >0 then  
  93.   pRadioButtons :FRadioButtons.Buttons;  
  94.   if not (tfNoDefaultRadioButton in FFlags) and (FRadioButtons.DefaultButton <>nil) then  
  95.   nDefaultRadioButton :FRadioButtons.DefaultButton.ModalResult;  
  96.   // Prepare callback  
  97.   {$IF DEFINED(CLR)}  
  98.   pfCallBack := @CallbackProc;  
  99.   {$ELSE}  
  100.   lpCallbackData :LONG_PTR(Self);  
  101.   pfCallback := @TaskDialogCallbackProc;  
  102.   {$IFEND}  
  103.   end;  
  104.   LWindowList :DisableTaskWindows(ParentWnd);  
  105.   LFocusState :SaveFocusState;  
  106.   try  
  107.   Result :TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult,  
  108.   {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK;  
  109.   FModalResult :LModalResult;  
  110.   if Result then  
  111.   begin  
  112.   FButton :TTaskDialogButtonItem(FButtons.FindButton(FModalResult));  
  113.   FRadioButton :TTaskDialogRadioButtonItem(FRadioButtons.FindButton(LRadioButton));  
  114.   if LVerificationChecked then  
  115.   Include(FFlags, tfVerificationFlagChecked)  
  116.   else  
  117.   Exclude(FFlags, tfVerificationFlagChecked);  
  118.   end;  
  119.   finally  
  120.   EnableTaskWindows(LWindowList);  
  121.   SetActiveWindow(ParentWnd);  
  122.   RestoreFocusState(LFocusState);  
  123.   end;  
  124.   end; 

  上面這段代碼在Dialogs單元的第5407行, 該函數先進行可用性判斷, 然后填充

  LTaskDialog: TTaskDialogConfig;

  一個TTaskDialogConfig的結構體, 該結構體定義在CommCtrl單元第9550行, 其定義如下:

  1.   type  
  2.   { $EXTERNALSYM TASKDIALOGCONFIG}  
  3.   TASKDIALOGCONFIG = packed record  
  4.   cbSize: UINT;  
  5.   hwndParent: HWND;  
  6.   hInstance: HINST; // used for MAKEINTRESOURCE() strings  
  7.   dwFlags: DWORD; // TASKDIALOG_FLAGS (TDF_XXX) flags  
  8.   dwCommonButtons: DWORD; // TASKDIALOG_COMMON_BUTTON (TDCBF_XXX) flags  
  9.   pszWindowTitle: LPCWSTR; // string or MAKEINTRESOURCE()  
  10.   case Integer of  
  11.   0: (hMainIcon: HICON);  
  12.   1: (pszMainIcon: LPCWSTR;  
  13.   pszMainInstruction: LPCWSTR;  
  14.   pszContent: LPCWSTR;  
  15.   cButtons: UINT;  
  16.   pButtons: PTaskDialogButton;  
  17.   nDefaultButton: Integer;  
  18.   cRadioButtons: UINT;  
  19.   pRadioButtons: PTaskDialogButton;  
  20.   nDefaultRadioButton: Integer;  
  21.   pszVerificationText: LPCWSTR;  
  22.   pszExpandedInformation: LPCWSTR;  
  23.   pszExpandedControlText: LPCWSTR;  
  24.   pszCollapsedControlText: LPCWSTR;  
  25.   case Integer of  
  26.   0: (hFooterIcon: HICON);  
  27.   1: (pszFooterIcon: LPCWSTR;  
  28.   pszFooter: LPCWSTR;  
  29.   pfCallback: TFTaskDialogCallback;  
  30.   lpCallbackData: LONG_PTR;  
  31.   cxWidth: UINT // width of the Task Dialog's client area in DLU's.  
  32.   // If 0, Task Dialog will calculate the ideal width.  
  33.   );  
  34.   );  
  35.   end;  
  36.   {$EXTERNALSYM _TASKDIALOGCONFIG}  
  37.   _TASKDIALOGCONFIG = TASKDIALOGCONFIG;  
  38.   PTaskDialogConfig = ^TTaskDialogConfig;  
  39.   TTaskDialogConfig = TASKDIALOGCONFIG

  該結構體其實是從MSDN里翻譯過來的, 定義在CommCtrl.h 頭文件里(需要Windows Vista, Windows Server 2008及以上版本, 我是用Windows 7 64位進行的測試), 詳細說明可以查看MSDN.

  TCustomTaskDialog.DoExecute 填充完LTaskDialog結構體后, 直接調用:

  1.   Result :TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult,  
  2.   {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK; 

  TaskDialogIndirect顯示對話框, TaskDialogIndirect定義在CommCtrl單元, 其代碼如下:

  1.   { Task Dialog }  
  2.   var  
  3.   _TaskDialogIndirect: function(const pTaskConfig: TTaskDialogConfig;  
  4.   pnButton: PInteger; pnRadioButton: PInteger;  
  5.   pfVerificationFlagChecked: PBOOL): HRESULT; stdcall;  
  6.   _TaskDialog: function(hwndParent: HWND; hInstance: HINST;  
  7.   pszWindowTitle: LPCWSTR; pszMainInstruction: LPCWSTR; pszContent: LPCWSTR;  
  8.   dwCommonButtons: DWORD; pszIcon: LPCWSTR; pnButton: PInteger): HRESULT; stdcall;  
  9.   function TaskDialogIndirect(const pTaskConfig: TTaskDialogConfig;  
  10.   pnButton: PInteger; pnRadioButton: PInteger; pfVerificationFlagChecked: PBOOL): HRESULT;  
  11.  begin  
  12.   if Assigned(_TaskDialogIndirect) then  
  13.  Result :_TaskDialogIndirect(pTaskConfig, pnButton, pnRadioButton,  
  14.   pfVerificationFlagChecked)  
  15.   else  
  16.   begin  
  17.   InitComCtl;  
  18.   Result :E_NOTIMPL;  
  19.   if ComCtl32DLL <>0 then  
  20.   begin  
  21.   @_TaskDialogIndirect :GetProcAddress(ComCtl32DLL, 'TaskDialogIndirect');  
  22.   if Assigned(_TaskDialogIndirect) then  
  23.   Result :_TaskDialogIndirect(pTaskConfig, pnButton, pnRadioButton,  
  24.   pfVerificationFlagChecked)  
  25.   end;  
  26.   end;  
  27.   end; 

  查看代碼知道, TaskDialogIndirect 直接調用ComCtrl32.Dll里的函數:TaskDialogIndirect 顯示對話框. 通過查詢MSDN了解TaskDialogIndirect API的用途與用法:

  The TaskDialogIndirectfunction creates, displays, and operates a task dialog. The task dialog contains application-defined icons, messages, title, verification check box, command links, push buttons, and radio buttons. This function can register a callback function to receive notification messages.

  函數TaskDialogIndirect 用于創建, 顯示, 運行一個任務對話框, 這個任務對話框可以包括由應用程序定義的圖標,消息,標題,復選框,按鈕,單選框. 該函數還可以接收一個回調函數用于接收通知信息

  看到這里你或許會問:

  如果我的系統是xp或其他低于Vista, server2008的系統呢? 由上文中可知, 如果是低版本的系統, 則調用DoMessageDlgPosHelp 函數進行對話框顯示, 調用代碼如下:

  1.   Result :DoMessageDlgPosHelp(CreateMessageDialog(Msg, DlgType, Buttons),  
  2.   HelpCtx, X, Y, HelpFileName);  
  3.   DoMessageDlgPosHelp代碼:  
  4.   function DoMessageDlgPosHelp(MessageDialog: TForm; HelpCtx: Longint; X, Y: Integer;  
  5.   const HelpFileName: string): Integer;  
  6.   begin  
  7.   with MessageDialog do  
  8.   try  
  9.   HelpContext :HelpCtx;  
  10.   HelpFile :HelpFileName;  
  11.   if X >= 0 then Left :X;  
  12.   if Y >= 0 then Top :Y;  
  13.   if (Y <0) and (X <0) then Position :poScreenCenter;  
  14.   Result :ShowModal;  
  15.   finally  
  16.   Free;  
  17.   end;  
  18.   end; 

  從DoMessageDlgPosHelp代碼中可見, 該函數只是簡單的將傳遞進來的TForm以模式窗口的形式顯示在指定的位置.

  下面是CreateMessageDialog代碼:

  1.   function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;  
  2.   Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn): TForm;  
  3.   const  
  4.   mcHorzMargin = 8;  
  5.   mcVertMargin = 8;  
  6.  mcHorzSpacing = 10;  
  7.   mcVertSpacing = 10;  
  8.   mcButtonWidth = 50;  
  9.   mcButtonHeight = 14;  
  10.   mcButtonSpacing = 4;  
  11.   var  
  12.   DialogUnits: TPoint;  
  13.   HorzMargin, VertMargin, HorzSpacing, VertSpacing, ButtonWidth,  
  14.   ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth,  
  15.   IconTextWidth, IconTextHeight, X, ALeft: Integer;  
  16.   B, CancelButton: TMsgDlgBtn;  
  17.   {$IF DEFINED(CLR)}  
  18.   IconID: Integer;  
  19.   {$ELSE}  
  20.   IconID: PChar;  
  21.   {$IFEND}  
  22.   TextRect: TRect;  
  23.   LButton: TButton;  
  24.   begin  
  25.   Result :TMessageForm.CreateNew(Application);  
  26.   with Result do  
  27.   begin  
  28.   BiDiMode :Application.BiDiMode;  
  29.   BorderStyle :bsDialog;  
  30.   Canvas.Font :Font;  
  31.   KeyPreview :True;  
  32.   PopupMode :pmAuto;  
  33.   Position :poDesigned;  
  34.   OnKeyDown :TMessageForm(Result).CustomKeyDown;  
  35.   DialogUnits :GetAveCharSize(Canvas);  
  36.   HorzMargin :MulDiv(mcHorzMargin, DialogUnits.X, 4);  
  37.   VertMargin :MulDiv(mcVertMargin, DialogUnits.Y, 8);  
  38.   HorzSpacing :MulDiv(mcHorzSpacing, DialogUnits.X, 4);  
  39.   VertSpacing :MulDiv(mcVertSpacing, DialogUnits.Y, 8);  
  40.   ButtonWidth :MulDiv(mcButtonWidth, DialogUnits.X, 4);  
  41.   for B :Low(TMsgDlgBtn) to High(TMsgDlgBtn) do  
  42.   begin  
  43.   if B in Buttons then  
  44.   begin  
  45.   if ButtonWidths[B] = 0 then  
  46.   begin  
  47.   TextRect :Rect(0,0,0,0);  
  48.   Windows.DrawText( canvas.handle,  
  49.   {$IF DEFINED(CLR)}  
  50.  ButtonCaptions[B], -1,  
  51.   {$ELSE}  
  52.   PChar(LoadResString(ButtonCaptions[B])), -1,  
  53.   {$IFEND}  
  54.   TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or  
  55.   DrawTextBiDiModeFlagsReadingOnly);  
  56.   with TextRect do ButtonWidths[B] :Right - Left + 8;  
  57.   end;  
  58.   if ButtonWidths[B] >ButtonWidth then  
  59.   ButtonWidth :ButtonWidths[B];  
  60.   end;  
  61.  end;  
  62.   ButtonHeight :MulDiv(mcButtonHeight, DialogUnits.Y, 8);  
  63.   ButtonSpacing :MulDiv(mcButtonSpacing, DialogUnits.X, 4);  
  64.   SetRect(TextRect, 0, 0, Screen.Width div 2, 0);  
  65.   DrawText(Canvas.Handle, Msg, Length(Msg)+1, TextRect,  
  66.   DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or  
  67.   DrawTextBiDiModeFlagsReadingOnly);  
  68.   IconID :IconIDs[DlgType];  
  69.   IconTextWidth :TextRect.Right;  
  70.   IconTextHeight :TextRect.Bottom;  
  71.   {$IF DEFINED(CLR)}  
  72.  if DlgType <>mtCustom then  
  73.   {$ELSE}  
  74.   if IconID <>nil then  
  75.   {$IFEND}  
  76.   begin  
  77.   Inc(IconTextWidth, 32 + HorzSpacing);  
  78.   if IconTextHeight <32 then IconTextHeight :32;  
  79.   end;  
  80.   ButtonCount :0;  
  81.   for B :Low(TMsgDlgBtn) to High(TMsgDlgBtn) do  
  82.   if B in Buttons then Inc(ButtonCount);  
  83.   ButtonGroupWidth :0;  
  84.   if ButtonCount <>0 then  
  85.   ButtonGroupWidth :ButtonWidth * ButtonCount +  
  86.   ButtonSpacing * (ButtonCount - 1);  
  87.   ClientWidth :Max(IconTextWidth, ButtonGroupWidth) + HorzMargin * 2;  
  88.   ClientHeight :IconTextHeight + ButtonHeight + VertSpacing +  
  89.   VertMargin * 2;  
  90.   Left := (Screen.Width div 2) - (Width div 2);  
  91.   Top := (Screen.Height div 2) - (Height div 2);  
  92.   if DlgType <>mtCustom then  
  93.   {$IF DEFINED(CLR)}  
  94.   Caption :Captions[DlgType] else  
  95.   Caption :Application.Title;  
  96.  if DlgType <>mtCustom then  
  97.   {$ELSE}  
  98.   Caption :LoadResString(Captions[DlgType]) else  
  99.   Caption :Application.Title;  
  100.  if IconID <>nil then  
  101.   {$IFEND}  
  102.   with TImage.Create(Result) do  
  103.   begin  
  104.   Name :'Image';  
  105.   Parent :Result;  
  106.   Picture.Icon.Handle :LoadIcon(0, IconID);  
  107.   SetBounds(HorzMargin, VertMargin, 32, 32);  
  108.  end;  
  109.   TMessageForm(Result).Message :TLabel.Create(Result);  
  110.   with TMessageForm(Result).Message do  
  111.   begin  
  112.   Name :'Message';  
  113.   Parent :Result;  
  114.   WordWrap :True;  
  115.   Caption :Msg;  
  116.   BoundsRect :TextRect;  
  117.   BiDiMode :Result.BiDiMode;  
  118.   ALeft :IconTextWidth - TextRect.Right + HorzMargin;  
  119.   if UseRightToLeftAlignment then  
  120.   ALeft :Result.ClientWidth - ALeft - Width;  
  121.   SetBounds(ALeft, VertMargin,  
  122.  TextRect.Right, TextRect.Bottom);  
  123.   end;  
  124.   if mbCancel in Buttons then CancelButton :mbCancel else  
  125.   if mbNo in Buttons then CancelButton :mbNo else  
  126.   CancelButton :mbOk;  
  127.   X := (ClientWidth - ButtonGroupWidth) div 2;  
  128.   for B :Low(TMsgDlgBtn) to High(TMsgDlgBtn) do  
  129.   if B in Buttons then  
  130.   begin  
  131.   LButton :TButton.Create(Result);  
  132.   with LButton do  
  133.   begin  
  134.   Name :ButtonNames[B];  
  135.   Parent :Result;  
  136.   {$IF DEFINED(CLR)}  
  137.   Caption :ButtonCaptions[B];  
  138.   {$ELSE}  
  139.   Caption :LoadResString(ButtonCaptions[B]);  
  140.   {$IFEND}  
  141.   ModalResult :ModalResults[B];  
  142.   if B = DefaultButton then  
  143.   begin  
  144.   Default :True;  
  145.   ActiveControl :LButton;  
  146.   end;  
  147.  if B = CancelButton then  
  148.   Cancel :True;  
  149.   SetBounds(X, IconTextHeight + VertMargin + VertSpacing,  
  150.   ButtonWidth, ButtonHeight);  
  151.   Inc(X, ButtonWidth + ButtonSpacing);  
  152.   if B = mbHelp then  
  153.   OnClick :TMessageForm(Result).HelpButtonClick;  
  154.   end;  
  155.   end;  
  156.   end;  
  157.   end; 

  由代碼可見, CreateMessageDialog只是創建了一個TMessageForm, 然后動態地添加了一些設置. 寫到這里或許可以解答一些人的問題: 對話框是不是一個窗口? 答案是:是.

  你還可能會問: 為什么對話框可以停留在那一行代碼直到用戶操作完畢后再往下執行, 這里就需要了解一下模態窗口的知識。

原文鏈接:http://www.cnblogs.com/neugls/archive/2011/09/14/2176733.html

【編輯推薦】

  1. Delphi與C#之父:技術理想架構開發傳奇
  2. Delphi 2010初體驗:徹底告別內存泄露
  3. 開發熱點周報:Delphi 2010出爐 mixin進駐JavaFX
  4. Delphi XE2將出 一場技術革命即將打響
  5. 9月TIOBE編程語言排行榜發布 Delphi東山再起

 

責任編輯:彭凡 來源: 博客園
相關推薦

2011-10-31 14:29:14

2011-09-05 14:16:44

Delphi XE2

2011-07-01 11:33:00

Qt 模態 非模態

2009-12-28 13:47:35

WPF對話框

2011-05-31 10:26:37

Android 對話框

2009-12-11 15:35:50

PHP彈出對話框

2009-12-28 14:32:31

WPF窗體對話框

2011-07-21 15:50:42

jQuery Mobi頁面對話框

2010-01-28 16:55:26

Android對話框

2009-10-20 14:05:42

VB.NET路徑

2009-12-29 15:24:48

WPF對話框

2010-01-11 09:33:32

VB.NET對話框調用

2011-11-23 09:47:36

Winform

2011-05-20 16:49:21

VB.NET

2011-07-22 15:32:53

iPhone 按鈕 對話框

2010-09-29 15:56:02

J2ME對話框

2025-01-03 11:16:38

2024-02-17 21:50:30

2010-01-22 16:27:19

VB.NET關于對話框

2011-06-02 10:37:02

Android 對話框
點贊
收藏

51CTO技術棧公眾號

精品少妇一区| www视频在线看| 日韩精品一区第一页| 在线观看不卡av| 久久久久久久久久毛片| 大香伊人中文字幕精品| 91色在线porny| 国产精品一二三视频| 国内偷拍精品视频| 三级精品视频| 日韩一区二区三区电影 | 捆绑凌虐一区二区三区| 成人看片网站| 亚洲大片在线观看| 国外成人在线视频网站| 中文字幕在线日亚洲9| 国一区二区在线观看| 亚洲人在线视频| 黄色av电影网站| 欧美v亚洲v综合v国产v仙踪林| 亚洲黄色免费电影| 欧美一区二区高清在线观看| www.欧美国产| 另类成人小视频在线| 97人人做人人爱| 99久久99久久精品免费| 精品国产导航| 欧美一三区三区四区免费在线看| 男人操女人免费软件| 羞羞网站在线看| 中文av字幕一区| 精品视频一区在线| 性色av蜜臀av| 黄色小说综合网站| 国产不卡视频在线| 国产情侣在线视频| 午夜日韩在线| 操日韩av在线电影| 夫妇交换中文字幕| 蜜桃一区二区三区| 精品电影一区二区三区| 男人的天堂最新网址| 免费观看亚洲| 动漫精品一区二区| 免费无码毛片一区二三区| 黄色一级大片在线免费看产| 国产精品区一区二区三| 欧美在线3区| 手机福利小视频在线播放| 国产精品99久| 91免费视频国产| 在线免费看毛片| 免费观看成人av| 国产精品露脸自拍| 中文字幕人成人乱码亚洲电影| 一区二区三区高清视频在线观看| 高清欧美电影在线| 久久9999久久免费精品国产| 午夜视频精品| 欧美激情一区二区三区在线视频观看| 丰满少妇高潮久久三区| 婷婷综合伊人| 欧美成人h版在线观看| 欧美丰满熟妇bbbbbb| 亚洲欧美综合| 久久男人av资源网站| 国产成人精品亚洲男人的天堂| 国产精品二区影院| 97精品国产aⅴ7777| 69成人免费视频| 久久狠狠婷婷| 国产精品久久久久久久一区探花| 中文字幕 日韩有码| 极品美女销魂一区二区三区| 91久久精品一区| 亚洲国产精品久久久久久6q| 成人v精品蜜桃久久一区| 国产一区免费视频| 裸体xxxx视频在线| 国产精品久久久久久久久免费桃花 | 欧美国产激情一区二区三区蜜月| 秋霞在线观看一区二区三区| 91青青在线视频| 亚洲色图视频网站| 国产免费内射又粗又爽密桃视频| 91福利区在线观看| 一本一道综合狠狠老| 亚洲欧美在线精品| 国产午夜亚洲精品一级在线| 精品国产乱码久久久久久免费| 成人手机在线免费视频| 精品一区二区三区的国产在线观看| 自拍偷拍亚洲精品| 国产污视频在线观看| 噜噜噜91成人网| 91精品国产综合久久久久久久久| 韩国av永久免费| 国产亚洲欧美中文| 天天想你在线观看完整版电影免费| av影院在线| 欧美最猛黑人xxxxx猛交| 日韩av影视大全| 午夜精品福利影院| 久久精品久久久久久国产 免费| 懂色av.com| 免费一级欧美片在线观看| 成人三级视频在线观看一区二区| 免费人成黄页在线观看忧物| 一区二区三区四区蜜桃| 十八禁视频网站在线观看| 久久久久久久久久久久电影| 亚洲欧洲美洲在线综合| 国产a免费视频| 奇米在线7777在线精品| 国产亚洲一区二区三区在线播放| 69久久久久| 欧美日在线观看| 国产探花一区二区三区| 国产成人调教视频在线观看 | 麻豆chinese极品少妇| 久久福利毛片| 国产精品初高中精品久久| 亚洲1卡2卡3卡4卡乱码精品| 欧美日韩国产综合新一区| 免费看的av网站| 久久电影院7| 国产激情综合五月久久| 欧美77777| 一区二区三区在线视频免费| 超碰超碰在线观看| 蜜桃国内精品久久久久软件9| 久久久亚洲国产| www.超碰在线.com| 国产精品成人在线观看| 欧美两根一起进3p做受视频| 欧美激情极品| 97国产精品视频| 国产成人手机在线| 伊人婷婷欧美激情| 天天久久综合网| 97精品中文字幕| 国产精品一区二区三区久久久| 国产资源在线观看| 色综合久久综合网97色综合| 色噜噜在线观看| 国产日韩一区二区三区在线播放 | 国产精品色噜噜| 欧美丰满熟妇bbbbbb百度| xvideos.蜜桃一区二区| 欧美黑人又粗大| 亚洲精品97久久中文字幕| 一区二区三区毛片| 国产成人精品一区二区三区在线观看| 欧美日韩三区| 懂色一区二区三区av片 | 午夜精品久久久久久久99热浪潮| www.色日本| 亚洲国产成人av好男人在线观看| 在线播放av网址| 亚洲精品1区2区| 久久久久久久久久久久久久久久av| 欧美另类老肥妇| 亚洲欧美日韩成人| 国产精品乱码一区二区视频| 国产色婷婷亚洲99精品小说| 亚洲综合日韩欧美| 一个色综合网| 国产精品久久精品视| 女海盗2成人h版中文字幕| 亚洲欧美精品中文字幕在线| 久久久国产免费| 自拍偷拍亚洲综合| 日本泡妞xxxx免费视频软件| 伊人成人在线| 欧美日韩免费精品| 久久精品嫩草影院| 欧美巨乳在线观看| 天堂在线视频网站| 91传媒视频在线播放| 成人在线观看小视频| 国产91露脸合集magnet| 国产性xxxx18免费观看视频| av永久不卡| 亚洲free性xxxx护士hd| 51精品视频| 夜夜嗨av色综合久久久综合网| 国产麻豆精品一区| 午夜精品视频一区| 大吊一区二区三区| 国产成人鲁色资源国产91色综| 五十路熟女丰满大屁股| 欧美精品乱码| 超碰97在线人人| 午夜av成人| 欧美黑人巨大xxx极品| 国产系列在线观看| 精品美女在线播放| 中文字幕第一页在线播放| 亚洲精品中文在线| 强伦人妻一区二区三区| 国产精品99久| 亚洲精品视频导航| 激情视频一区二区三区| 亚洲国产日韩综合一区| 国产精品一线| 成人午夜在线视频一区| 综合久久2023| 久久久久久久久久久人体| 69久久夜色| 亚洲欧美国产日韩天堂区| 精品国产伦一区二区三| 欧美亚洲国产怡红院影院| 精品在线视频观看| 综合电影一区二区三区| 日韩视频在线观看免费视频| 不卡一区二区三区四区| 一级片黄色免费| 日本视频中文字幕一区二区三区| 欧美午夜性视频| 亚洲理论电影网| 日韩片电影在线免费观看| 欧美男人操女人视频| 99国产高清| 免费一级欧美在线大片| 国产精品一二三视频| 色尼玛亚洲综合影院| 97国产精品视频| 丰满的护士2在线观看高清| www国产亚洲精品久久网站| porn视频在线观看| 亚洲欧美日韩国产精品| 深夜视频在线免费| 亚洲国产欧美一区二区三区同亚洲| 99久久久久久久| 欧美精品乱码久久久久久| 亚洲国产无线乱码在线观看| 色哟哟一区二区三区| 国产香蕉视频在线| 亚洲国产精品自拍| 久久在线视频精品| 亚洲乱码国产乱码精品精98午夜| 91麻豆精品久久毛片一级| 欧美国产精品一区二区| 中文字幕伦理片| 国产精品天干天干在观线| 欧洲美熟女乱又伦| 欧美经典一区二区三区| 亚欧精品视频一区二区三区| 欧美国产精品一区二区| 黄色免费一级视频| 国产精品久久午夜夜伦鲁鲁| 国产在视频线精品视频| 国产精品久99| 91传媒免费观看| 亚洲人一二三区| 免费视频网站www| 亚洲午夜免费福利视频| 日本五十熟hd丰满| 黄网动漫久久久| 亚洲黄色小说图片| 欧美色videos| 国产在线观看第一页| 欧美熟乱第一页| 国产精品日韩无码| 欧美第一区第二区| 色丁香婷婷综合久久| 日韩激情视频在线| 精品无人乱码| 日韩中文字幕av| 天堂av最新在线| 78色国产精品| 激情中国色综合| 97netav| 青青草这里只有精品| 日韩欧美手机在线| 国产精品久久观看| www.射射射| 视频一区欧美精品| 91亚洲精品久久久蜜桃借种| 粉嫩久久99精品久久久久久夜| 天堂www中文在线资源| 久久蜜臀中文字幕| 波多野结衣欲乱| 亚洲成人免费视| 一区二区乱子伦在线播放| 69久久夜色精品国产69蝌蚪网| 丰满熟妇人妻中文字幕| 国产视频久久久久久久| 最新97超碰在线| 国内外成人免费激情在线视频网站| 爱情电影社保片一区| 成人在线视频福利| 老司机精品视频在线播放| 亚洲一区二区三区在线观看视频| 欧美日韩1区| www.日本xxxx| 成人国产精品免费观看动漫| 无码少妇一区二区| 亚洲香蕉伊在人在线观| 91麻豆精品在线| 精品国产制服丝袜高跟| 国产三级在线| 午夜精品免费视频| 亚洲人成777| 欧美少妇一区| 影院欧美亚洲| 亚洲精品手机在线观看| 91亚洲精品久久久蜜桃网站| 亚洲视频重口味| 一本到不卡精品视频在线观看| av在线免费在线观看| 尤物精品国产第一福利三区 | 亚洲精品自拍动漫在线| 中文字幕精品无| 亚洲成人黄色在线观看| 精品欧美色视频网站在线观看| 青青久久av北条麻妃黑人| 91精品国产乱码久久久竹菊| 亚洲制服欧美久久| 国产精品久久久免费| 国产高潮视频在线观看| 亚洲日本在线a| 中文字幕在线视频第一页| 亚洲欧美国产高清va在线播| www.youjizz.com在线| 91精品国产一区二区三区动漫| 日本女优一区| 白嫩少妇丰满一区二区| 91性感美女视频| 久久久久久久久久久久久久免费看| 欧美精品一二三| 四虎久久免费| 国产精品中文字幕久久久| 国产区精品区| 亚洲成熟丰满熟妇高潮xxxxx| eeuss影院一区二区三区| 久久久久久久久久久97| 欧美一级欧美三级| av在线免费网站| 国产免费一区二区三区在线观看| 不卡视频在线| 天天爱天天操天天干| 国产午夜精品一区二区| 日韩熟女一区二区| 亚洲欧美一区二区三区久久| 不卡福利视频| 日本一区网站| 日韩激情一二三区| 熟女少妇内射日韩亚洲| 色婷婷av一区二区| 国产一区二区影视| 国产精品小说在线| 欧美超碰在线| 深爱五月综合网| 亚洲一区二区欧美日韩| 人妻夜夜爽天天爽| 欧美亚洲视频在线看网址| 九一亚洲精品| 久久精品免费网站| 国产精品欧美一区二区三区| 亚洲一级片免费看| 久色乳综合思思在线视频| 日韩精品成人在线观看| 又大又硬又爽免费视频| 91在线视频免费观看| 国产成人自拍偷拍| xvideos成人免费中文版| 久久久久久久久久久久电影| 成人一区二区免费视频| 91亚洲精品久久久蜜桃| 涩涩视频在线观看| 久久综合亚洲社区| 极品束缚调教一区二区网站 | 精品一区二区三区的国产在线播放| 国产老头老太做爰视频| 精品精品欲导航| 国产精品专区免费| 中国人体摄影一区二区三区| 成人一区二区三区在线观看 | 丝瓜av网站精品一区二区| 中文字幕精品亚洲| 日韩精品中文字幕一区二区三区| 韩日毛片在线观看| 亚洲精品二区| 成人自拍视频在线观看| 午夜精品久久久久久久蜜桃| 久久影院模特热| 欧美一区 二区| 国产精品视频中文字幕| 亚洲成a人v欧美综合天堂| 福利在线观看| 国产精品久久精品国产| 日本不卡视频在线| 久久久全国免费视频| 国产亚洲精品成人av久久ww| 久久九九精品视频| 久久久国产欧美| 亚洲成人av中文| 三区四区电影在线观看| 精品国产一区二区三区麻豆小说|