在indy控件IdTCPServer OnExecute中显示Form的问题(200分)

  • 主题发起人 主题发起人 lightning_zy
  • 开始时间 开始时间
L

lightning_zy

Unregistered / Unconfirmed
GUEST, unregistred user!
想在IdTCPServer接受到信息的时候显示一个其他的form,代码如下,在显示form2的时候
出问题,不能显示form2上的按钮等控件,而且好像form2没有响应,请问哪位大侠知道应
该怎么解决
。。。。
implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
button1.Caption:=AThread.Connection.ReadLn();
form2.Show;
end;
。。。。。。。。。。

 
呵呵,改成這樣,就可以了:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
button1.Caption:=AThread.Connection.ReadLn();
AThread.Connection.DisConnect;
form2.Show;
end;
為什麼呢? 因為當存在Tcp連接線程時,OnExecute事件是不停的觸發,以滿足查詢方式的
需要,你只要處理完了之后,將該連接中斷,就可以了.
又或者,你可以改成:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Str:string;
begin
Str:=AThread.Connection.ReadLn();
if Str<> '' then //在實際收到信息之后才相應的處理.
begin
button1.Caption:=Str
form2.Show;
end;
end;
具體要怎樣寫,就看你的需要了.
 
还是不行啊,请看一下程序有什么问题或者贴一个可用的代码让我比较一下吧,代码如下
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,
IdAntiFreezeBase, IdAntiFreeze;

type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
Button1: TButton;
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
button1.Caption:=AThread.Connection.ReadLn();
AThread.Connection.Disconnect;
form2.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
end;

end.
-------------------------------
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze;

type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
//edit1.Text:=Form1.Button1.Caption;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
//Form2.Visible:=False;
end;

end.
 
沒理由啊,你是不發送了大批量的數據,或者有多個客戶端連接啊.
再試試:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Str:string;
begin
Str:=AThread.Connection.AllData;//讀取所有數據...
if Str <> '' then
begin
button1.Caption:=Str;
AThread.Connection.Disconnect;
form2.Show;
end;
end;
 
另外客戶端寫成如下形式.
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Connect;
try
IdTCPClient1.Write('OK');
finally
IdTCPClient1.Disconnect;
end;
end;
 
我ft了,还是不行,form2上的Edit ,Button什么的都显示不出来,:(
 
怎麼會這樣呢,我測試過沒問題的. 你的Form2是不是普通的窗體?
 
怪异啊,我如果在IdTCPServer1Execute函数调用Form2.show之前调用一次Form2.show,再close掉,以后就都正常了;否则就一定会出问题,Form2上的button,edit什么就都显示不出来,so ft
 
OnExecute中的AThead是一个线程,所以你必须用
AThread.Synchronize(ShowForm2);

ShowForm2 声明如下:
procedure TForm1.ShowForm2;
begin
if not Form2.Visible then
Form2.Show;
end;


 

Similar threads

S
回复
0
查看
893
SUNSTONE的Delphi笔记
S
S
回复
0
查看
871
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部