請教各位前輩們 這個遞迴程式該怎麼寫@@ |
答題得分者是:小傑克
|
terrygobb
一般會員 ![]() ![]() 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
各位前輩們 您們好
近來小弟在寫一個搜尋檔案裡面所有的.mp3的檔案 但在找尋過文章以後,發現自己卡在一個很重要的地方 就是呼叫本身的方法時,我不曉得該傳什麼參數 以至於就卡住了@@" 程式碼如下 [code delphi] procedure TForm1.btnInputClick(Sender: TObject); var T : TSearchRec; FileCount,Err,Count : Integer; path : string; begin listMusic.Clear; Err := FindFirst('*.mp3',faAnyFile,T); while (Err = 0) do begin if (T.Name[1] <> '.') then path := ExpandFileName(T.Name); if (T.Attr and faDirectory) = 0 then begin listMusic.Items.Add(path); end; if ((T.Attr and faDirectory) <> 0 ) and (T.Name[1] <> '.') then begin ChDir(T.Name); // GetSearchAllMusic(Obj); ==>就是這邊啦@_@" 請教一下各位前輩們 Chdir('..'); end; Err := FindNext(T); end; end;[/code] 我是希望能寫成一個mathod啦 然後呼叫即可,望前輩們幫忙解答一下,感恩~
------
尋找對的人,對的方法,對的態度跟對的環境 編輯記錄
terrygobb 重新編輯於 2009-05-07 16:23:43, 註解 無‧
|
小傑克
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
我之前寫過這個功能, 給你參考
[code delphi] function GetAllFileName(sPath:String;ShowFullPath,FindSubPath:boolean;const Filter:String='*.*'):String; var o:TStringList; function BindFilePath(sFullPath,sFileName:String):String; begin if ShowFullPath then Result := sFullPath '\' sFileName else Result := sFileName ; end; procedure AddFileList(sPath:String); var sr:TSearchRec; begin if trim(sPath) = '' then exit; if sPath[Length(sPath)] = '\' then Delete(sPath,Length(sPath),1); if FindFirst(sPath '\' Filter,faAnyFile-faDirectory , sr) = 0 then begin repeat begin if sr.Name='.' then Continue; if sr.Name='..' then Continue; o.Add(BindFilePath(sPath,sr.Name)); end until FindNext(sr) <> 0; FindClose(sr); end; if FindSubPath then begin if FindFirst(sPath '\*.*',faDirectory, sr) = 0 then begin repeat begin if sr.Name='.' then Continue; if sr.Name='..' then Continue; AddFileList(sPath '\' sr.Name); end until FindNext(sr) <> 0; FindClose(sr); end; end; end; begin o := TStringList.Create ; AddFileList(sPath); Result := o.Text; o.Free; end; procedure TForm1.Button5Click(Sender: TObject); begin Memo1.Lines.Text := GetAllFileName( 'e:\test',true,true,'*.pas'); end; [/code] 因為我用D7 還不能處理unicode ,所以我還另寫了一個WideString的版本,不然像日文檔名會有問題, 但是因為當時配合其他功能跟TNT unicode元件寫的綁在一起, 切出來很麻煩,那是另一個主題了
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-05-07 20:17:38, 註解 無‧
|
terrygobb
一般會員 ![]() ![]() 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
|
terrygobb
一般會員 ![]() ![]() 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
以下是我自己研究小傑克前輩的程式碼以後所衍生出來的東西
功能是正常啦,也還蠻開心的 可以指定路徑搜尋相關的.mp3檔案 但有一事不解,關於小傑克前輩的寫法 全部灌在同一個方法裡面在寫另一個方法的時候 我的程式碼就顯示紅線了 我不太曉得其中的道理,因為自己之前在寫程式的時候 完全沒有想到procedure裡面在寫令外一個 procedure 或者 function 都是中規中矩的一個procedure呼叫另外一個procedure 或者 function 以下是我測試出來的結果 ^^ [code delphi] procedure TForm1.GetSearchAllFile(Spath : string); var Rec : TSearchRec; begin if FindFirst(Spath '\*.*',faAnyFile,Rec) = 0 then begin while FindNext(Rec) = 0 do begin if Rec.Name[1] = '.' then Continue; if (Rec.Attr <> fadirectory) and ((UpperCase(ExtractFileExt(Rec.Name)) = '.MP3')) then Form1.listMusic.Items.Add(spath '\' Rec.Name); if Rec.Attr = fadirectory then GetSearchAllFile(Spath '\' Rec.Name); Application.ProcessMessages(); end; end; FindClose(Rec); end; [/code]
------
尋找對的人,對的方法,對的態度跟對的環境 |
小傑克
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
其實function A裡面夾function B還蠻好用的, 可能B是別的地方不會共用,但是在 A 裡面卻要呼叫很多次 就可以這樣寫, 只要注意使用變數的 可見範圍就可以 procedure TForm1.Button9Click(Sender: TObject); function myget(ss:String):string; begin Result := s ss; //這樣在編譯期間是會錯誤的, 因為他不認識s end; var s:String; begin s:='a'; ShowMessage(myget(s)); end; ---------------------------------------------------------- procedure TForm1.Button9Click(Sender: TObject); var s:String; //這樣編譯就不會錯誤 function myget(ss:String):string; begin Result := s ss; end; begin s:='a'; ShowMessage(myget(s)); end; --------------------------------------------------------------- procedure TForm1.Button9Click(Sender: TObject); var i:integer; function myget(ss:String):string; begin for i := 0 to 10 do //這樣是會錯誤的, 因為[Error] Unit1.pas(300): For loop control variable must be simple local variable begin end; Result := ''; end; begin for i := 0 to 10 do begin end; ShowMessage(myget(s)); end; ---------------------------------------------------------------- procedure TForm1.Button9Click(Sender: TObject); var i:integer; //這樣寫是可以的 function myget(ss:String):string; begin Result := ''; end; var s:String; //這樣寫是可以的,只是myGet裡面能用i , 不能用s而已 begin s:=''; ShowMessage(myget(s)); end;
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-05-12 18:10:46, 註解 無‧
|
terrygobb
一般會員 ![]() ![]() 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |