请问这段Delphi函数如何转换成C++Builder?(200分)

  • 主题发起人 主题发起人 教父
  • 开始时间 开始时间

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure OpenAForm(AFormClass: TComponentClass);
begin
TForm(AFormClass.Create(nil)).Show;
end;

请问这样一段代码在BCB中如何实现?
 
一样的 。
 
procedure OpenAForm(AFormClass: TComponentClass);
{
TForm->(AFormClass->Create(null))->Show();
};
 
void __fastcall TForm1::OpenAForm(TMetaClass* AFormClass)
{
((TForm*)(InitInstance(AFormClass, this)))->Show();
}
 
都不对啊
 
主要原因是C++语言里并没有类引用机制。
我用上面的方法可以生成一个对象,可是总不知道那有些问题。
实际中我这样用过:
建一个pas文件,让C++ Builder的程序调用它的方法。
// Delphi Pascal文件: CreateObject.pas
//-----------------------------------------------------------------------
unit CreateObject;
interface
uses
Classes;
function CreateDelphiObject(cc: TComponentClass;
parent: TComponent): TComponent;
implementation
function CreateDelphiObject(cc:TComponentClass;
parent: TComponent): TComponent;
begin
Result := cc.Create(parent);
end;
end.

// C++ Builder中的使用使用测试 Unit1.cpp
//------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" // Unit2为TForm2的文件
#include "CreateObject.hpp" // CreateObject.pas编译生成的头文件
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm* aForm;
aForm = dynamic_cast<TForm*>(CreateDelphiObject(__classid(TForm2), this));
if( aForm )
aForm->Show();
}
//---------------------------------------------------------------------------
测试方法:
1.在文本编辑器中写好CreateObject.pas,保存;
2.在C++ Builder中新建一个Project;
3.在新工程中另建一个Form2;在Project|Option中将Form2从Auto_create forms列表中除去。
4.将CreateObject.Pas加入到新工程中,按Alt+F9单独编译CreateObject.pas;将生成CreateObject.hpp;
5.在Unit1.cpp中加入
#include "Unit2.h"
#include "CreateObject.hpp"
6.在Form1在放一个按钮,击点,源码编辑器中出现TButton1Click的代码框架,在其中填入:
TForm* aForm;
aForm = dynamic_cast<TForm*>(CreateDelphiObject(__classid(TForm2), this));
if( aForm )
aForm->Show();
7.按F9编译,运行。
8.在Project1运行窗口中点Button1,应出现新窗口Form2.
利用我们生成的CreateOject.pas,可以生成任何控件。
 
bcb中是可以直接利用pas文件的,直接用就是了,不要翻译
 
chenxz说得对,只要里面不是用得太多份的都可以用的
 
void OpenAForm(TComponentClass *AFormClass)
{
AFormClass = new TComponentClass(NULL);
TForm *form = (TForm*)AFormClass;
form->Show();
}
 
后退
顶部