奇怪的问题,关于多线程的!热心的弟兄详看里面内容! ( 积分: 50 )

  • 主题发起人 主题发起人 bylove
  • 开始时间 开始时间
B

bylove

Unregistered / Unconfirmed
GUEST, unregistred user!
里面出问题的地方标记:为什么这里出错了? ,请高手指点:
主界面里面是:
procedure TForm1.Button4Click(Sender: TObject);
begin
with TForm2.Create(self)do
begin
try
ShowModal;
finally
free;
end;
end;

end;
在子窗口里面有个进度条,有个按钮,按钮的内容是执行读取一个文件逐行处理
procedure TForm2.Button2Click(Sender: TObject);
begin
Memo1.Clear;
//创建导入线程,导入数据库
FThread := TReadPhoneListThread.Create(Trim(edit1.Text), 1);
FThread.Resume;
end;
//下面是线程的方法
constructor TReadPhoneListThread.Create(AFileName: string;
AClass: integer);
begin
FFileName := AFileName;
inherited Create(False);
//false表示创建后先挂起
end;

procedure TReadPhoneListThread.Execute;
var
vFile: TextFile;
S, vName, vPhone: string;
function GetLineCount: integer;
var
i: Integer;
s: string;
begin
AssignFile(vFile, FFileName);
Reset(vFile);
i := 0;
while not Eof(vFile)do
begin
Readln(vFile, s);
Inc(i);
end;
CloseFile(vFile);
Result := i;
end;
begin
FreeOnTerminate := True;
//标示线程结束时自动释放你的TThread对象
if fileexists(FFileName) then
begin
//取得文件总行数
FCount := GetLineCount;
//把总行数信息送到主界面
Synchronize(SendCountToGauge);
//SendCountToGauge是线程中定义的把线程内部参数值传给窗口的函数
//重新打开文件
FCurrent := 0;
Synchronize(SendCurrToGauge);
AssignFile(vFile, FFileName);
Reset(vFile);
//打开
while not Eof(vFile)do
//开始循环处理
begin
S := '';
FName:='';
FPhone :='';
ReadLn(vFile, S);
//读一行信息;
if Length(Trim(s)) <> 0 then
begin
//开始处理,解析名称和手机号
FName := Copy(s, 1, Pos(#9, s) - 1);
//取得姓名
FPhone := Copy(s, Pos(#9, s) + 1, Length(s) - Pos(#9, s) + 1);
//取得号码
Synchronize(SendInfotoMemo);
//插入数据库;
//刷新进度
inc(FCurrent);
Synchronize(SendCurrToGauge);
end;
Sleep(10);
end;
//通知主窗体完成了
Synchronize(SendFinishedToInterface);
end;
end;

procedure TReadPhoneListThread.SendCountToGauge;
begin
Form2.ProgressBar.Max := FCount;
//为什么这里出错了?
Form2.ProgressBar.Update;
end;

procedure TReadPhoneListThread.SendCurrToGauge;
begin
Form2.ProgressBar.Position := FCurrent;
// 为什么这里出错了?
Form2.ProgressBar.Update;
end;

procedure TReadPhoneListThread.SendFinishedToInterface;
begin
{}
end;

procedure TReadPhoneListThread.SendInfotoMemo;
begin
Form2.Memo1.Lines.Add(FName+'_'+FPhone);
//为什么这里出错了?
Form2.Memo1.Update;
end;
 
模式窗体没这写法
with TForm2.Create(self)do
一般是 with TForm2.Create(nil)do
,最后finally free
你出错的地方都在form2 ,你这form2我猜肯定是在程序启动的时候创建的
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.Run;
改下
procedure TForm1.Button4Click(Sender: TObject);
var
form2 : tform2;
begin

form2 := TForm2.Create(nil);
with form2do
begin
try
ShowModal;
finally
free;
end;
end;

end;
你的程序我没运行,自己试下
 
楼上的说法我猜也是的
 
To: lisongmagic
多谢你的答案,给我很大帮助,但是为什么不能用模式窗体呢?很想和你沟通,多谢了!
我的QQ号码是:672632,MSN是:delphi2008cn@hotmail.com
To:天浪影
还是很感谢你得回复,希望有机会多交流!我的QQ号码是:672632,MSN是:delphi2008cn@hotmail.com
 
后退
顶部