Delphi 如何在我的项目中创建每个表单的实例?

Delphi 如何在我的项目中创建每个表单的实例?,delphi,delphi-10.3-rio,Delphi,Delphi 10.3 Rio,我已经将一个应用程序从ADO移植到FireDAC,在源代码上应用了几个RegExp替换,以转换ADOQuery、ADOTABLE、ADO命令、ADOStoredProcs等。。。到相应的FireDAC组件 它工作得很好,但现在在运行该应用程序时,很多表单都会出现错误,因为持久字段的类型不同于预期的类型(创建持久字段时从ADO定义的类型) 我试图列出这些错误,创建所有表单的实例,用持久字段打开它们的数据集,并记录错误。我可以从项目源代码中获取表单列表,但是当我尝试使用FindClass创建每个表单

我已经将一个应用程序从ADO移植到FireDAC,在源代码上应用了几个RegExp替换,以转换ADOQuery、ADOTABLE、ADO命令、ADOStoredProcs等。。。到相应的FireDAC组件

它工作得很好,但现在在运行该应用程序时,很多表单都会出现错误,因为持久字段的类型不同于预期的类型(创建持久字段时从ADO定义的类型)

我试图列出这些错误,创建所有表单的实例,用持久字段打开它们的数据集,并记录错误。我可以从项目源代码中获取表单列表,但是当我尝试使用FindClass创建每个表单时,我会收到一个错误,告诉我尚未找到该类

是否有其他方法从其类名创建表单/数据模块

这是我当前的代码:

class procedure TfrmCheckFormularis.CheckDatasets(ProjecteFile: string);
var frmCheckFormularis: TfrmCheckFormularis;
    Projecte: string;
    rm: TMatch;
    cc: TComponentClass; 
    c: TComponent;
    i: integer;
    Dataset: TFDQuery;
begin
  Projecte := TFile.ReadAllText(ProjecteFile);
  frmCheckFormularis := TfrmCheckFormularis.Create(Application);
  try
    with frmCheckFormularis do begin
      Show;
      qryForms.CreateDataSet;
      qryErrors.CreateDataSet;
      // I get a list of all the forms and datamodules on my project
      for rm in TRegEx.Matches(Projecte, '^(?:.* in '')(?<File>.*)(?:'' {)(?<Class>.*)(?:},)', [roMultiline]) do begin
        qryForms.AppendRecord([rm.Groups['File'].Value, rm.Groups['Class'].Value]);
      end;

      // Check every form and datamodule
      qryForms.First;
      while not qryForms.Eof do begin
        cc := TComponentClass(FindClass(qryFormsClass.Value));
        c := cc.Create(frmCheckFormularis);
        try
          for i := 0 to c.ComponentCount - 1 do begin
            if c.Components[i] is TFDQuery then begin
              Dataset := c.Components[i] as TFDQuery;
              // When the Dataset has persistent fields, I open it to check if the persistent fields are correct
              if Dataset.FieldDefs.Count > 1 then begin
                try
                  Dataset.Open;
                except
                  on E: Exception do qryErrors.AppendRecord([c.Name, Dataset.Name, E.Message]);
                end;
              end;
            end;
          end;
        finally
          c.Free;
        end;
        qryForms.Next;
      end;
    end;
  finally
    frmCheckFormularis.Free;
  end;
end;
类过程TfrmCheckFormularis.checkdataset(ProjecteFile:string);
变量frmCheckFormularis:TfrmCheckFormularis;
项目:字符串;
rm:TMatch;
cc:TComponentClass;
c:t成分;
i:整数;
数据集:TFDQuery;
开始
Projecte:=TFile.ReadAllText(ProjecteFile);
frmCheckFormularis:=TfrmCheckFormularis.Create(应用程序);
尝试
用frmCheckFormularis开始
显示
qryForms.CreateDataSet;
qryErrors.CreateDataSet;
//我得到了项目中所有表单和数据模块的列表
对于TRegEx.Matches中的rm(Projecte,“^(?:*”)(?*)(?:“{)(?*)(?:},),[roMultiline])不开始
AppendRecord([rm.Groups['File'].Value,rm.Groups['Class'].Value]);
结束;
//检查每个表单和数据模块
qryForms.首先;
而不是qryForms.Eof开始
cc:=TComponentClass(FindClass(qryFormsClass.Value));
c:=cc.Create(frmCheckFormularis);
尝试
对于i:=0到c.ComponentCount-1,开始
如果c.Components[i]是TFDQuery,则开始
Dataset:=c.Components[i]作为TFDQuery;
//当数据集有持久字段时,我打开它检查持久字段是否正确
如果Dataset.FieldDefs.Count>1,则开始
尝试
数据集。打开;
除了
在E:Exception上执行qryErrors.AppendRecord([c.Name,Dataset.Name,E.Message]);
结束;
结束;
结束;
结束;
最后
c、 免费的;
结束;
qryForms.Next;
结束;
结束;
最后
frmCheckFormularis.Free;
结束;
结束;
谢谢。

在Delphi中使用“新”RTTI非常简单。以下代码(希望*)将在应用程序中为每个表单创建一个实例:

procedure TForm1.按钮1点击(发送方:TObject);
变量
语境:语境;
&类型:trtti型;
InstanceType:trttInstanceType;
开始
上下文:=TRttiContext.Create;
for&Type in Context.GetTypes do
开始
如果(&Type.TypeKind=tkClass)和&Type.IsInstance,则
开始
InstanceType:=trttInstanceType(&Type);
如果InstanceType.MetaclassType.InheritsFrom(TForm)和(InstanceType.MetaclassType TForm),则
TFormClass(InstanceType.MetaclassType).Create(应用程序){.Show};//可以选择显示它
结束;
结束;
结束;


*从技术上讲,它将为
TForm

有趣的q,+1的每个适当的子类创建一个实例。我想知道您是否可以通过读取.Exe的资源流来获得表单列表?不过,不确定这是否适用于数据模块。我会尝试使用RTTI。@AndreasRejbrand,我以前从未使用过RTTI,你能给我介绍一下教程或一些文档从哪里开始吗?。谢谢。当您在IDE中打开有问题的表单时,它们会触发错误吗?@fpiette否,打开表单不会触发错误,我必须打开IDE上的数据集,以便组件读取结果并引发错误,即某些持久字段的类型不同。