Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Lazarus Pascal:TFormClass和TPersistentClass之间的差异_Delphi_Freepascal - Fatal编程技术网

Delphi Lazarus Pascal:TFormClass和TPersistentClass之间的差异

Delphi Lazarus Pascal:TFormClass和TPersistentClass之间的差异,delphi,freepascal,Delphi,Freepascal,我创建了如下新表单实例: var ClassToUse: TFormClass; begin ClassToUse := TfrmMyForm; //CREATED AT DESIGN TIME . . NewForm := ClassTouse.Create(NewTab); //NewTab is an instance of a tab . end; var ClassToUse: TFormClass; begin ClassToUse := GetCl

我创建了如下新表单实例:

var
  ClassToUse: TFormClass;

begin  
  ClassToUse := TfrmMyForm; //CREATED AT DESIGN TIME
.
.
  NewForm := ClassTouse.Create(NewTab); //NewTab is an instance of a tab
.
end;
var
  ClassToUse: TFormClass;

begin  
  ClassToUse := GetClass(pFormName); //pFormName is a string -- ERROR IS HERE!!
.
.
  NewForm := ClassTouse.Create(NewTab);  
.
end;
上面的代码运行良好

但是现在我想把一个表单作为字符串发送给一个创建该表单的过程。因此,我将代码更改为以下内容:

我创建了如下新表单实例:

var
  ClassToUse: TFormClass;

begin  
  ClassToUse := TfrmMyForm; //CREATED AT DESIGN TIME
.
.
  NewForm := ClassTouse.Create(NewTab); //NewTab is an instance of a tab
.
end;
var
  ClassToUse: TFormClass;

begin  
  ClassToUse := GetClass(pFormName); //pFormName is a string -- ERROR IS HERE!!
.
.
  NewForm := ClassTouse.Create(NewTab);  
.
end;
这会产生以下错误:

Error: Incompatible types: got "TPersistentClass" expected "TFormClass"
也许我上错页了。。。正确的实施方式是什么


谢谢

函数返回
TPersistentClass
。您不能将其中一个分配给
t FormClass
。正是出于同样的原因,您无法将
t持久的
引用分配给
t表单
引用

您可以将代码更改为:

var
  RegisteredClass: TPersistentClass;
begin  
  RegisteredClass := GetClass(pFormName);
  if RegisteredClass=nil then
    raise ESomeException.Create(...);
  if not RegisteredClass.InheritsFrom(TForm) then
    raise ESomeException.Create(...);
  NewForm := TFormClass(RegisteredClass).Create(NewTab);  
end;

GetClass
函数返回
TPersistentClass
。您不能将其中一个分配给
t FormClass
。正是出于同样的原因,您无法将
t持久的
引用分配给
t表单
引用

您可以将代码更改为:

var
  RegisteredClass: TPersistentClass;
begin  
  RegisteredClass := GetClass(pFormName);
  if RegisteredClass=nil then
    raise ESomeException.Create(...);
  if not RegisteredClass.InheritsFrom(TForm) then
    raise ESomeException.Create(...);
  NewForm := TFormClass(RegisteredClass).Create(NewTab);  
end;

我试图找出form类和persistent类之间的区别,但在Lazarus文档中找不到区别。知道它们不同,我也尝试将persistent类强制转换为TFormClass,但始终没有成功,最终导致了最不受欢迎的SIGSEGV异常,在我的字典中它的意思是“疯狂”。)谢谢你@David_Heffernan我认为这是可行的,因为我没有编译错误,但似乎有问题。当代码到达创建表单的行时,它会与SIGSEGV崩溃:(@David_Heffernan要缩小范围,我这样做了:RegisteredClass:=GetClass(pFormName);NewForm:=TFormClass(RegisteredClass)。create(NewTab);在creaate行它崩溃了。顺便说一句,这是Lazarus。你省略了我添加的所有错误检查代码。放回去。我无法重现你在
RegisterClass
上的任何问题。我调用
RegisterClass
传递
TForm1
。我调用
GetClass('TForm1'))
并返回相应的类类型。FWIW您应该在声明类的单元的初始化部分调用
RegisterClass
。我试图找到form类和persistent类之间的差异,但在Lazarus文档中找不到差异。知道它们不同,我尝试了强制转换TFormClass的持久类也是如此,但它从来都不起作用,最后我遇到了最不受欢迎的SIGSEGV异常,在我的字典中它的意思是“疯狂”;谢谢@David_Heffernan我认为这是可行的,因为我没有编译错误,但似乎有问题。当代码到达创建表单的行时,它会与SIGSEGV崩溃:(@David_Heffernan要缩小范围,我这样做了:RegisteredClass:=GetClass(pFormName);NewForm:=TFormClass(RegisteredClass)。create(NewTab);在creaate行它崩溃了。顺便说一句,这是Lazarus。你省略了我添加的所有错误检查代码。放回去。我无法重现你在
RegisterClass
上的任何问题。我调用
RegisterClass
传递
TForm1
。我调用
GetClass('TForm1'))
并返回相应的类类型。FWIW您应该在声明类的单元的初始化部分调用
RegisterClass