请问delphi里面能不能子窗体发给主窗体消息(50分)

  • 主题发起人 主题发起人 audnyhu
  • 开始时间 开始时间
A

audnyhu

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,一个子窗体里面有个按钮,点击它之后打开另一个子窗体,第二个子窗体
存活期间把第一个子窗体释放了(当然这么做是会出问题的,因为第二个子窗体关闭
之后程序会回到第一个子窗体,但是这时候它已经被释放了),能不能这样实现,子
窗体一发一个消息给主窗体,然后把自己释放,由主窗体把第二个子窗体打开。
这是我的设想,不知道delphi里面怎么实现,请指点。谢谢!
 
如果第二个窗体不是模式显示,那么第二个窗体关闭第一个窗体没问题,只要第一个窗体不是
应用程序的主窗体
如果第二个窗体是模式显示,根本用不着发消息,因为第一个窗体根本不会响应的.
所以你的要求是没有必要的
 
同学,第二个窗体是模式显示(showmodal),但是第二个窗体关闭了之后,因为
它是第一个窗体打开的,所以程序会回到刚才打开第二个窗体的那句话的后面一句,
也就是第一个窗体中某个button的onclick事件里面,但是这个时候第一个窗体已经被
释放了,到这里就出错了。
 
如果是模式显示,可以说,你这种设计思想就是错误的!
只能根据被模式显示的窗体所返回的值来关闭第一个窗体.
如果非要这么做,那么只有另一个方法,用非模式显示来解决,
自己控制消息循环,我有一段代码能实现,小雨哥教的,不过在公司,如果需要明天再贴
 
呵呵,我想delphi应该还是可以实现子窗体给主窗体发一个消息,然后自己释放,
剩下的事情让主窗体来做的。难道delphi里面的模式显示就必须保证创建的比被
创建的窗体生命周期长吗?
 
我想这样描述应该更清楚一些,我的程序有三个窗体分别是frmMain,frm1,frm2,
现在frmMain和frm1已经创建了,frm1是显示在frmMain里面的(就是把frm1最底层的panel
的parent属性设成frmMain的一个Panel)。frm1上面有一个按钮,点击它之后我想打开frm2
(showmodal),但是我不想由frm1直接打开frm2,而是发一个消息或者事件给frmMain,
由frmMain来打开frm2,也就是说没有frm1什么事了。
呵呵,我想我的要求应该不算过分吧。多谢解惑。
 
好像没有必要发送消息呀!我刚刚试过了,代码如下:
主窗体是Form1,第一子窗体是Form2,第二子窗体是Form3,将Form2和Form3都设为不能自动建立的窗体
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.Show;
end;

end.
//--------------------------------------------------------------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
uses Unit3;
{$R *.DFM}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Application);
Form3.Show;
Form2.Release;
end;

end.
//-----------------------------------------------------------------
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm3.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.Show;
Form3.Release;
end;

end.
 
呵呵,谢谢ysai和小笨苯的回答。
但是第一,第三个窗体应该是模式显示(showmodal)的,而不是(show)
第二,不是有没有必要发消息的问题,而是怎么发消息的问题,呵呵,好像我的问题
被换掉了(我没有描述清楚)。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
UniqueMsgID: Cardinal;
procedure WndProc(var Msg: TMessage);
override;
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{ 自定义一个消息常量 }
UniqueMsgID := RegisterWindowMessage('shiwei is a girl 10:50:20');
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
if Msg.Msg = UniqueMsgID then
//收到消息后,在标题栏上写上“哈哈哈,收到啦!!”
Caption := '哈哈哈,收到啦!!';
inherited WndProc(Msg);
end;

end.
//---------------------------------------------------------------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
uses Unit3, Unit1;
{$R *.DFM}
procedure TForm2.Button1Click(Sender: TObject);
begin
// Form3 := TForm3.Create(Application);
// Form3.Show;
// Form2.Release;
SendMessage(HWND_BROADCAST, Form1.UniqueMsgID, 0, 0);
//以广播的方式发送消息
end;

end.
 
谢谢小笨苯,我的问题解决了。
 
后退
顶部