第二章Windows 通用對話框
對話框是Windows操作係統中程序與用戶溝通的一種常見交互方式,對話框可以向用戶提供當前程序的運行狀況,也可以接受用戶輸入的信息。Windows對話框是Delphi可視化編程的特色之一,從某種意義上講,也是衡量應用程序功能的一個方麵,合理的利用Windows對話框界麵,可以大大的提高應用程序的人機交互功能,增加用戶與程序之間的交流機會。
在Delphi中,對話框的程序設計最常用的有兩種方式——對話框函數標準標準對話框,在本章中,我們仍然以講解結合示例的形式,對Windows對話框這種人機交互界麵進行比較詳細的講解。
2.1 對話框函數簡介
在Delphi中的對話框函數大體上可以分為兩種——輸入對話框函數和輸出對話框函數,輸入對話框函數用於接收用戶在程序運行過程中輸入的信息,其中包括ShowMessage()函數、MessageDlg()函數,而輸出對話框函數則用於顯示一個對話框窗體,向用戶報告當前程序的運行狀態等信息,它包括InputBox()函數下麵就對各個函數分別的加以介紹。
2.1.1 ShowMessage函數
對話框函數中的ShowMessage()函數用於在程序運行的過程中顯示一個包含一個字符串信息的對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
ShowMessage()函數的語法結構如下所示:
ShowMessage(const Msg: string);
下麵的示例程序就是用於在程序運行中產生一個對話框,在其中顯示一個字符串,具體的步驟如下所示:
1.開始工作
首先其中一個新的項目,在屏幕上就會彈出一個空白的窗體,向窗體上添加一個按鈕控件,控件的標題設置為“Hello”;
2.添加代碼
在程序的設計過程中用鼠標的左鍵雙擊窗體上的按鈕控件,在屏幕上就會彈出一個代碼窗口,在其中添加如下所示的按鈕響應代碼:
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
//定義字符串變量
begin
str:='Welcome'+chr(10)+chr(13);
str:=str+'歡迎進入Delphi世界'+chr(10)+chr(13);
str:=str+'在這裏將向您介紹showmessage函數的基本用法'+chr(10)+chr(13);
//為字符串變量賦值
showmessage(str);
//顯示對話框
end;
3.運行程序
完成以上的工作後,選擇菜單“File”中的“Save All”選項,在彈出的窗口中選擇一個合適的文件名存儲文件,然後按鍵盤上的功能鍵F9運行程序。
在程序的運行過程中,用鼠標的左鍵單擊窗體中按鈕“Hello”,在窗體上就會彈出一個對話框,如圖2-1所示。
圖2-1 ShowMessage()函數輸出對話框
2.1.2 MessageDlg函數
對話框函數中的MessageDlg()函數用於在程序運行的過程中顯示一個包含一個字符串、位圖和按鈕信息的對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
MessageDlg()函數的語法結構如下所示:
function MessageDlg(const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;
下麵的示例程序就是用於在程序運行中產生一個對話框,在其中顯示一個字符串,具體的步驟如下所示:
1.開始工作
首先其中一個新的項目,在屏幕上就會彈出一個空白的窗體,向窗體上添加一個按鈕控件,控件的標題設置為“Welcome”;
2.添加代碼
在程序的設計過程中用鼠標的左鍵雙擊窗體上的按鈕控件,在屏幕上就會彈出一個代碼窗口,在其中添加如下所示的按鈕響應代碼:
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
//定義一個字符串變量
begin
str:='Welcome'+chr(10)+chr(13);
str:=str+'歡迎進入Delphi世界'+chr(10)+chr(13);
str:=str+'在這裏將向您介紹showmessage函數的基本用法'+chr(10)+chr(13);
//為字符串變量賦值
MessageDlg(str,mtInformation,mbYesNoCancel,0);
//顯示一個對話框
end;
3.運行程序
在程序的運行過程中,用鼠標的左鍵單擊窗體中按鈕“Welcome”,在窗體上就會彈出一個對話框,如圖2-2所示。
圖2-2 MessageDlg()函數輸出對話框
2.1.3 InputBox函數
對話框函數中的InputBox()函數用於在程序運行的過程中顯示一個包含一個字符串和按鈕信息的輸入對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
它的語法結構如下所示:
function InputBox(const ACaption, APrompt, ADefault: string): string;
下麵以一個示例來說明InputBox()函數的用法,具體的設計步驟如下:
1.開始工作
在程序的設計階段,向空白的窗體上放置一個按鈕控件和一個輸入文本框:
?按鈕空間Button1:用來顯示一個數字輸入框;
?文本框空間Edit1:用來顯示信息輸入框中輸入數字的平方值。
2.添加代碼
並且在按鈕的響應事件中添加如下代碼:
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
//定義字符串變量
begin
str:=inputbox('平方計算器','請輸入原始數據:','');
//顯示一個輸入對話框
edit1.Text:=floattostr(strtofloat(str)*strtofloat(str));
//顯示輸入數據的平方值
end;
3.運行程序
存儲文件,運行程序,在按鈕控件上單擊鼠標的左鍵,在窗體的上方就會出現一個如圖2-3所示的輸入對話框。
圖2-3 輸入對話框
在輸入對話框中輸入一個正整數234,單擊“OK”按鈕,在程序運行的文本框中就會顯示出234的平方值,如圖2-4所示。
圖2-4 程序運行結果
2.2 係統對話框調用技術
在Delphi 5中為了方便用戶的開發工作,提供了十種係統對話框控件——打開文件對話框、存儲文件對話框、打開圖片對話框、存儲圖片對話框、打印對話框、打印設置對話框、字體設置對話框、顏色設置對話框、查找對話框和替換對話框。使用這些對話框,可以大大減輕程序開發的勞動量,所以讀者一定要掌握這十種係統對話框控件。
2.2.1 文件對話框
通過調用OpenDialog控件和SaveDialog可以分別顯示一個“打開”對話框和“另存為”對話框,如圖2-5所示即為一個典型的“打開”對話框。
圖2-5 “打開”對話框
與“打開”和“另存為”這兩個對話框有直接關係的屬性有四個,它們是InitialDir屬性、Filter屬性、FileName屬性和Options屬性,它們的作用如下所示:
?IninDir屬性用於為“打開”或“另存為”對話框指定初始目錄,如果此屬性沒有指定,則使用當前目錄。
?Filter屬性用於返回或設置在對話框的類型列表框中所顯示的過濾器。
?Filename屬性用於返回或設置所選文件的路徑和文件名。
?Options屬性用於為“打開”和“另存為”對話框返回或設置選項。
其中Options屬性對於“打開”和“另存為”對話框的特征設置有重要的作用,該屬性是一係列設置值的集合,如表2-1所示為Options屬性設置值及其說明。
表2-1 “打開”與“另存為”對話框中Options屬性設置值及其說明
常 數 常數描述
OfAllowMultiSelect 為真時,在文件列表框中可以對文件進行多重選擇,通過按 Shift 鍵以及使用方向鍵可以選擇多個文件,同時控件的FileName 屬性就返回一個包含全部所選文件名的字符串。
ofCreatePrompt 為真時,如果輸入文件不存在時將會顯示一個錯誤信息,並提示用戶創建新文件。
ofExtensionDifferent 對話框所返回的文件擴展名與 DefaultExt 屬性指定的擴展名不一致。
ofFileMustExist 為真時,用戶在對話框中隻能輸入已經存在的文件名。如果文件不存在,就會顯示一個警告信息。
ofShowHelp 為真時,在對話框中顯示幫助按鈕。
ofHideReadOnly 為真時,在對話框不顯示隻讀複選框。
ofNoChangeDir 為真時,對話框打開時的目錄設置為當前目錄。
ofNoDereferenceLinks 為真時,不要間接引用快捷方式。
ofNoLongNames 無長文件名。
續 表
常 數 常數描述
ofNoReadOnlyReturn 為真時,對話框返回的文件不能具有隻讀屬性,也不能在寫保護目錄下麵。
ofNoValidate 為真時,公共對話框返回的文件名中可以含有非法字符。
ofOverwritePrompt 為真時,使“另存為”對話框當選擇的文件已經存在時應產生一個信息框,用戶必須確認是否覆蓋該文件。
ofPathMustExist 為真時,用戶隻能夠在對話框中輸入有效路徑,如果輸入非法路徑時,會一個警告信息。
OfShareAware 為真時,忽略共享衝突錯誤。
OfNoNetworkButton 為真時,忽略網絡驅動器。
下麵以一個示例程序來說明各個參數對“打開”和“另存為”對話框的影響。
1.創建項目
首先啟動一個新的項目,向窗體上添加一個按鈕控件,並在控件工具欄上選擇Dialog選項,向窗體上添加一個OpenDialog控件和一個SaveDialog控件。
2.添加代碼
在按鈕的響應事件中添加如下所示的代碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.OpenDialog1.DefaultExt:='txt';
//設置缺省擴展名
form1.OpenDialog1.Title:='請選擇一個文本文件:';
//設置對話框標題
form1.OpenDialog1.InitialDir:='d:\';
//設置缺省路徑
form1.OpenDialog1.Filter:='Text files(*.txt)|*.txt';
//設置文件過濾條件
form1.OpenDialog1.Options:=[ofReadOnly, ofOverwritePrompt, ofNoChangeDir,
ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent,
ofPathMustExist, ofFileMustExist, ofShareAware, ofNoReadOnlyReturn,
ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog,
ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing];
//設置對話框風格
form1.OpenDialog1. Execute;
//打開對話框
form1.SaveDialog1.DefaultExt:='txt';
//設置缺省擴展名
form1.SaveDialog1.Title:='請選擇一個存儲文件:';
//設置對話框標題
form1.SaveDialog1.InitialDir:='d:\';
//設置缺省路徑
form1.SaveDialog1.Filter:='Text files(*.txt)|*.txt';
//設置文件過濾條件
form1.OpenDialog1.Options:=[ofReadOnly, ofOverwritePrompt, ofNoChangeDir,
ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent,
ofPathMustExist, ofFileMustExist, ofShareAware, ofNoReadOnlyReturn,
ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog,
ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing];
//設置對話框風格
form1.SaveDialog1. Execute;
//打開對話框
end;
程序說明:
在程序運行的初期,單擊按鈕時就會激活procedure TForm1.Button1Click(Sender: TObject);事件,其中的代碼就會被執行。
程序首先設置了“打開”對話框中允許對文件複選、對話框中包括“幫助”按鈕並且對話框具有“資源管理器”風格,然後設置了對話框的標題為 "請選擇一個文件:",缺省工作路徑為"d:\",而且在對話框中將會顯示所有文件,最後通過調用Execute方法來顯示一個如圖2-6所示的對話框。
圖2-6 選擇打開文件的對話框
在以上所打開的對話框中各個按鈕的功能如下所示:
按鈕:打開一個選中的文件;
按鈕:取消所做的選擇操作;
按鈕:顯示幫助信息。
“另存為”對話框的工作原理同“打開”對話框的工作原理大致相同,在這裏就不在贅述了,請讀者自己按照上述方法繼續完成這個練習。
2.2.2 “顏色”對話框
通過調用ColorDialog控件的Execute方法可以顯示一個“顏色”設置對話框,如圖2-7所示即為一個典型的“顏色”對話框。
圖2-7 “顏色”設置對話框
與“顏色”對話框有直接關係的屬性隻有一個Options屬性,用於為“顏色”對話框返回或設置選項,同“打開”對話框一樣,該屬性也是一係列設置值的集合,如表2-2所示為Options屬性設置值及其說明。
表2-2 “顏色”對話框中常用的Options常數及其說明
常用常數 常數描述
cdFullOpen 為真時,顯示全部的對話框,包括定義自定義顏色部分。
cdSolidColor 為真時,顯示最相近的實體顏色。
cdPreventFullOpen 為真時,使定義自定義顏色命令按鈕無效並禁止自定義顏色。
CdAnyColor 為真時,允許用戶選用非實體顏色。
CdShowHelp 為真時,在對話框中顯示幫助按鈕。
下麵以一個示例程序來說明ColorDialog控件屬性設置對“顏色”對話框的影響。
1.創建項目
首先啟動一個新的項目,向窗體上添加一個按鈕控件,並在控件工具欄上選擇Dialog選項,向窗體上添加一個ColorDialog控件。
2.添加代碼
在按鈕的響應事件中添加如下所示的代碼: