很奇怪的问题!!200分(200分)

  • 主题发起人 主题发起人 fbc-gc
  • 开始时间 开始时间
F

fbc-gc

Unregistered / Unconfirmed
GUEST, unregistred user!
程序代码:
procedure TForm2.BitBtn3Click(Sender: TObject);
begin
form2.Visible:=false;
form1.Enabled:=true;
form1.Visible:=true;
form1.Timer1.Enabled:=true;
end;

procedure TForm2.FormShow(Sender: TObject);
var
line:string[40];
begin
form2.ComboBox1.Items.Clear;
form2.Edit1.Clear;
form2.Edit2.Clear;

AssignFile(word_file,WordFileName);//第一次执行时无错,调用opendialog后出错
try
reset(word_file);
except
on EInOutError do
begin
showmessage('缺少配置文件'+WordFileName);
Application.Terminate;
end;
end;

while(not eof(word_file)) do
begin
readln(word_file,line);
if (line<>'') then
form2.ComboBox1.Items.Add(copy(line,1,pos('=',line)-1));
end;
closefile(word_file);

end;

procedure TForm2.BitBtn4Click(Sender: TObject);

begin
if (form2.Edit2.Text='') or (form2.Edit2.Text='') then
begin
showmessage('请填写全部信息');
exit;
end;

Assignfile(word_file,wordfilename);
try
Append(word_file);//到此出错!!
except
on EInOutError do
begin
showmessage('缺少配置文件'+wordFileName);
Application.Terminate;
end;
end;
writeln(word_file,form2.Edit2.Text+'='+form2.Edit1.Text);

closefile(word_file);
end;


procedure TForm2.Button1Click(Sender: TObject);
var
PD:TOpenDialog;
begin
PD:=TOpenDialog.Create(form2);
PD.Filter:='词库文件|*.wrd';
if PD.Execute then
form2.Edit1.Text:=PD.FileName;
PD.Destroy;
end;
奇怪的问题:
我动态的创建了一个TOpenDialog,用它来得到一个文件的路径,将其保存到form2.edit1.text
里,然后点击button2时,通过form2.edit1.text将TOpenDialog得到的文件路径保存到一个文件
里(word_file).但当执行到Append(word_file)时出现错误:invalid filename.但未调用
OpenDialog前可以打开这个文件并能读出信息(读完信息后closefile(word_file));

 
真没有高人吗?是不是嫌小弟的分太少呀?可我已经是倾其所有了。
 
可能是你的文件未关闭,用Try 。。。Finally 。。。 End保护吧。
 
Assignfile(word_file,wordfilename)
begin
if FileExists(word_file) then // 在这里单步执行看一看word_file是多少吧!
begin
...
end;
end;


加上FileExists 判断一下吧!
 
文件在form2.show最后已经关闭。难道form2.show要持续到点击button1之后吗?
另外 try....except和Try 。。。Finally 。。。 End有什么区别吗?
我是初学者,请多多指教
谢谢你
 
你的WordFileName是不是有问题,是不是正确赋值了(我就没有看到它在那里被赋值了)
 
看看 Append 过程的帮助,说明了
Assign(F, FileName);
Append(F); //这里如果上面 Assign 中 FileName 对应的外部文件不存在时,Append 会
报错的。因此如果名字为 FileName 的文件不存在时,你必须先创建这个文件。可以用
FileExists 判断是否存在,用 ReWrite 创建文件。
 
unit setall;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls;

type
TForm2 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label1: TLabel;
ComboBox1: TComboBox;
Label5: TLabel;
ColorBox1: TColorBox;
Label6: TLabel;
Label7: TLabel;
ColorBox2: TColorBox;
ColorBox3: TColorBox;
GroupBox1: TGroupBox;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit2: TEdit;
BitBtn4: TBitBtn;
TabSheet3: TTabSheet;
TrackBar1: TTrackBar;
Label4: TLabel;
TrackBar2: TTrackBar;
Label8: TLabel;
TabSheet4: TTabSheet;
Button1: TButton;
procedure BitBtn3Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const
wordfilename:string[30]='data/filelist.ini';
var
Form2: TForm2;
word_file: textfile;

implementation
uses speedword;
{$R *.dfm}

procedure TForm2.BitBtn3Click(Sender: TObject);
begin
form2.Visible:=false;
form1.Enabled:=true;
form1.Visible:=true;
form1.Timer1.Enabled:=true;
end;

procedure TForm2.FormShow(Sender: TObject);
var
line:string[40];
begin
form2.ComboBox1.Items.Clear;
form2.Edit1.Clear;
form2.Edit2.Clear;

AssignFile(word_file,WordFileName);
try
reset(word_file);
except
on EInOutError do
begin
showmessage('缺少配置文件'+WordFileName);
Application.Terminate;
end;
end;

while(not eof(word_file)) do
begin
readln(word_file,line);
if (line<>'') then
form2.ComboBox1.Items.Add(copy(line,1,pos('=',line)-1));
end;
closefile(word_file);

end;

procedure TForm2.BitBtn4Click(Sender: TObject);

begin
if (form2.Edit2.Text='') or (form2.Edit2.Text='') then
begin
showmessage('请填写全部信息');
exit;
end;

Assignfile(word_file,wordfilename);
if FileExists(word_file) then showmessage('yes') else showmessage('no');
try
Append(word_file);
except
on EInOutError do
begin
showmessage('缺少配置文件'+wordFileName);
Application.Terminate;
end;
end;
writeln(word_file,form2.Edit2.Text+'='+form2.Edit1.Text);
form2.ComboBox1.Items.Add(form2.Edit1.Text);
closefile(word_file);
end;


procedure TForm2.Button1Click(Sender: TObject);
var
PD:TOpenDialog;
begin
PD:=TOpenDialog.Create(form2);
PD.Filter:='词库文件|*.wrd';
if PD.Execute then
form2.Edit1.Text:=PD.FileName;
PD.Destroy;
end;

end.
//////////////////////////////////////////////////////////////////////////////
word_file和wordfilename是一个全局量.并且那个文本文件确实存在,因为在第一次form2.show
时成功的从该文件里读取了数据呀。
最重要的一点是,如果不通过TOpenDialog.excute取得文件名和路径(把得到的文件名放到
edit1.text里),直接在edit1输入文件名和路径,则程序不会出现问题。可这样很麻烦呀。

 
1、wordfilename 怎么只有半截?用全路径试试,至少前面也要加个 '/' 吧,'/data/...ini'
2、FileExists(word_file) 这样能通过编译?应该用文件名 FileExists(wordfilename);
3、procedure TForm2.BitBtn4Click(Sender: TObject);
...
if (form2.Edit2.Text='') or (form2.Edit2.Text='') then //两个条件一样?
4、没看到你在哪里将 form2.edit1.text 赋给 wordfilename 作为 Assignfile 中的文件名啊。
5、试试用对文件操作时用 try...finally...end 结构保证文件被关闭,如:
AssignFile(word_file, wordfilename);
try
reset(...);
...
finally
CloseFile(word_file);//try 到 finally 之间发生异常这句话也会执行
end;
 
谢谢bbkxjy.
1加全路径也是一样;
2,3一时笔误,呵呵,见笑。
4 不是‘将 form2.edit1.text 赋给 wordfilename 作为 Assignfile 中的文件名’,而是
将opendialog.execute得到的文件名显示在form2.edit1里(这样人机界面比较友好吧)然后将
将form2.edit1里的内容保存到word_file里。
最重要的一点:不通过opendialog.execute得到文件名和路径而在form2.edit1里直接输入
文件名和路径,然后保存不会产生问题。
5谢谢!

 
to fbc-gc:
你试过用带盘符的绝对路径了吗?我想如果用相对路径的话,就会在 Current Directory
中查找文件,而使用 OpenDialog 打开文件时,如果切换了目录,将会改变 Current Directory,
之后就会找不到文件了。
 
有道理!!!如果是这样的话,那就是问题所在了!!!!
那我能用opendialog限制用户只在制定用户中查找文件吗?
真的很谢谢你!!!
 
能不能不让让用户改变opendialog的当前目录?
谢谢!
 
奇怪,提交时显示"无法保存数据",只好重写。
限制只能在当前目录下选文件似乎不行,TSaveDialog 封装的是 Windows 的 Common Dialog,
目录改变时只能得到通知消息。除非自己做个类似的对话框。
但可以让 SaveDialog Execute 之后保证 Current Directory 不变。设置 Options 中的
ofNoChangeDir 为 True,应该就可以了。帮助上是这么说的。
 
后退
顶部