簡體   English   中英

根據類類型在運行時創建Delphi對象

[英]Creating Delphi Objects at runtime based on class type

是否可以通過調用方法根據類型在運行時創建對象。

我想要實現的是

var
  lForm1 : TForm;
  lForm2 : TForm;
begin
  CreateObjects([lForm1, lForm2]);
  // After this call I have the variables initialized and I can use them.
end;

問題中沒有足夠的信息。

表單對象(在問題中)的“類型”從何而來? 它只是類型名稱嗎? CreateObjects()如何發現每個對象所需的類型?

它不能來自傳入的對象引用的“類型”,因為它可能是(並且幾乎肯定會是您的示例中所定義的)僅僅是基本類型,所需的具體類型最終將從該基本類型派生。

沒有有關您的特定實施目標和約束的更詳細的信息,就不可能獲得完整而具體的答案。

但是,總的來說,您可以通過將虛擬構造函數和VCL提供的RegisterClass / FindClass基礎結構相結合來實現。

簡而言之,您將擁有一個基類,該基類引入了用於實例化您的類的公共構造函數[對於TComponent派生類,它已經以Create( Owner:TComponent構造函數的形式存在]。

然后,在運行時,您可以使用FindClass( 'TClassName'獲得對任何(注冊)類的引用。 這將返回一個類引用,您可以通過該類引用調用適當的虛擬構造函數:

  type
    TFoo = class ....
    TFooClass = class of TFoo;

    // etc


  var
    someClass: TFooClass;
    someObj: TFoo;
  begin
    someClass := TFooClass(FindClass('TFooDerivedClass'));
    someObj := someClass.Create(nil);
      :

注意在上面的那TFooDerivedClass是最終從TFooClass導出(並且假設為簡單起見,以依次從TComponent派生和實例化與在這種情況下一個NIL所有者)的類。 可以使用FindClass()找到已經在類型系統中注冊的類。 這包括應用程序中某些DFM引用的任何控件或組件類。 可以使用RegisterClass()顯式注冊需要注冊的任何其他類。

您的特定應用程序如何標識所涉及的對象的類型以及類型名稱到其他任意標識系統的映射是您必須注意的實現細節。

未經測試的概念代碼:

function instantiate(var instancevars : array of tobject;
              const classtypes : array of TBaseClassType):boolean;

begin
  if (length(instancevars)=0) or (length(instancevars)<>length(classtypes)) then
    exit(false);
  for i:=0 to length(instancevars)-1 do
     instancevars[i]:=classtypes[i].create;
  result:=true;
end;

然后使用

instantiate([lform1,lform2],[tform1,tform2]); 

使它工作。

為此,請注意,“ TBaseClassType”必須是用於此函數的所有類的某個基類,並且必須具有虛擬構造函數(例如TPersistent?)。 可能還需要更正.create行(例如add(NIL))

您無法從變量獲取類型,該信息僅在編譯時可用。

引用您對Henk的回答的評論:

那就是我不想做的。 我有很多服務器端方法,我在運行時創建了很多控件,我想知道像上面那樣創建對象會減少代碼。

“很多”是什么意思?

如果您要表示很多完全相同類型的組件(例如:“ but1,but2,but3,.. but55:TButton;”),請更改代碼並使用數組來表示變量-然后可以進行簡單循環創建它們。

如果您指的是許多不同類型的組件(例如:but1:TAnimatedButton; but2:TFlatButton; but3:T3DButton;),我看不到任何簡單的方法可以做到這一點,我想您會創建一個小的調試地獄比什么都重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM