请各位打下帮忙查查错!!(100分)

  • 主题发起人 主题发起人 入门
  • 开始时间 开始时间

入门

Unregistered / Unconfirmed
GUEST, unregistred user!
unit guangquguan;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)

Button1: TButton;

OpenDialog1: TOpenDialog;

Button2: TButton;

Edit1: TEdit;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormDestroy(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure FindFile(path:string);

end;


var

Form1: TForm1;

SearchRec: TSearchRec;

F: TextFile;

s:string;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

FindFile(Edit1.Text);

end;



procedure TForm1.FormCreate(Sender: TObject);

begin

assignfile(f,'e:/text.txt');

append(F);

end;


procedure TForm1.Button2Click(Sender: TObject);

begin

postquitmessage(0);

end;

procedure TForm1.FindFile(path:string);

var

path1:string;

begin

try

FindFirst(path+'*.*',faAnyFile{ and not faDirectory}, SearchRec);

if FindNext(SearchRec)<>0 then PostQuitMessage(0);

while FindNext(SearchRec) = 0 do

begin

s:=string(Searchrec.Name);

writeln(f,s);

if (SearchRec.Attr and fadirectory>0) then

begin

writeln(f,'');

try

path1:=path+String(SearchRec.Name)+'/';

Form1.FindFile(path1);

except

PostQuitMessage(0);

end;

end;

end;

FindClose(SearchRec);

except

FindClose(SearchRec);

PostQuitMessage(0);

end;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

CloseFile(F);

end;


end.
我想让此程序按照递归的方法查找指定目录下的全部内容(包括所有子文件夹及
文件),但是他总是达不到预期目的。

举个例子说,D盘下有如下文件及文件夹:

文件夹:WIN98,PICTURES,CD,MP3;

文件:新建 文本文档.txt,新建 文本文档(2).txt

此程序运行后在EDIT1内填上D:/,则在文件text.txt中出现的是:

desktop.ini
新建 文本文档.txt
mp3

11.MP3
水手.mp3
月亮.mp3
墮落天使.mp3
迟来的春天.mp3
一生不变.mp3
幻影.mp3
想和你吹风.mp3
爱的根源.mp3
都市恋歌.mp3
爱在深秋.mp3
你給我的爱最多.mp3
谁可改变.mp3
LINDA.mp3
一路上有你.mp3
相信她.mp3
desk

我实在找不出原因,请各位打下指点。







 
注意改动处!!!
procedure TForm1.FindFile(path:string);
var
SearchRec :TSearchRec; //(1)!!!
path1:string;
begin
try
if FindFirst(path+'*.*',faAnyFile, SearchRec)<>0 then
begin
Exit;
end;
if FindNext(SearchRec)<>0 then PostQuitMessage(0);
while FindNext(SearchRec) = 0 do
begin
s:=Searchrec.Name;
if ((SearchRec.Attr and fadirectory)>0) then
begin
writeln(f,'<'+s+'>');
try
path1:=path+s+'/';
Form1.FindFile(path1);
except
PostQuitMessage(0);
end;
end
else
Writeln(F,s);
end;
finally //(2)!!
FindClose(SearchRec);
end;
end;
 
我不太清楚,你为什么喜欢用PostQuitMessage,而不用Delphi的Exit?
另外我改了一下程序,使它更好一点:
procedure TForm1.FormCreate(Sender: TObject);
var
fname :string;
begin
fname := 'd:/test.txt';
if not FileExists(fname) then
FileClose(FileCreate(fname));
assignfile(f,fname);
Rewrite(F);
end;
 
小弟不得要领,为什么将SearchRec :TSearchRec放入函数内部就行了呢?
还请指点。
(此100分已是打下你的了)
 
还有,POSTQUITMESSAGE是不是有何不妥之处,还请打下指出。
 
因为你做的是递归函数,所以里面的变量要定义成局部的!
具体一点:当你递归的时候,此函数内部的局部变量将压栈,因此返回时此局部变量
的值不会变化!而全局变量在递归时不会压栈,如果函数里对其进行了操作,返回时
就不会是递归前的值了!不知道我这样讲你能否听懂?
要注意的是递归的时候尽量不要用全局变量!
 
用postQuitMessage的结果是使程序退出(一般你可能不需要一遇到错误就直接退出
程序),所以我一般不用这个函数,如果对你上面的程序改进一下的话,我会去掉这
些语句,改成exit,并把FindFile定义成返回成功与否的函数。
 
多谢打下!
 
后退
顶部