cb mdi child question(25分)

  • 主题发起人 主题发起人 wjs
  • 开始时间 开始时间
W

wjs

Unregistered / Unconfirmed
GUEST, unregistred user!
黎匡 的Delphi 例程我已看过,且运行得很好,我现欲用c++builder 做同

样的事,大部分已编译过去,但其最后3行不知怎样变为cb的语句。

Child:=TForm(FormClass.NewInstance);
TForm(fm):=Child;
Child.Create(AOwner);
 
Child=(TFormForm*)Class::NewInstance;
(TForm*)fm=Child;
Child::Child(AOwner);

这3行其实就是:
fm=new TForm(AOwner)
 
搞错了,应该是

Child=(TForm*)TForm::NewInstance;
(TForm*)fm=Child;
Child.TForm::TForm(AOwner);

这3行其实就是:
(TForm*)fm=Child=new TForm(AOwner)
 
又搞错了,应该是

Child=(TForm*)TForm::NewInstance();
(TForm*)fm=Child;
Child.TForm::TForm(AOwner);

这3行其实就是:
(TForm*)fm=Child=new TForm(AOwner)
 
; Child=(TForm*)TForm::NewInstance();
这句编译无法通过,用

TForm*)fm=Child=new TForm(AOwner)

编译可通过,但在调用语句又出了问题:
调用语句为:

CreateMDIChild(TChild0, Child0, This);

出错号:E2108 Improper use of Typedef "TChild0".

TChild0 为系统生成的,Child0为其实例指针。
 
调用语句为:

CreateMDIChild(__cllassid(TChild0), Child0, This);

时,编译全通过,但运行时,无法建立新窗体。
 
我的代码如下:

void __fastcall TMainForm::CreateMDIChild(TFormClass FormClass,
void *fm, TComponent *AOwner)
{
//--- only open one new MDI child window ----
int i;
TForm *Child;

for( i=0;i<Screen->FormCount -1; i++)
if(Screen->Forms->ClassType() == FormClass)
{
Child = Screen->Forms;
if(Child->WindowState==wsMinimized)
ShowWindow(Child->Handle,SW_SHOWNORMAL);
else
ShowWindow(Child->Handle,SW_SHOWNA);
if(!Child->Visible) Child->Visible = True;

Child->BringToFront();
Child->SetFocus();
(TForm*)fm = Child;
return;
}
/*Child = (TForm*)TForm::NewInstance();
(TForm*)fm = Child;
Child.TForm::Tform(AQwner);
*/
(TForm*)fm = Child = new TForm(AOwner);
}



void __fastcall TMainForm::FileNew1Execute(TObject *Sender)
{
CreateMDIChild(__classid(TfrmChild0) , Child0, this);
}


编译全通过,但运行时,无法建立新窗体。
 
; /*Child = (TForm*)TForm::NewInstance();
(TForm*)fm = Child;
Child.TForm::Tform(AQwner);
*/
(TForm*)fm = Child = new TForm(AOwner);

//添加:
Child->Show();
}
 
首先,非常感谢各位的帮助。尽管我的问题还没有解决。

To DreamTiger:


child->Show()

的结果是显示一普通窗体,不是子窗体。
 
1、Child0如果如果是 TfrmChild0* 类型而且调用CreateMDIChild出来还要用
Child0这个变量,应该这样调用:

CreateMDIChild(__classid(TfrmChild0) , &Child0, this);

CreateMDIChild 里面: *(TForm**)fm = Child

2、delphi的传 类 作为参数,在c++下我还没想出什么完全等价的办法代替,
不过你的程序可以这样:

CreateForm(FormClass, fm)
 
//nod Pipi.
我也是只能用Application->CreateForm(FormClass,fm);
创建一个子窗口,就是不知道怎么把AOwner传过去。
 
这样:

Application->CreateForm(FormClass,fm);
if(fm->Owner)
fm->Owner->RemoveComponent(fm);
Owner->InsertComponent(fm);
 
调试成功:不过,搞不懂这个AOwner有什么用,呵呵。不如不要AOwner,
可以省去好多事。

void __fastcall TMainForm::CreateMDIChild(System::TMetaClass* FormClass,void *fm, TComponent* AOwner)
{
//--- only open one new MDI child window ----
int i;
TForm *Child;

for( i=0; i < Screen->FormCount -1; i++)
if(Screen->Forms->ClassType() == FormClass)
{
Child = Screen->Forms;
if(Child->Owner)
Child->Owner->RemoveComponent(Child);
AOwner->InsertComponent(Child);
if(Child->WindowState==wsMinimized)
ShowWindow(Child->Handle,SW_SHOWNORMAL);
else
ShowWindow(Child->Handle,SW_SHOWNA);
if(!Child->Visible) Child->Visible = True;

Child->BringToFront();
Child->SetFocus();
*(TForm**)fm = Child;
return;
}
Application->CreateForm(FormClass,&Child);
if(Child->Owner)
Child->Owner->RemoveComponent(Child);
AOwner->InsertComponent(Child);
*(TForm**)fm = Child;
Child->Show();
}
 
多谢各位鼎立相助,可惜分数太少。真是抱歉。
 
多谢各位鼎立相助,可惜分数太少。真是抱歉。
 
后退
顶部