翻译delphi代码为C++Builder代码 ( 积分: 100 )

  • 主题发起人 秋之叶
  • 开始时间

秋之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1Class = class of TForm1;
TForm1 = class(TForm)
btnForm2: TButton;
btnForm3: TButton;
procedure btnForm2Click(Sender: TObject);
procedure btnForm3Click(Sender: TObject);
private
{ Private declarations }
public
procedure ShowForm(FClass: TForm1Class);
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.ShowForm(FClass: TForm1Class);
begin
Form1 := FClass.Create(Application);
Form1.ShowModal;
end;

procedure TForm1.btnForm2Click(Sender: TObject);
begin
ShowForm(TForm2);
end;

procedure TForm1.btnForm3Click(Sender: TObject);
begin
ShowForm(TForm3);
end;
end.

type
TForm2 = class(TForm1)
.....
end.

type
TForm3 = class(TForm1)
...
end.
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1Class = class of TForm1;
TForm1 = class(TForm)
btnForm2: TButton;
btnForm3: TButton;
procedure btnForm2Click(Sender: TObject);
procedure btnForm3Click(Sender: TObject);
private
{ Private declarations }
public
procedure ShowForm(FClass: TForm1Class);
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.ShowForm(FClass: TForm1Class);
begin
Form1 := FClass.Create(Application);
Form1.ShowModal;
end;

procedure TForm1.btnForm2Click(Sender: TObject);
begin
ShowForm(TForm2);
end;

procedure TForm1.btnForm3Click(Sender: TObject);
begin
ShowForm(TForm3);
end;
end.

type
TForm2 = class(TForm1)
.....
end.

type
TForm3 = class(TForm1)
...
end.
 
主要是类的类在C++Builder 中怎么使用
请翻译关键函数
procedure TForm1.ShowForm(FClass: TForm1Class);
begin
Form1 := FClass.Create(Application);
Form1.ShowModal;
end;
 
void TForm1::ShowForm(TForm1Class FClass)
{
Form1 = new TForm1Class(Application);
Fomrm1.ShowModal();
}
不知道对不对,很久没弄了,手里没有环境
 
楼上代码不对。
void TForm1::ShowForm(TForm1Class FClass)
{
Form1 = TForm1Class(Application);
Fomrm1.ShowModal();
}
FClass 是标明具体类的,函数中未用到。
本来认为应该是
void TForm1::ShowForm(TForm1Class FClass)
{
Form1 = new FClass(Application);
Fomrm1.ShowModal();
}
但可惜也不对,因为无法编译通过。
 
C++Builder
不是可以直接 用delphi 的码
 
void TForm1::ShowForm(TObject *Sender)
{
Form1 = new TForm1Class(Application);
Fomrm1 -> ShowModal();
}
只能记起这么多了,搂住不妨到网上搜一下
看一下程序的源代码
 
我其实就是想知道怎么在 c++builder中使用“类的类”。
最好有个例子,网上实在不好找。
给个链接也行。
 
没有CB环境,去专门的CB网站看有资料没有
 
这么久都没有人给出标准答案,看来大富翁论坛现在真有些名不副实了。
只有去CSDN上问问了。
 
void TForm1::ShowForm(TForm1Class *FClass)
{
FClass= new TForm1Class(NULL);
FCLass->Show();
}
 
大家试试再给答案好吗?
FClass= new TForm1Class(NULL);
这句话根本就行不通的。
C++会认为 TForm1Class(NULL) 是强制转换
继续...
 
手里没有环境,不好意思
刚刚想了一下,是不是应该找些RTTI方面的东西,比如
Delphi有个很经典的Application.Create(TForm1, Form1);
而且你的类是从TForm继承的(假定你是这么想的)
void TForm1::ShowForm(TForm1Class FClass)
{
TForm1Class *Form1;
Form1 = FClass->Create(Application);
Form1->ShowModal();
}
一个建议,希望有借鉴意义
 
Procedure ShowFormX(AFormClass:TFormClass);
begin
With AFormClass.Create(NIL)do
// With AFormClass.Create(Application)do
try
ShowModal;
finally
Free;
end;
end;
这段代码如何翻译成c++ bulider 呢?
 
C里面没有with的用法,就老老实实的建立一个对象,然后ShowModal吧
另外标准C里面也没有finally的用法,CB里面好像是下面的用法
__try{
}
__finally{
}
你的问题和开始提的一样了,如果按我上面的用法编译没问题,那上面的问题也一样可以
 
应该是
try
{
}
__finally
{
}
另外,chenybin兄,如果不是TForm继承的类呢?况且,c++中都是用new生成实例的。
没有->Create这么标记的。
 
这个class of的功能在C++中是没有的,BCB没用过.不过应该支持,虽然一定是BORLAND的扩展.
你可以在你的BCB的源代码和帮助中找找答案的。比如在Delphi源码中使用了此特性的地方,你可以在BCB的源码中寻找类似的定义。比如Application.CreateForm的地方。
还有基本上扩展关键字应该是 __xxx的形式,你逐个看看关键字
 
楼主,我刚刚去查了一下资料(手里没环境,没办法)
CB里面不一定都是显式New出来的,有其他函数封装过了
可以看看bpr里面的代码,Form就不是显式New出来的,
Application->CreateForm(__classid(Tform1), &Form1);这种方式
好久没弄了,大概意思是这样,另外可以采用zjan521大虾的方法,先到帮助里面看一下,有对应的东西没有
还可以去http://www.ccrun.com/ 看看有没有你需要的东西
 
多谢各位朋友的热心关注。不过问题的答案还是没有出来。
应该是类的某个方法的应用。
TClass 有个方法为 InitInstance,不知道如何使用,是否和本题有关。
关键是根据TClass生成类实例。
 
C++ Builder的VCL中提供了TMetaClass类,但是功能很少,也没有提供NewInstance方法,但是VMT中实际上是有这些方法的,所以只能从VMT来着手。
TComponent* CreateComponent(TComponent* AOwner, TClass AClass)
{
TComponent *Obj;
asm {
MOV EAX,AClass
CALL DWORD PTR [EAX-0x0C]
MOV Obj,EAX // 本来是不需要定义Obj变量的,返回值由EAX返回
// 不过为了避免编译器Warning,多定义了个Obj
MOV EDX,AOwner
MOV EBX,[EAX]
CALL DWORD PTR [EBX+0x2C]
}
return Obj;
}
 

Similar threads

I
回复
0
查看
604
import
I
I
回复
0
查看
696
import
I
I
回复
0
查看
505
import
I
I
回复
0
查看
651
import
I
顶部