簡體   English   中英

Delphi:在Variants數組中傳遞TObject

[英]Delphi: Pass TObject in array of Variants

我有一個程序,需要一個TObject類型的參數,如下所示:

MyProcedure (const AValue : TObject);

我有一個Variant數組,我正在循環調用該過程,如下所示:

  for i:=0 to High(myArray) do
    MyProcedure (myArray[i]);

編譯器給出錯誤說:“不兼容的類型:TObject和Variant”。

我該怎么做才能解決這個問題?

更多信息:到目前為止,我一直在變量數組中傳遞簡單類型(字符串,數字,日期)(數組通常是不同類型的混合 - 我最終將它們作為參數傳遞給數據庫存儲過程)。 現在我還需要(在某些情況下)傳遞一個TObject。

傳遞值的最合適的數據類型/結構是什么,它可以包含簡單類型和對象? 我想我可以創建自己的TParam類型,它有兩個字段,但我不確定確切的語法。 有人有這方面的例子嗎?

Variant不能保存對象,它只能包含整數和字符串等基本類型。

我建議將您的陣列更改為您想要的類型而不是變體。 如果您不確定所需的對象類型,則創建一個TObject數組或數組將保存的對象的最低基類。

你不能存儲普通對象是一種變體。 但是你可以存儲接口。

var
  v : Variant;
  i : IInterface;

begin
  v := i; // Works perfectly;
end.

查看變體的類型:

varEmpty    = $0000; { vt_empty        0 }
varNull     = $0001; { vt_null         1 }
varSmallint = $0002; { vt_i2           2 }
varInteger  = $0003; { vt_i4           3 }
varSingle   = $0004; { vt_r4           4 }
varDouble   = $0005; { vt_r8           5 }
varCurrency = $0006; { vt_cy           6 }
varDate     = $0007; { vt_date         7 }
varOleStr   = $0008; { vt_bstr         8 }
varDispatch = $0009; { vt_dispatch     9 }
varError    = $000A; { vt_error       10 }
varBoolean  = $000B; { vt_bool        11 }
varVariant  = $000C; { vt_variant     12 }
varUnknown  = $000D; { vt_unknown     13 }
//varDecimal  = $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F  = $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
varShortInt = $0010; { vt_i1          16 }
varByte     = $0011; { vt_ui1         17 }
varWord     = $0012; { vt_ui2         18 }
varLongWord = $0013; { vt_ui4         19 }
varInt64    = $0014; { vt_i8          20 }
varUInt64   = $0015; { vt_ui8         21 }

如果你真的想要,可以將TObject轉換為Pointer to Integer並存儲它。 但我不確定這是不是你真正想要的。

我的第一反應是問你為什么要將TObjects存儲在變體列表中,但假設你有充分的理由!

如果您設法將TObject實例放在數組中,那么您可能會將指針放在Tobject上。 在這種情況下,您需要做的是將Variant / Integer作為TObject進行類型轉換

for i:=0 to High(myArray) do
    MyProcedure (TObject(myArray[i]));

這應該可行,但是與任何類型轉換一樣,由您來確保myArray [i]實際上是指向TObject實例的指針或可能發生的可怕事情。

你確定TList不會做你想要的。 變體實際上意味着存儲基本類型,例如字符串,整數,浮點數,布爾值而不是對象。

我不認為用Variant變量和TOBject變量創建TParam是個好主意。 就像是:

Tobject = record
  prim: Variant;
  obj: TObject;
end

會工作,但對我來說似乎非常混亂。 帕斯卡不是一種語言類型的語言,我不會嘗試將其視為一種語言。 我建議:

創建另一個函數來處理Variant,以及擁有

MyProcedure (const AValue : TObject);

也有

MyProcedure (const AValue : Variant);

並單獨處理您的數據。 或者創建一個定義數據輸入的記錄,例如,不要讓變量和對象的TParam具有如下內容:

TStoredProcParm = record
  name: String;
  bought: TDateTime;
end;

等等。 也許你有這么多不同的數據,變量/對象路由是最好的,但它似乎有點維護頭痛 - 當你的其他代碼傳遞一個Variant數組時,你怎么知道哪個變量是哪個以及如何使用每個變量他們在你的存儲過程中?

暫無
暫無

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

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