精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品成人一区二区三区| 中文字幕亚洲一区二区三区| 欧美极品欧美精品欧美| 精品亚洲综合| 国产精品亚洲第一区在线暖暖韩国| 欧美黑人xxxⅹ高潮交| 亚洲国产精品无码久久久久高潮| 四虎成人在线| 一区二区三区丝袜| 日韩av一级大片| 精品久久久久久亚洲综合网站| 国产欧美在线| 欧美刺激性大交免费视频| 玖玖爱在线精品视频| 久草综合在线| 欧美日韩在线视频观看| 色香蕉在线观看| 日韩电影在线观看完整版| 精品写真视频在线观看| 午夜精品一区二区三区在线播放 | 亚洲天堂2021av| 亚洲国产清纯| 久久久电影免费观看完整版| 欧美色图亚洲激情| av日韩在线播放| 欧美一区在线视频| 国产免费又粗又猛又爽| 国产夫妻在线| 夜夜嗨av一区二区三区四季av| 日本一区二区三不卡| 欧美一级淫片免费视频魅影视频| 精品在线观看视频| 国产精品女人久久久久久| 成年人免费看毛片| 亚洲成色精品| 欧美激情videoshd| 四虎884aa成人精品| av在线不卡免费观看| 日韩高清a**址| 国产成人一区二区三区小说| 久久综合久久久| 国产一区免费看| 欧美特黄一区| 欧美成人高清视频| 国产免费美女视频| 人人狠狠综合久久亚洲婷| 日韩精品视频中文在线观看| 91九色蝌蚪porny| 国产专区精品| 欧美一级片在线看| 亚洲精品手机在线观看| 精品欧美一区二区三区在线观看 | 激情六月婷婷久久| 国产欧美日韩最新| 伊人精品一区二区三区| 青椒成人免费视频| 国产精品欧美日韩久久| 欧美日韩一二三四区| 国产一区清纯| 精品视频9999| 国产大片aaa| 中文亚洲字幕| 欧美自拍视频在线观看| 黄色免费av网站| 老司机精品视频网站| 日本国产欧美一区二区三区| 无码人妻av免费一区二区三区| 99热这里只有精品8| 国语自产精品视频在免费| 日韩成人免费观看| 丝袜国产日韩另类美女| 国产精品海角社区在线观看| 中日精品一色哟哟| 精品制服美女丁香| 国产精品日韩欧美一区二区| 四虎永久在线精品免费网址| 97久久久精品综合88久久| 久久久影院一区二区三区| 欧洲视频在线免费观看| 国产日韩欧美不卡在线| 亚洲欧美电影在线观看| 99自拍视频在线观看| 亚洲不卡av一区二区三区| 91视频 -- 69xx| 国产精成人品2018| 日韩一卡二卡三卡国产欧美| 亚洲美女在线观看| 国产中文字幕免费观看| 偷拍视频一区二区三区| 欧美猛男gaygay网站| 女人扒开双腿让男人捅| 思热99re视热频这里只精品 | 波多野结衣一本| 欧美色图国产精品| 久久99视频精品| 天堂а√在线中文在线新版| 九九视频精品免费| 精品999在线观看| av一区在线观看| 亚洲一区视频在线| 在线观看av日韩| xvideos.蜜桃一区二区| 在线精品播放av| 国产亚洲成人av| 日本午夜精品视频在线观看| 91精品婷婷国产综合久久蝌蚪| 毛片网站在线| 亚洲午夜国产一区99re久久| 999精品视频在线| 91亚洲精品视频在线观看| 这里只有精品久久| 伊人久久综合视频| 国产综合久久久久久鬼色| 美女黄毛**国产精品啪啪| 成人在线影视| 在线精品视频一区二区三四| av av在线| 午夜小视频在线播放| 婷婷综合电影| 欧美大片va欧美在线播放| 伦av综合一区| 成人丝袜高跟foot| 国产盗摄视频在线观看| 91成人在线| 亚洲免费成人av电影| 久久免费在线观看视频| 麻豆国产精品一区二区三区| 国内不卡一区二区三区| 亚洲婷婷噜噜| 欧美精品少妇一区二区三区| 亚洲精品午夜视频| 羞羞答答国产精品www一本| 成人自拍偷拍| 成人在线观看免费网站| 在线观看亚洲a| 熟女少妇一区二区三区| 中文亚洲字幕| 久久久av水蜜桃| www555久久| 日韩三级电影网址| 国产av无码专区亚洲av毛网站| 日本女人一区二区三区| 日韩av电影免费在线| 大胆人体一区二区| 日韩精品电影网| 你懂的国产视频| 99久久精品免费精品国产| 精品国产av无码一区二区三区| 日韩在线亚洲| 欧美日本啪啪无遮挡网站| 国产免费黄色片| 亚洲男女一区二区三区| 激情在线观看视频| 888久久久| 91在线视频导航| 在线中文字幕电影| 精品盗摄一区二区三区| 国产无遮挡aaa片爽爽| 大白屁股一区二区视频| 久久视频这里有精品| 欧美电影完整版在线观看| 91tv亚洲精品香蕉国产一区7ujn| 污视频软件在线观看| 都市激情亚洲色图| 中文字幕国产专区| 日韩高清欧美激情| 正在播放亚洲| 日韩免费一级| 成人免费的视频| 成人高清在线观看| 国内在线免费视频| 精品在线欧美视频| 一级特黄免费视频| 国产精品超碰97尤物18| 天堂在线精品视频| 一本一道久久综合狠狠老精东影业| 激情五月综合色婷婷一区二区 | 欧美电影一二区| 91亚洲精品久久久久久久久久久久| 很黄的网站在线观看| 欧美videossexotv100| 日本高清www免费视频| 久久久99久久| 国内精品国产三级国产aⅴ久| 国产精品扒开腿做爽爽爽软件| 国产一区二区高清不卡| 欧美不卡高清一区二区三区| 日韩中文字幕免费看| wwwav在线播放| 色香蕉久久蜜桃| 日日噜噜夜夜狠狠久久波多野| 国产麻豆午夜三级精品| 亚洲熟妇无码另类久久久| 色综合综合色| 999国内精品视频在线| 人妻丰满熟妇aⅴ无码| 成人动漫视频| 国产精品精品视频| 欧美videosex性欧美黑吊| 亚洲毛片在线看| 国产欧美日韩成人| 色综合久久久久综合体桃花网| 波多野结衣久久久久| 91在线一区二区| 日本黄色福利视频| 在线亚洲伦理| 400部精品国偷自产在线观看| 日本福利一区| 91久久偷偷做嫩草影院| 五月激情久久| 午夜精品蜜臀一区二区三区免费| 97电影在线| 日韩精品www| 亚洲国产999| 欧美日本韩国一区二区三区视频| 日韩美女视频网站| 亚洲欧美日韩国产手机在线| 国产精品成人一区二区三区电影毛片 | 亚欧无线一线二线三线区别| 性欧美欧美巨大69| 欧美日韩国产精品一卡| 成人资源在线| 亚洲xxxx18| 色狠狠一区二区三区| 日韩免费在线视频| 色资源二区在线视频| 美女av一区二区三区| bbbbbbbbbbb在线视频| 日韩成人av网址| 丰满人妻一区二区三区免费| 在线播放亚洲一区| www.亚洲激情| 色伊人久久综合中文字幕| 日韩精品视频播放| 亚洲一区日韩精品中文字幕| 日韩成人毛片视频| 亚洲视频一区二区在线观看| 免费网站在线高清观看| 久久久久久久久久久电影| 波多野结衣加勒比| 丁香天五香天堂综合| 日韩av影视大全| 久久99精品久久久久| 91女神在线观看| 免费一区二区视频| 亚洲成人福利在线观看| 久久在线91| 欧洲一区二区三区在线| 男人操女人的视频网站| 一区在线播放视频| 一区二区国产精品精华液| 亚洲视频 欧洲视频| 久久久久久久麻豆| 1000部国产精品成人观看| 久久噜噜色综合一区二区| 国产精品电影一区二区| 波多野结衣欲乱| 亚洲视频一区在线| 久久免费少妇高潮99精品| 亚洲夂夂婷婷色拍ww47| 国产一级片免费| 激情亚洲一区二区三区四区| 天堂网av手机版| 色欧美片视频在线观看在线视频| 国产午夜麻豆影院在线观看| 欧美在线制服丝袜| 一级特黄aa大片| 91麻豆精品国产91久久久久久久久 | 国产在线一区二区三区欧美| 日本成人7777| 一区二区三区四区视频精品免费 | 久久一留热品黄| 国产亚洲精品熟女国产成人| 中文字幕av一区 二区| av最新在线观看| 亚洲最新在线观看| 五月天婷婷久久| 欧美午夜电影网| 国产欧美综合视频| 亚洲国产精品中文| 国产视频精品久久| 蜜臀久久99精品久久久无需会员| av3级在线| 国产精品久久电影观看| 亚洲影视资源| 久久国产精品一区二区三区四区| 国产欧美一区二区三区精品观看 | 色的视频在线免费看| 美女视频久久黄| 男女羞羞在线观看| 国产精品最新在线观看| 91国内精品| 日韩欧美亚洲精品| 欧美网站在线| 91蝌蚪视频在线观看| 国产久卡久卡久卡久卡视频精品| 男男做爰猛烈叫床爽爽小说 | 亚洲欧美电影在线观看| 欧美色图首页| 国产aaaaa毛片| 成人午夜视频福利| 天天摸日日摸狠狠添| 亚洲曰韩产成在线| 中文字幕一区二区三区四区视频| 亚洲成人黄色在线| 日本视频在线观看| 91精品国产91久久久久| 97色婷婷成人综合在线观看| 久久国产欧美精品| 欧美视频久久| 成年人三级黄色片| 国产亚洲精品中文字幕| 免费一级片视频| 欧美日韩国产另类一区| 日本天堂影院在线视频| 欧美日韩国产第一页| 国产成人77亚洲精品www| 久久精品国产精品国产精品污| 97在线公开视频| 综合激情成人伊人| 精品视频一二三区| 亚洲国产日韩欧美在线动漫| 精品国产99久久久久久| 国产不卡一区二区在线播放| 成人中文字幕视频| 伊人网在线免费| 精品一区二区三区蜜桃| 少妇久久久久久久久久| 性久久久久久久久久久久| 精品二区在线观看| 日韩中文字幕在线精品| 欧美色网一区| 免费毛片一区二区三区久久久| 欧美日韩理论| 色婷婷综合在线观看| 亚洲欧洲在线观看av| 亚洲天堂视频在线| 日韩亚洲成人av在线| 日本另类视频| 日本一区二区三区视频在线观看| 国产日韩欧美一区在线| 欧美激情一区二区三区p站| 亚洲免费高清视频在线| 亚洲最新av网站| 精品国偷自产在线| 成人豆花视频| 永久免费看av| 国产凹凸在线观看一区二区| 免费中文字幕视频| 欧美成人猛片aaaaaaa| 污污网站在线观看| www.久久久| 亚洲视频碰碰| 国产又粗又猛又色| 欧美日韩中文字幕综合视频| 婷婷亚洲一区二区三区| 欧美国产在线电影| 豆花视频一区二区| 久久亚洲中文字幕无码| 91色九色蝌蚪| 性高潮视频在线观看| 中文字幕在线国产精品| 亚洲成人a级片| 好吊色视频988gao在线观看| 国产91精品一区二区麻豆亚洲| 久久综合色综合| 精品丝袜一区二区三区| 欧美舌奴丨vk视频| 一本一生久久a久久精品综合蜜| 激情五月激情综合网| 久草视频免费在线| 亚洲精品理论电影| 国产一区二区三区影视| 日本一区二区免费高清视频| 国产乱人伦偷精品视频免下载 | 在线观看精品一区二区三区| 国产色综合天天综合网 | 欧美黑人巨大精品一区二区| 国产精品qvod| 日韩一区二区在线观看视频| 搞黄视频在线观看| 91色在线观看| 午夜影院日韩| 欧美h片在线观看| 亚洲黄在线观看| 成人午夜亚洲| r级无码视频在线观看| 国产午夜精品福利| 精品人妻一区二区三区蜜桃| 青草青草久热精品视频在线观看| 欧美大片aaaa| 波多野结衣先锋影音| 欧美日韩一级片在线观看| 久久香蕉av| 亚洲欧美电影在线观看| av电影一区二区| 国产精品熟女久久久久久| 91av免费观看91av精品在线| 久久国产亚洲精品| 亚洲精品女人久久久|