首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
定義一個全局變量
var
ExitClick: Boolean;
在子窗口的Exit1Click事件處理過程中:
ExitClick := True;
FileManager.Exit1Click(Sender);
子窗口關閉前可以利用這一全局變量檢測是否應關閉:
If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then
CanClose := False;
6.4.3 文件控件的聯系
在本例中我們使用了一組新的控件:TabSet、DirectoryOutline、FileListBox,用于顯示和選擇驅動器、目錄和文件。與(6.3)中所用方法相比,使用這一組控件需要少量的代碼支持。
TabSet與DirectoryOutline的聯系在TabSet的Click事件處理過程中建立:
With DriveTabSet do
DirectoryOutline.Drive := Tabs[TabIndex][1];
DirectoryOutline與FileListBox的聯系在DirectoryOutline的Change事件處理過程中建立:
FileList.Directory := DirectoryOutline.Directory;
FileList.Update;
6.4.4 DriveTabSet的自畫風格顯示
Dephi為一些控件提供了自畫風格的顯示,如ListBox、ComboBox、TabSet等。 在缺省情況下,這些控件自動顯示文本。而在自畫風格下,擁有控件的窗體在運行時間內自己畫出控件的每一項目。
自畫風格顯示通常的應用是為項目除文本外再添加圖形顯示。能以自畫風格顯示的控件有一個共同特點:都擁有一個TStrings類型的項目鏈。由于TStrings類的特點(參第三章),它們都可以加入一個和對應文本相聯系的對象。 而這正是自畫風格顯示的關鍵。
通常情況下產生一個自畫風格需要三個步驟:
1.設置自畫風格;
2.向字符串鏈表添加圖形對象;
3.畫出自畫項目。
6.4.4.1 設置自畫風格
控件屬性Style 用于設置自畫風格。對于DriveTabSet,我們把Style 屬性設置為tsOwnerDraw。
對于ListBox、ComboBox等控件的設置與TabSet略有差異,讀者可參閱聯機幫助文檔。
6.4.4.2 向字符串鏈表添加圖形對象
1.在應用程序中添加圖片部件
在本程序中我們設置了三個圖片部件NetWork、Floppy、Fixed,并分別與三個位圖文件NetWork.bmp、Floppy.bmp、Fixed.bmp相關聯。
2.把圖片添加到字符串鏈表中
根據字符串鏈表的性質,我們可以把對象與已存在的字符串建立聯系,也可以同時添加字符串和對象。這里我們采用后一種方法。
在子窗口的OnCreate事件處理過程中,我們利用一個循環依次檢測從a到z的驅動器是否存在以及驅動器的類型。這利用了Windwos API函數GetDrivetype, 如果驅動器不存在則返回0,否則返回驅動器的類型(DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE)。根據驅動器類型我們可以判斷與文本(驅動器名)同時添加到Tabs中的不同圖形對象。在添加過程中,DriveTabSet的TabIndex被設置為當前驅動器。
程序清單如下:
procedure TFMForm.FormCreate(Sender: TObject);
var
Drive, AddedIndex: Integer;
DriveLetter: Char;
begin
for Drive := 0 to 25 do
begin
DriveLetter := Chr(Drive + ord('a'));
case GetDrivetype(Drive) of
DRIVE_REMOVABLE:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Floppy.Picture.Graphic);
DRIVE_FIXED:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Fixed.Picture.Graphic);
DRIVE_REMOTE:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Network.Picture.Graphic);
end;
if UpCase(DriveLetter) = UpCase(FileList.Drive) then
DriveTabSet.TAbIndex := AddedIndex;
end;
end;
6.4.4.3 畫出自畫項目
當把一個控件的風格設置為自畫時,Windows不再負責往屏幕上畫出控件的項目,而是為每個可見項目產生自畫事件。應用程序可以通過處理自畫事件畫出控件的項目。
1.確定自畫項目的大小
對于TabSet而言,這在OnMeasureTab事件處理過程中完成。我們需要把DriveTabSet每個標簽的寬度增大到足以同時放下文本和位圖。
procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;
var TabWidth: Integer);
var
BitmapWidth: Integer;
begin
BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;
Inc(TabWidth, 2 + BitmapWidth);
end;
由于TStrings的Objects屬性中存放的對象都是TObject類型,并沒有Width屬性,因而需要再把它轉化為TBitmap類型的對象:
BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;
2.畫出每個自畫項目
這在TabSet的OnDrawTab事件處理過程中完成。這一事件處理過程的參數中包含了待畫項目索引、畫板、待畫區域、是否被選中等。這里我們只利用了前三個參數。事實上利用最后一個參數,我們可以對被選中的標簽進行一些特殊的視覺效果處理。這一工作就留給讀者自己去完成。
procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas;
R: TRect; Index: Integer; Selected: Boolean);
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap(DriveTabSet.Tabs.Objects[Index]);
with TabCanvas do
begin
Draw(R.Left, R.Top + 4, Bitmap);
TextOut(R.Left + 2 + Bitmap.Width, R.Top + 2, DriveTabSet.Tabs[Index]);
end;
end;
6.4.5 文件管理基本功能的實現
在子窗口的File菜單中,定義了文件管理的基本功能,它們是:
● Open :打開或運行一個文件(從文件列表框雙擊該文件可實現同樣效果)
● Move :文件在不同目錄間的移動
● Copy :文件拷貝
● Delete :文件刪除
● Rename :文件更名
● Properties :顯示文件屬性
6.4.5.1 文件打開
文件打開功能可以運行一個可執行文件,或把文件在與之相關聯的應用程序中打開。文件總是與創建它的應用程序相關聯,這種關聯可以在Windows的文件管理器中修改。要注意的是:文件的關聯是以后綴名為標志的,因而對一個文件關聯方式的修改將影響所有相同后綴名的文件。
文件打開功能實現的關鍵是利用了Windows API函數ShellExecute 。由于Windows API函數的參數要求字符串類型是PChar,而Delphi中一般用的是有結束標志的String類型,因此為調用方便我們把這一函數進行了重新定義如下。
function ExecuteFile(const FileName, Params, DefaultDir: String;
ShowCmd: Integer): THandle;
var
zFileName, zParams, zDir: array[0..79] of Char;
begin
Result := ShellExecute(Application.MainForm.Handle, nil,
StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
StrPCopy(zDir, DefaultDir), ShowCmd);
end;
以上函數在fmxutils單元中定義。fmxutils是一個自定義代碼單元。
有關ShellExecute中各參數的具體含義讀者可查閱聯機Help文件。
StrPCopy把一個Pascal類型的字符串拷貝到一個無結束符的PChar類型字符串中。
在子窗口的Open1Click事件處理過程中:
procedure TFMForm.Open1Click(Sender: TObject);
begin
with FileList do
ExecuteFile(FileName, '', Directory, SW_SHOW) ;
end;
如果FileList允許顯示目錄的話(即FileType屬性再增加一項ftDirectory),那么對于一個目錄而言,打開的含義應該是顯示它下邊的子目錄和文件。程序修改如下。
procefure TFMForm.Open1Click(Sender: Tobject);
begin
With FileList do
begin
if HasAttr(FileName,faDirectory) then
DirectoryOutline.Directory := FileName
else
ExecuteFile(FileName,' ' ,Directory,SW_SHOW);
end;
end;
其中HasAttr是一個fmxutils單元中的自定義函數,用于檢測指定文件是否具有某種屬性。
function HasAttr(const FileName: String; Attr: Word): Boolean;
begin
Result := (FileGetAttr(FileName) and Attr) = Attr;
end;
6.4.5.2 文件拷貝、移動、刪除、更名
文件拷貝的關鍵是使用了以文件句柄為操作對象的文件管理函數,因而提供了一種底層的I/O通道。在Object Pascal中這一點是利用無類型文件實現的。
在文件拷貝中首先檢查目標文件名是否是一個目錄。如是則把原文件的文件名添加到目標路徑后,生成目標文件全路徑名。而后提取源文件的時間戳,以備拷貝完成后設置目標文件。拷貝過程中使用了返回文件句柄或以文件句柄為參數的文件管理函數FileOpen、FileCreate、FileRead、FileWrite、FileClose。為保證文件的正常關閉和內存的釋放,在拷貝過程中進行異常保護。
過程CopyFile實現上述功能,它定義在fmxutils單元中。
procedure CopyFile(const FileName, DestName: TFileName);
var
CopyBuffer: Pointer;
TimeStamp, BytesCopied: Longint;
Source, Dest: Integer;
Destination: TFileName;
const
ChunkSize: Longint = 8192;
begin
Destination := ExpandFileName(DestName);
if HasAttr(Destination, faDirectory) then
Destination := Destination + '\' + ExtractFileName(FileName);
TimeStamp := FileAge(FileName);
GetMem(CopyBuffer, ChunkSize);
try
Source := FileOpen(FileName, fmShareDenyWrite);
if Source < 0 then
raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));
try
Dest := FileCreate(Destination);
if Dest < 0 then
raise EFCreateError.Create(FmtLoadStr(SFCreateError,[Destination]));
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize);
if BytesCopied > 0 then
FileWrite(Dest, CopyBuffer^, BytesCopied);
until BytesCopied < ChunkSize;
finally
FileSetDate(Dest,TimeStamp);
FileClose(Dest);
end;
finally
FileClose(Source);
end;
finally
FreeMem(CopyBuffer, ChunkSize);
end;
end;
如果我們不使用FileSetDate過程,Windows自動把當前時間作為時間戳寫入文件。
文件移動事實上是文件拷貝與文件刪除的結合。fmxutils單元中的MoveFile過程實現了這一功能。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |