全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1557
推到 Plurk!
推到 Facebook!

請教各位前輩們 這個遞迴程式該怎麼寫@@

答題得分者是:小傑克
terrygobb
一般會員


發表:5
回覆:22
積分:5
註冊:2009-04-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-07 16:22:27 IP:220.130.xxx.xxx 訂閱
各位前輩們 您們好

近來小弟在寫一個搜尋檔案裡面所有的.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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-07 20:04:54 IP:59.112.xxx.xxx 訂閱
我之前寫過這個功能, 給你參考 
[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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-07 22:46:06 IP:61.227.xxx.xxx 訂閱
謝謝小傑克前輩肯回答我這個問題

希望不久的將來我也可以跟您一樣,來這邊回答別人的問題

當然啦,這是我對自己的期望及目標

感謝您肯撥空把您的程式碼貼出來給我看,感謝^^
------
尋找對的人,對的方法,對的態度跟對的環境
terrygobb
一般會員


發表:5
回覆:22
積分:5
註冊:2009-04-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-12 15:44:44 IP:220.130.xxx.xxx 訂閱
以下是我自己研究小傑克前輩的程式碼以後所衍生出來的東西

功能是正常啦,也還蠻開心的

可以指定路徑搜尋相關的.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]
------
尋找對的人,對的方法,對的態度跟對的環境
編輯記錄
terrygobb 重新編輯於 2009-05-12 15:47:02, 註解 無‧
terrygobb 重新編輯於 2009-05-12 15:47:43, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-12 18:00:50 IP:59.115.xxx.xxx 訂閱

其實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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-12 19:33:25 IP:61.227.xxx.xxx 訂閱
真是太感謝您了

小弟一定好好研讀

謝謝您的細心 我一定會盡量解決自己的問題的^^~

感謝小傑克前輩的用心 感恩^^
------
尋找對的人,對的方法,對的態度跟對的環境
系統時間:2024-05-17 0:21:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!