IdTCPServer的OnExecute事件中创建窗体的问题

喝口水 2008-05-11 07:30:17
简单的程序:看代码
unit Unit1;

interface

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

type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
IdAntiFreeze1: TIdAntiFreeze;
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
uses
msg;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
str:string;
begin
str:=AThread.Connection.ReadLn('');
fmsg:=TFmsg.Create(application);
fmsg.s:=str;
fmsg.Show;
end;

end.

unit msg;

interface

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

type
TFmsg = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
s:string;
end;

var
Fmsg: TFmsg;

implementation

{$R *.dfm}

procedure TFmsg.FormCreate(Sender: TObject);
begin
memo1.Lines.Add(s);
end;

procedure TFmsg.Button1Click(Sender: TObject);
begin
close;
end;

end.
...全文
168 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
thyzkw 2010-10-19
  • 打赏
  • 举报
回复
我没搞清。。。楼主能给我讲下吗..我现在也正好碰到这个问题..我的邮箱 thyzkw@163.com
谢谢
youcheng1 2008-07-17
  • 打赏
  • 举报
回复
你两个客户端同时发消息试一下。
喝口水 2008-05-13
  • 打赏
  • 举报
回复
终于搞清了,现在结贴
喝口水 2008-05-13
  • 打赏
  • 举报
回复
再顶,期待更好的解决办法,请不要再说什么Synchronize,Synchronize是Thread类的一个方法
youcheng1 2008-05-11
  • 打赏
  • 举报
回复
楼上的人呀,呵呵~~,由于是服务器是多线程的,在线程中使用VCL需要同步VCL上线程。
例如,声名一个showfrm过程。
procedure showfrm;
begin
// 在这里显示窗体
end;

然后用Synchronize方法调用showfrmf过程就OK了。
  • 打赏
  • 举报
回复
就是服务器接受数据的时候不要创建窗口,发一个消息给主窗口,由住窗口创建这个新创建的窗口
badgirlxiaoxiao 2008-05-11
  • 打赏
  • 举报
回复
好像不是一个窗体哦
呵呵,加sleep(2)也不行么?
badgirlxiaoxiao 2008-05-11
  • 打赏
  • 举报
回复
窗体等待线程结束,线程等待窗体创建,死循环
yueyeli 2008-05-11
  • 打赏
  • 举报
回复
帮忙顶
喝口水 2008-05-11
  • 打赏
  • 举报
回复
没看听白,能不能具体一点
喝口水 2008-05-11
  • 打赏
  • 举报
回复
再顶
喝口水 2008-05-11
  • 打赏
  • 举报
回复
uses
msg;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
str:string;
FHandle:THandle;
begin
str:=AThread.Connection.ReadLn('');
FHandle:=FindWindow( nil, '显示信息' );
if FHandle=0 then
begin
fmsg:=TFmsg.Create(application);
fmsg.s:=str;
fmsg.ShowModal;
end;
end;
上面的代码可以实现了,但是如果是show的话程序不死,但显示不了窗口创建的窗口。只能使用showmodal了
可是使用showmodal的话,在关掉主窗体的时候,会出现错误
  • 打赏
  • 举报
回复
这个是在工作线程中执行的,别在工作线程中创建对话框.

你将创建对话框的代码放到主窗口的线程中,然后用PostThreadMessage
将创建窗口的消息放到主线程中.
喝口水 2008-05-11
  • 打赏
  • 举报
回复
楼上的说的对,ShowModal确实可以,但是我就纳闷了,为啥show就不行呢,还有就是如果仅仅创建,但不ShowModal的话同样也死掉
喝口水 2008-05-11
  • 打赏
  • 举报
回复
上面的代码运行没问题,但是只要客户端一发送字符串,程序马上就会死掉,我想问是不是这个事件中如何才能创建窗体呀
下面是客户端的代码
procedure TForm1.Button2Click(Sender: TObject);
begin
try
IdTCPClient1.Host:='127.0.0.1';
IdTCPClient1.Port:=5000;
IdTCPClient1.Connect;
showmessage('连接成功');
except
showmessage('连接失败');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn(edit1.Text);
end;
badgirlxiaoxiao 2008-05-11
  • 打赏
  • 举报
回复
我刚才试验了一下,把show变为ShowModal就好了
但前提是显示的为主程序,不能关闭
execute里要依赖它

小和,说说你的看法吧
hongqi162 2008-05-11
  • 打赏
  • 举报
回复
按照你的方法屏幕上会出现n个层叠的Fmsg窗口
hongqi162 2008-05-11
  • 打赏
  • 举报
回复
你调试一下,看看FHandle的值,以前做过一个东西就是将UDP接收到的数据在FormDialog中显示出来,如果FormDialog被用户关闭了就创建一个并且显示出来,如果存在就向这个窗口添加要显示的数据,调试的时候注意FindWindow,他会找到你设计期的Form
喝口水 2008-05-11
  • 打赏
  • 举报
回复
那肯定是不断的在创建,而没有资源的释放,实际上你想得到的结果已经有了

这个不是问题,我只是让其接收一个字符串,然后显示,所以不会出现不断创建的情况
喝口水 2008-05-11
  • 打赏
  • 举报
回复
我当然有别的作用了,我把问题化简了一下,把这个问题解决了就解决我那个问题了
我是在onshow事件中显示的,显示应该没问题,问题的关键是在onExecute事件中没法把窗体创建起来
加载更多回复(5)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧