首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級 | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
計(jì)算機(jī)等級考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會計(jì)從業(yè)資格考試會計(jì)證) | 經(jīng)濟(jì)師 | 會計(jì)職稱 | 注冊會計(jì)師 | 審計(jì)師 | 注冊稅務(wù)師
注冊資產(chǎn)評估師 | 高級會計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財規(guī)劃師 | 國際內(nèi)審師
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價師 | 土地估價師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評價師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

2011年計(jì)算機(jī)等級考試Delphi講義:文件管理

本章首先介紹Delphi文件管理的基本概念和標(biāo)準(zhǔn)過程/函數(shù),并提供了一個記錄文件的應(yīng)用實(shí)例,這是從我們實(shí)際課題開發(fā)中提取出來的。而后介紹Delphi提供的文件控件的使用方法。最后提供的一個綜合例程MDI文件管理器則是對Delphi文件管理功能的綜合應(yīng)用。

  定義一個全局變量

  var

  ExitClick: Boolean;

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

  ExitClick := True;

  FileManager.Exit1Click(Sender);

  子窗口關(guān)閉前可以利用這一全局變量檢測是否應(yīng)關(guān)閉:

  If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then

  CanClose := False;

  6.4.3 文件控件的聯(lián)系

  在本例中我們使用了一組新的控件:TabSet、DirectoryOutline、FileListBox,用于顯示和選擇驅(qū)動器、目錄和文件。與(6.3)中所用方法相比,使用這一組控件需要少量的代碼支持。

  TabSet與DirectoryOutline的聯(lián)系在TabSet的Click事件處理過程中建立:

  With DriveTabSet do

  DirectoryOutline.Drive := Tabs[TabIndex][1];

  DirectoryOutline與FileListBox的聯(lián)系在DirectoryOutline的Change事件處理過程中建立:

  FileList.Directory := DirectoryOutline.Directory;

  FileList.Update;

  6.4.4 DriveTabSet的自畫風(fēng)格顯示

  Dephi為一些控件提供了自畫風(fēng)格的顯示,如ListBox、ComboBox、TabSet等。 在缺省情況下,這些控件自動顯示文本。而在自畫風(fēng)格下,擁有控件的窗體在運(yùn)行時間內(nèi)自己畫出控件的每一項(xiàng)目。

  自畫風(fēng)格顯示通常的應(yīng)用是為項(xiàng)目除文本外再添加圖形顯示。能以自畫風(fēng)格顯示的控件有一個共同特點(diǎn):都擁有一個TStrings類型的項(xiàng)目鏈。由于TStrings類的特點(diǎn)(參第三章),它們都可以加入一個和對應(yīng)文本相聯(lián)系的對象。 而這正是自畫風(fēng)格顯示的關(guān)鍵。

  通常情況下產(chǎn)生一個自畫風(fēng)格需要三個步驟:

  1.設(shè)置自畫風(fēng)格;

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

  3.畫出自畫項(xiàng)目。

  6.4.4.1 設(shè)置自畫風(fēng)格

  控件屬性Style 用于設(shè)置自畫風(fēng)格。對于DriveTabSet,我們把Style 屬性設(shè)置為tsOwnerDraw。

  對于ListBox、ComboBox等控件的設(shè)置與TabSet略有差異,讀者可參閱聯(lián)機(jī)幫助文檔。

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

  1.在應(yīng)用程序中添加圖片部件

  在本程序中我們設(shè)置了三個圖片部件NetWork、Floppy、Fixed,并分別與三個位圖文件NetWork.bmp、Floppy.bmp、Fixed.bmp相關(guān)聯(lián)。

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

  根據(jù)字符串鏈表的性質(zhì),我們可以把對象與已存在的字符串建立聯(lián)系,也可以同時添加字符串和對象。這里我們采用后一種方法。

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

  程序清單如下:

  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 畫出自畫項(xiàng)目

  當(dāng)把一個控件的風(fēng)格設(shè)置為自畫時,Windows不再負(fù)責(zé)往屏幕上畫出控件的項(xiàng)目,而是為每個可見項(xiàng)目產(chǎn)生自畫事件。應(yīng)用程序可以通過處理自畫事件畫出控件的項(xiàng)目。

  1.確定自畫項(xiàng)目的大小

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

  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屬性,因而需要再把它轉(zhuǎn)化為TBitmap類型的對象:

  BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;

  2.畫出每個自畫項(xiàng)目

  這在TabSet的OnDrawTab事件處理過程中完成。這一事件處理過程的參數(shù)中包含了待畫項(xiàng)目索引、畫板、待畫區(qū)域、是否被選中等。這里我們只利用了前三個參數(shù)。事實(shí)上利用最后一個參數(shù),我們可以對被選中的標(biāo)簽進(jìn)行一些特殊的視覺效果處理。這一工作就留給讀者自己去完成。

  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 文件管理基本功能的實(shí)現(xiàn)

  在子窗口的File菜單中,定義了文件管理的基本功能,它們是:

  ● Open :打開或運(yùn)行一個文件(從文件列表框雙擊該文件可實(shí)現(xiàn)同樣效果)

  ● Move :文件在不同目錄間的移動

  ● Copy :文件拷貝

  ● Delete :文件刪除

  ● Rename :文件更名

  ● Properties :顯示文件屬性

  6.4.5.1 文件打開

  文件打開功能可以運(yùn)行一個可執(zhí)行文件,或把文件在與之相關(guān)聯(lián)的應(yīng)用程序中打開。文件總是與創(chuàng)建它的應(yīng)用程序相關(guān)聯(lián),這種關(guān)聯(lián)可以在Windows的文件管理器中修改。要注意的是:文件的關(guān)聯(lián)是以后綴名為標(biāo)志的,因而對一個文件關(guān)聯(lián)方式的修改將影響所有相同后綴名的文件。

  文件打開功能實(shí)現(xiàn)的關(guān)鍵是利用了Windows API函數(shù)ShellExecute 。由于Windows API函數(shù)的參數(shù)要求字符串類型是PChar,而Delphi中一般用的是有結(jié)束標(biāo)志的String類型,因此為調(diào)用方便我們把這一函數(shù)進(jìn)行了重新定義如下。

  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;

  以上函數(shù)在fmxutils單元中定義。fmxutils是一個自定義代碼單元。

  有關(guān)ShellExecute中各參數(shù)的具體含義讀者可查閱聯(lián)機(jī)Help文件。

  StrPCopy把一個Pascal類型的字符串拷貝到一個無結(jié)束符的PChar類型字符串中。

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

  procedure TFMForm.Open1Click(Sender: TObject);

  begin

  with FileList do

  ExecuteFile(FileName, '', Directory, SW_SHOW) ;

  end;

  如果FileList允許顯示目錄的話(即FileType屬性再增加一項(xiàng)ftDirectory),那么對于一個目錄而言,打開的含義應(yīng)該是顯示它下邊的子目錄和文件。程序修改如下。

  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單元中的自定義函數(shù),用于檢測指定文件是否具有某種屬性。

  function HasAttr(const FileName: String; Attr: Word): Boolean;

  begin

  Result := (FileGetAttr(FileName) and Attr) = Attr;

  end;

  6.4.5.2 文件拷貝、移動、刪除、更名

  文件拷貝的關(guān)鍵是使用了以文件句柄為操作對象的文件管理函數(shù),因而提供了一種底層的I/O通道。在Object Pascal中這一點(diǎn)是利用無類型文件實(shí)現(xiàn)的。

  在文件拷貝中首先檢查目標(biāo)文件名是否是一個目錄。如是則把原文件的文件名添加到目標(biāo)路徑后,生成目標(biāo)文件全路徑名。而后提取源文件的時間戳,以備拷貝完成后設(shè)置目標(biāo)文件。拷貝過程中使用了返回文件句柄或以文件句柄為參數(shù)的文件管理函數(shù)FileOpen、FileCreate、FileRead、FileWrite、FileClose。為保證文件的正常關(guān)閉和內(nèi)存的釋放,在拷貝過程中進(jìn)行異常保護(hù)。

  過程CopyFile實(shí)現(xiàn)上述功能,它定義在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自動把當(dāng)前時間作為時間戳寫入文件。

  文件移動事實(shí)上是文件拷貝與文件刪除的結(jié)合。fmxutils單元中的MoveFile過程實(shí)現(xiàn)了這一功能。

上一頁  1 2 3 4 5 6 7 8 9 下一頁
  相關(guān)推薦:2010年9月計(jì)算機(jī)等級考試試題及答案解析專題
       預(yù)告:名師解析2010年9月計(jì)算機(jī)等級考試試題答案
       2010年9月計(jì)算機(jī)等級考試成績查詢時間及入口
       2010年9月計(jì)算機(jī)等考成績查詢短信免費(fèi)提醒開通
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本計(jì)算機(jī)等級考試網(wǎng)內(nèi)容,請注明出處。