求救!Memo保存到文件出错!(100分)

  • 主题发起人 主题发起人 panwen
  • 开始时间 开始时间
P

panwen

Unregistered / Unconfirmed
GUEST, unregistred user!
情况有点复杂,各位大侠一定要有耐心啊
我建了一个Form_Log的Mdi子窗口(主窗口Form_Main),这个子窗口主要是用来自动记录用户操作的一些信息的,上面放了:
一个Memo,信息就记录在这里;
一个checkbox,用来判断是否自动记录;
一个ClearButton,用来清空Memo;
一个SaveButton,用来手动保存记录;
一个LoadButton,用来打开以前的记录;
还有一个CloseButton,用来关闭子窗口。
主窗口上有一个NLog菜单用来打开子窗口。

现在常规的操作都没有问题,基本功能都能实现,但是在进行以下特殊操作时就会出错:
1.点击CheckBox,取消自动记录;
2.点击LoadButton,打开已有的记录;
3.点击CloseButton,关闭子窗口;
4.NLog菜单重新打开子窗口。
第四步之后程序就会出错,提示无法创建文件。


大侠们给看看到底是怎么回事:
//创建子窗口
procedure TForm_Log.FormCreate(Sender: TObject);
begin
TimeTitle := DatetoStr(Date) + ' ' + TimetoStr(time);
TimeTitleSave := DatetoStr(Date) + ' ' + FormatDateTime('hh-mm-ss',Time);
Form_Main.NLog.Checked := true;
CheckBox.Checked := true;
isopened := false;
Memo1.Lines.Add(TimeTitle);
end;

//关闭子窗口
procedure TForm_Log.CloseButtonClick(Sender: TObject);
begin
Close;
end;

//关闭子窗口
procedure TForm_Log.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form_Main.NLog.Checked := false;
Form_Log := nil;
Action:=caFree;
end;

//清空memo
procedure TForm_Log.ClearButtonClick(Sender: TObject);
begin
TimeTitle := DatetoStr(Date) + ' ' + TimetoStr(time);
TimeTitleSave := DatetoStr(Date) + ' ' + FormatDateTime('hh-mm-ss',Time);
Memo1.Clear;
isopened := false;
Memo1.Lines.Add(TimeTitle);
end;

//手动保存记录
procedure TForm_Log.SaveButtonClick(Sender: TObject);
var
ResultFileName : String;
begin
SaveDialog1.InitialDir := './Log';
SaveDialog1.FileName := TimeTitleSave;
if SaveDialog1.Execute then
begin
if FileExists(SaveDialog1.FileName) then
if MessageDlg(Format('Save changes to %s?', [SaveDialog1.FileName]),
mtConfirmation, mbYesNoCancel, 0) = idYes then
begin
ResultFileName := SaveDialog1.FileName;
Memo1.Lines.SaveToFile(ResultFileName);
Exit;
end
else
Exit;

ResultFileName := SaveDialog1.FileName + '.txt';
isopened := true;
AutoSaveFile := ResultFileName;
Memo1.Lines.SaveToFile(ResultFileName);
end;

end;

//手动打开记录
procedure TForm_Log.LoadButtonClick(Sender: TObject);
var
ResultFileName : String;
begin
OpenDialog1.InitialDir := './Log';
if OpenDialog1.Execute then
begin
ResultFileName := OpenDialog1.FileName;
AutoSaveFile := ResultFileName;
isopened := true;
Memo1.Lines.LoadFromFile(ResultFileName);
end
else
Exit;
end;

//自动记录CheckBox
procedure TForm_Log.CheckBoxClick(Sender: TObject);
begin
if CheckBox.Checked = true then
begin
SaveButton.Enabled := false;
LoadButton.Enabled := false;
N1.Enabled := false;
N2.Enabled := false;
end
else
begin
SaveButton.Enabled := true;
LoadButton.Enabled := true;
N1.Enabled := true;
N2.Enabled := true;
end;
end;


//在Memo内容改变时判断时候自动记录
procedure TForm_Log.Memo1Change(Sender: TObject);
var
ResultFileName : String;
begin
if CheckBox.Checked = true then
begin
if isopened then
ResultFileName := AutoSaveFile
else
ResultFileName := './Log/' + TimeTitleSave + '.txt';
try
Memo1.Lines.SaveToFile(ResultFileName);
finally

end;
end;
end;

//这是主窗口的NLog菜单
procedure TForm_Main.NLogClick(Sender: TObject);
begin
if not assigned(Form_Log) then
Form_Log := TForm_Log.Create(Application)
else
Form_Log.Close;
end;
 
检查关闭历史纪录后是否释放文件。
 
没有释放,我是用Memo的savetofile,loadfromfile方法打开和保存记录的,需要释放文件吗?怎么释放?
 
你检查这里,才窗口创建的时候是运行这里出错。
//ÔÚMemoÄÚÈݸıäʱÅжÏʱºò×Ô¶¯¼Ç¼
procedure TForm_Log.Memo1Change(Sender:TObject);
var
ResultFileName:string;
begin
if CheckBox.Checked=true then
begin
if isopened then
ResultFileName:=AutoSaveFile
else
ResultFileName:='./Log/'+TimeTitleSave+'.txt';
try
Memo1.Lines.SaveToFile(ResultFileName); //看这句的文件名称是什么?!!!
finally
end;
end;
end;
 
确实是这句出错,调试到这句的时候文件名称是刚创建的时间标题,有什么问题吗?
 
你看看这个时候,这个文件名称合法吗?
 
合法的,没有什么问题
 
程序调试的时候,出错位置最后是停在class单元,是因为FHandle<0造成的,是不是因为文件名不合法?
 
如果文件名称合法,那么这个文件是不是已经存在?
而且这个文件打开没有关闭?
 
文件名称是按照当前时间来定义的,应该不存在打开没有关闭的问题
 
你当前只是精确到秒钟。如果你关闭马上打开,想想会怎么样。
你可以看看传递出错的文件名称是不是存在啊,很简单的测试怎么就不试试?
 
这些我都试过了,这个错误能百分之百重现,只要按照那几个步骤操作肯定就报错。
怎么回事?
 
会不会是Johnny_du说的文件没有释放造成的,不过我是用SavetoFile和LoadfromFile存取文件的,也需要释放文件吗?
 
有下面的试下
memo1.Lines.LoadFromFile('文件');
memo1.Lines.SaveToFile('文件');
 
你的这句有问题,procedure TForm_Log.SaveButtonClick(Sender: TObject);
if FileExists(SaveDialog1.FileName) then
if MessageDlg(Format('Save changes to %s?', [SaveDialog1.FileName]),
mtConfirmation, mbYesNoCancel, 0) = idYes then
begin
ResultFileName := SaveDialog1.FileName;
Memo1.Lines.SaveToFile(ResultFileName);
Exit;
end
else
Exit;

无论什么情况都退出,还写下面的语句搞什么。
 
这句我倒没注意,确实是有问题,不过问题的关键还不在这里,感谢网中戏的提示,问题的原因已经找到了,是在关闭子窗口后程序的当前目录已经变成了./log了,所以当重新打开子窗口执行到 ResultFileName:='./Log/'+TimeTitleSave+'.txt'; 这句时自然是找不到/log/log目录,所以无法创建。
 
就这样吧,周一回来给大家分分
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
553
import
I
I
回复
0
查看
706
import
I
I
回复
0
查看
676
import
I
后退
顶部