熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:文件管理(二)[4]

2013-11-23 17:51:55  來源: Delphi編程 

  子窗口主菜單包括FileFunctionDirectory三個菜單項 分別用於完成文件的基本管理功能其它管理功能和目錄管理功能

  由於對話框界面設計很簡單這裡不再進行贅述 讀者可直接參考後面將給出的對話框界面圖(圖)進行設計

   子窗口的創建布置和關閉

  子窗口的創建布置由父窗口的Windows菜單控制其菜單項如下

  ● New Windows : 創建新的子窗口

  ● Tile : 平鋪

  ● Cascade : 層疊

  ● ArrangeIcon : 排列圖標

  ● Minimized All : 極小化所有子窗口

  子窗口的創建只需要簡單調用窗體的Create方法

  FileMan := TFMFormCreate(Application)

  子窗口的標准排列方式直接調用MDI窗口的標准方法TileCascade和ArrangeIcons

  極小化所有子窗口的實現利用MDI窗口的兩個屬性MDIChildCount和MDIChildren:

  for i := to MDICount do

  MDIChildren[i]Windowstate := wsMinimized;

  子窗口關閉時釋放內存空間為此在子窗口TFMForm的OnClose事件中令

  Action := OnFree;

  為了保持和Windows的File Manager的一致性我們也禁止關閉最後一個子窗口這需要在子窗口的OnCloseQuery事件處理過程中實現

  If FileManagerMDIChildCount <= then

  CanClose := False;

  CanClose是OnCloseQuery事件過程返回的一個參數用於判定窗口是否可以關閉

  由於這一過程歸子窗口所有因而MDIChildCount前必須加上其對象名FileManager

  但不幸的是這樣一來我們的程序無法終止了!原來MDI窗口關閉前首先關閉其所有的子窗口如果子窗口不能關閉MDI窗口也不能關閉

  為此我們需要判斷發出關閉消息的是子窗口的系統菜單還是菜單的Exit項

  定義一個全局變量

  var

  ExitClick: Boolean;

  在子窗口的ExitClick事件處理過程中

  ExitClick := True;

  FileManagerExitClick(Sender)

  子窗口關閉前可以利用這一全局變量檢測是否應關閉

  If (FileManagerMDIChildCount <= ) and (Not ExitClick) then

  CanClose := False;

   文件控件的聯系

  在本例中我們使用了一組新的控件TabSetDirectoryOutlineFileListBox用於顯示和選擇驅動器目錄和文件與()中所用方法相比使用這一組控件需要少量的代碼支持

  TabSet與DirectoryOutline的聯系在TabSet的Click事件處理過程中建立

  With DriveTabSet do

  DirectoryOutlineDrive := Tabs[TabIndex][];

  DirectoryOutline與FileListBox的聯系在DirectoryOutline的Change事件處理過程中建立

  FileListDirectory := DirectoryOutlineDirectory;

  FileListUpdate;

   DriveTabSet的自畫風格顯示

  Dephi為一些控件提供了自畫風格的顯示如ListBoxComboBoxTabSet等 在缺省情況下這些控件自動顯示文本而在自畫風格下擁有控件的窗體在運行時間內自己畫出控件的每一項目

  自畫風格顯示通常的應用是為項目除文本外再添加圖形顯示能以自畫風格顯示的控件有一個共同特點都擁有一個TStrings類型的項目鏈由於TStrings類的特點(參第三章)它們都可以加入一個和對應文本相聯系的對象 而這正是自畫風格顯示的關鍵

  通常情況下產生一個自畫風格需要三個步驟

  設置自畫風格

  向字符串鏈表添加圖形對象

  畫出自畫項目

   設置自畫風格

  控件屬性Style 用於設置自畫風格對於DriveTabSet我們把Style 屬性設置為tsOwnerDraw

  對於ListBoxComboBox等控件的設置與TabSet略有差異讀者可參閱聯機幫助文檔

   向字符串鏈表添加圖形對象

  在應用程序中添加圖片部件

  在本程序中我們設置了三個圖片部件NetWorkFloppyFixed並分別與三個位圖文件NetWorkbmpFloppybmpFixedbmp相關聯

  把圖片添加到字符串鏈表中

  根據字符串鏈表的性質我們可以把對象與已存在的字符串建立聯系也可以同時添加字符串和對象這裡我們采用後一種方法

  在子窗口的OnCreate事件處理過程中我們利用一個循環依次檢測從a到z的驅動器是否存在以及驅動器的類型這利用了Windwos API函數GetDrivetype 如果驅動器不存在則返回否則返回驅動器的類型(DRIVE_REMOVABLEDRIVE_FIXEDDRIVE_REMOTE)根據驅動器類型我們可以判斷與文本(驅動器名)同時添加到Tabs中的不同圖形對象在添加過程中DriveTabSet的TabIndex被設置為當前驅動器

  程序清單如下

  procedure TFMFormFormCreate(Sender: TObject)

  var

  Drive AddedIndex: Integer;

  DriveLetter: Char;

  begin

  for Drive := to do

  begin

  DriveLetter := Chr(Drive + ord(a))

  case GetDrivetype(Drive) of

  DRIVE_REMOVABLE:

  AddedIndex := DriveTabSetTabsAddObject(DriveLetter FloppyPictureGraphic)

  DRIVE_FIXED:

  AddedIndex := DriveTabSetTabsAddObject(DriveLetter FixedPictureGraphic)

  DRIVE_REMOTE:

  AddedIndex := DriveTabSetTabsAddObject(DriveLetter NetworkPictureGraphic)

  end;

  if UpCase(DriveLetter) = UpCase(FileListDrive) then

  DriveTabSetTAbIndex := AddedIndex;

  end;

  end;

   畫出自畫項目

  當把一個控件的風格設置為自畫時Windows不再負責往屏幕上畫出控件的項目而是為每個可見項目產生自畫事件應用程序可以通過處理自畫事件畫出控件的項目

  確定自畫項目的大小

  對於TabSet而言這在OnMeasureTab事件處理過程中完成我們需要把DriveTabSet每個標簽的寬度增大到足以同時放下文本和位圖

  procedure TFMFormDriveTabSetMeasureTab(Sender: TObject; Index: Integer;

  var TabWidth: Integer)

  var

  BitmapWidth: Integer;

  begin

  BitmapWidth := TBitmap(DriveTabSetTabsObjects[Index])Width;

  Inc(TabWidth + BitmapWidth)

  end;

  由於TStrings的Objects屬性中存放的對象都是TObject類型並沒有Width屬性因而需要再把它轉化為TBitmap類型的對象

  BitmapWidth := TBitmap(DriveTabSetTabsObjects[Index])Width;

  返回目錄DELPHI基礎教程

       編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南

  Java程序性能優化讓你的Java程序更快更穩定

  C嵌入式編程設計模式

  Android游戲開發實踐指南

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25239.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.