关于form1中无法控制form2.checkbox续,原来form2是tform2的派生出来一个实例!现在我任要达到目的,用什么办法好?(100分)

  • 主题发起人 主题发起人 del520
  • 开始时间 开始时间
D

del520

Unregistered / Unconfirmed
GUEST, unregistred user!
上午发一贴http://www.delphibbs.com/delphibbs/dispq.asp?lid=2198442,问为啥mainform中不能控制FORM2.checkbox,根据[放心]的堤示,找到了原因,我的form2只
是Tform2的一个实例,它真的名字是form2_1(调用次数多了就变成_2或是_3...),所以我在mainform中使用form2.checkbox1.checked:=true 根本没反映!

现在,我任要在mainform中使用控制那个form2中的checkbox1
我该怎样办?
 
不会吧,这种情况应该你们也会碰到的啊,用什么方法解决好啊.
 
你的mainform中会生成很多动态form2吗,我觉得你可以在生成form2时记住form2的handle,然后用postmessage()向form2发消息,form2收到特定的消息后就完成特定的操作。如果你的form2很多,可以记在链表里头,用hash表来查找。我刚做完的一个项目就是这样处理的。而且更复杂。我要控制很多form2中的动态生成的控件和chart中的fastlineseries。
 
我有个按钮,点击之后要打开FORM2,然后还要在FORM2实现一些其它的操作.
所以我就使用了
with tform2.create(self) do
begin
.....
end;
但这样弄之后,mainform上有一个按扭必要时要用来控制form2上的一个checkbox,现在
这种情况就不能控制.

hawkview
你所说的我没怎么看懂,能不能举个例子?
 
感觉有点乱,你在 MainForm 的 Panel1 上到底创建了多少个 TForm2 啊?
而且 你的如下语句
with tform2.create(self) do
begin
.....
end;
没有对你创建的每一个 TForm2 的实例作记录,
这样你再想访问你创建的这些 Form2 就费点事了。
能不能把你的部分代码贴上来参考一下

 
记住窗口的指针
 
to 放飞,谢谢你再来救我.
代码贴出来更混乱,我还是尽可能简洁了来问的.[:(] 大至是这样的
with tform2.create(self) do
begin
caption:=xxx(变量)
label1.font.color:=变量
.....
parent:=panel1;
show;

end;

本来我也可以直接用 
with form2 do
begin
//代码
end;

来操作,这样在使用的时候不会有问题,但如果这样的话,用户人为关掉这个FORM,然后再
按这个钮的话就会出问题 .
我试了很多方法,我用 form2:=tform2.ceate(self) 然后用 with form2 do
也不行.
头都晕了.

to 郭玉梁

你所说的如何操作/
 
以下是为你作的一个简单的例子,看看你能不能用来参考一下

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function GetPanel1Form2: TForm2;

function CreateForm2(AParent: TPanel): TForm2;
procedure InfoForm2(AForm2: TForm2);
property ClientForm2: TForm2 read GetPanel1Form2;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


{$R *.dfm}

{
用来返回一个 TForm2 的实例
}
function TForm1.GetPanel1Form2: TForm2;
var
i: Integer;
begin
Result := nil;
//在 Panel1 中查找 TForm2 的实例
for i := 0 to Panel1.ControlCount -1 do
begin
if Panel1.Controls is TForm2 then
begin
Result := TForm2(Panel1.Controls);
Break;
end;
end;

//如果 Panel1 中没有 TForm2 的实例,那么就创建一个
if Result = nil then
begin
Result := CreateForm2(Panel1);
InfoForm2(Result);
end;
end;


{
创建 TForm2 的一个实例,在创建前先释放原来的实例
创建完成后设置 Parent := AParent 即 Panel1
}
function TForm1.CreateForm2(AParent: TPanel): TForm2;
var
i: Integer;
begin
//释放原来的 TForm2 的实例
for i := 0 to AParent.ControlCount - 1 do
begin
if AParent.Controls is TForm2 then
TForm2(AParent.Controls).Free;
end;
Result := TForm2.Create(self);
Result.Parent := AParent;
end;

{
设置新创建的 TForm2 的一些属性
}
procedure TForm1.InfoForm2(AForm2: TForm2);
begin
with AForm2 do
begin
//caption:=xxx(变量)
//label1.font.color:=变量
//......
//这里就不需要 parent:=panel1; 了
Show;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
InfoForm2(CreateForm2(Panel1)); //创建并设置 TFrom2 的实例
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with ClientForm2 do
begin
CheckBox1.Checked := False;
//......
end;
end;

end.
 
实际上,按照我上面的方式处理, Button1 就可以不要了
直接访问属性 ClientForm2 就可以了
 
to 放飞 .
看懂了你的意思,很有启示,仔细想一下,我没有必要搞得如此复杂.

结果贴子,自己看看书,换个角度想问题.
 
后退
顶部