程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 理解Delphi的類(十) - 深入方法(9)

理解Delphi的類(十) - 深入方法(9)

編輯:Delphi

簡單示例//所謂遞歸函數, 就是自己調用自己的函數, 先來個簡單的例子:{遞 歸調用的簡單示例}
procedure alert(i: Integer = 1);
begin
  ShowMessage(IntToStr(i)); {這是方法的功能}
  Inc(i);
  if i<10 then
   alert(i);        {這是方法自調用}
end;
{測試}
procedure TForm1.Button1Click(Sender: TObject);
begin
  alert; {會連續彈出 9 個對話框, 分別提示 1..9}
end;
深入方法[28] - 遞歸函數實例: 搜索當前目錄下的所有嵌套目錄

//上面一個例子不能說明遞歸函數的本質, 直接來個實用的函數吧, 剛好要 用.unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
//列出一個目錄下所有目錄(包括嵌套)的函數
procedure GetDirs(dirName: string; List: TStrings);
var
  SRec: TSearchRec;      {定義 TSearchRec 結構變量}
  dir: string;
const
  attr: Integer = faDirectory; {文件屬性常量, 表示這是文件夾}
begin
  dirName := ExcludeTrailingBackslash(dirName) + ''; {不知道最後是不是 ; 先去 掉, 再加上}
  dir := dirName + '*.*'; {加上 ; *.* 或 * 表示所有文件, 系統會把目錄也當作一 個文件}
  if FindFirst(dir, attr, SRec) = 0 then {開始搜索,並給 SRec 賦予信息, 返回0 表示找到第一個}
  begin
   repeat
    if (SRec.Attr = attr) and       {如果是文件夾}
     (SRec.Name <> '.') and       {排除上層目錄}
     (SRec.Name <> '..') then      {排除根目錄}
    begin
     List.Add(dirName + SRec.Name);   {用List記下結果}
     GetDirs(dirName + SRec.Name, List); {這句就是遞歸調用, 如果沒有這句, 只能搜索當前目錄}
    end;
   until(FindNext(SRec)<>0);        {找下一個, 返回0表示找到}
  end;
  FindClose(SRec);              {結束搜索}
end;
{測試}
procedure TForm1.Button1Click(Sender: TObject);
var
  list: TStrings;
begin
  list := TStringList.Create;
  GetDirs('C:Downloads', list);
  Memo1.Lines := list;
  list.Free;
end;
end.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved