100分求助: 向panel中的窗体传参数应该怎么办啊? ( 积分: 100 )

  • 主题发起人 主题发起人 maldini610
  • 开始时间 开始时间
M

maldini610

Unregistered / Unconfirmed
GUEST, unregistred user!
panel中嵌入的窗体是随着按不同的按钮而出现的不同的窗体,下面的代码是我在网上找到的在一个panel中根据按钮的不同在panel中显示不同窗体的代码.
现在 我想通过 form1(假设它为不在panel中窗体) 传一个值给panel中窗体的 比如 使edit1的 text值 为1 应该 怎么办啊?
先谢谢了啊
var
NewDemoClass: TFormClass;
NewDemo: TForm;
begin
case (Sender as TMenuItem).Tag of
1:
NewDemoClass := TFBudgetset;
else
NewDemoClass := nil;
end;

if (ContainerPanel.ControlCount = 0) or not (ContainerPanel.Controls[0] is NewDemoClass) then
begin
if ContainerPanel.ControlCount > 0 then
ContainerPanel.Controls[0].Free;

if Assigned(NewDemoClass) then
begin
NewDemo := NewDemoClass.Create(Self);
NewDemo.Hide;
NewDemo.BorderStyle := bsNone;
NewDemo.Parent := ContainerPanel;
NewDemo.Align := alClient;
if SkinData1.Active then
SkinData1.AddNestForm(self,NewDemo);
NewDemo.Show;
StatusBar1.Panels[0].Text := NewDemo.Caption;
end;
end;
 
一个思路:


从你的代码上看你的NewDemo只能为TFBudgetset!!!

你这个TFBudgetset应该是个TForm的一个子类

在某个地方被赋给了某个子类,假如那个实际的窗体类名为TFormActive,这个你需要记住它,可以记住类的名字,你可以在TFBudgetset被赋值的地方
(newdemo as getclass(类名字)).edit1.text = 'xxxx'
 
同意52free思想.
你可以建立一个代理类,用来保存已经创建窗体的instance.如你代码中的NewDemo
使用时就可以直接用NewDemo.了.
 
首先谢谢两位回答的大哥。
to 52free: 我的代码只是 举个例子,newdemo也可能是别的,比如 case '2'的时候
我还是 不太理解您说的,
(newdemo as getclass(类名字)).edit1.text = 'xxxx' 这条语句是 加在 我在问问题
的时候说的 form1的 窗体中吗? (newdemo as getclass('NewDemo')).edit1.text := 'xxxx' 可是提示我 没声明 edit1 阿
to 无条件投降: 我也不 太 明白您说的阿
我的qq:475619997 msn:javawangzi@sina.com 帮帮忙吧 大哥们
 
(newdemo as getclass('NewDemo')).edit1.text := 'xxxx' 可是提示我 没声明 edit1 阿


getclass('NewDemo'))这个地方的NewDemo应该是你的实际实例化的类
如果你是case 1时 就是 getclass('TFBudgetset'))
你要用edit1,那么这时'NewDemo'就是包含edit1的那个窗口类

建议你先搞明白多态这个概念再来解决这个问题,有空再找本设计模式的书看看
Factory模式,上面两个问题明白了你自然可以理解为什么可以这么做了
 
to 52free: (newdemo as getclass('NewDemo')).edit1.text := 'xxxx' 这句话 应该 写在哪个窗口中呢? 您说的 我 实在 是不明白? 我觉得 无论是写 在哪 个 窗口中都是 编译 不过去 的 阿,因为 在 初始化的 newdemo中 根本 就 没有 edit1阿,edit1是在 TFBugetset这 个 窗体中的 我 实在 是 不明白阿
 
所以要强制转换啊,不能急了
(newdemo as getclass('实际的窗体类名'))
这不就把newdemo给强制转换了嘛,getclass('实际的窗体类名')这个类里就包含你要用的edit1

那个'实际的窗体类名 '就在你的类似下面的代码中记录下来
case (Sender as TMenuItem).Tag of
1:
NewDemoClass := TFBudgetset;
//比如说这儿
‘实际的窗体类名 ’:= TFbudgetset.classname;
else
NewDemoClass := nil;
end;
 
诶呀 我 不知道 我 说的 意思 您 是否 真的理解了
但是 我 按 你的 方法 实在 是 做不 出来
不知道 您 是否 方便 qq交流 或者 msn交流
或者 给我 发一 个 小例子 可以吗?
我的 邮箱: javawangzi@sina.com
多谢了!
 
最简单的办法是:建立一个GsUnit.pas,里面存放全局变量G_Str,在掉用之前,给G_Str赋值,然后在Panel窗体中直接取值就可以了,当然了,要在引用中加入GsUnit单元
 
to 52free: 按照您的 思路,我终于明白 怎么回事儿了
强制转换 这样写 (newdemo as TFBugetset).edit1.text := '2'; 就没有问题了
这句话 写在 form1中 完全 没 问题了 谢谢了 哈哈
 
后退
顶部