爲什麼不能使用Delphi變體來保存對象?更重要的是,這個限制背後的原因是什麼?爲什麼不能使用Delphi變體來保存對象?
12
A
回答
6
這只是一個意見,從我的什麼變體可以和不能做的經驗。
如果您將COM對象放入它中,它將作爲IDispatch引用存儲,因此您在此對象上訪問的任何方法調用或屬性都將轉換爲查找方法/對象的內部DISPID的代碼,屬性,將構造一個包含方法參數的數組,並通過IDispatch接口調用該方法。
換句話說,IDispatch接口爲您處理,您通常會做的方式,但它是由編譯器自動地完成。
然而,對於正常德爾福對象,事情變得更難。您可以使用RTTI來查找並調用已發佈的方法和屬性,但這就是它。如果你有一個非公開的非虛方法的名字,Delphi在你的方法中找不到它的正確地址。
換句話說,你所能做的只是將保存爲這個對象,你將無法使用它。也許他們可以增加對釋放它的支持,但是可能會這樣。
我知道一個事實,如果你正確地實現IDispatch,你可以安全地存儲,並通過變體使用的對象。我有一個類可以用作你想要這樣做的Delphi對象的基類。它會自動公開發布的方法/屬性,如果你想通過一些受保護的方法調用,你可以添加更多。如果對這樣的班級有興趣,我可以把它放在某個地方。
但同樣,這是通過IDispatch,它使用公佈的方法,剩下的就是手工代碼,所以對於變種的支持,都必須內置到你的對象,通過你。
這就是爲什麼我認爲他們只是說:這隻會產生投訴,我們能夠舉行一個對象,但它只是無用的。
但這只是我的想法。也許有人官員有更好的答案。
24
您絕對可以在存儲 Variant變量內的對象 - 只需將其轉換爲NativeUI。無論如何,一個對象只是一個指針。
obj := TObject.Create;
v := NativeUInt(obj);
obj := TSomeObject(NativeUInt(v));
6
我用了變種,以持有使用變內部過去的對象
,代碼是這樣的:
var
MyObject: TMyObject;
Value: Variant;
begin
MyObject:= TMyObject.Create;
TVarData(Value).VType:= VarByRef;
TVarData(Value).VPointer:= MyObject;
相關問題
- 1. 爲什麼delphi不能識別對象?
- 2. 爲什麼必須使用Set來保存對象?
- 3. 爲什麼不保存這個對象?
- 4. 爲什麼關聯對象不能保存?
- 5. 爲什麼不能將對象保存在兩個數組中?
- 6. 使用實體框架保存對象時會發生什麼?
- 7. 爲什麼Core Data需要很長時間來保存對象?
- 8. 爲什麼我的對象不能保存到持久性存儲?
- 9. 爲什麼不在我的Delphi對象上調用_AddRef和_Release?
- 10. 爲什麼Java使用堆數據結構來存儲對象?
- 11. 爲什麼這不能保存?
- 12. 爲什麼數據不能保存?
- 13. 爲什麼我的NSMutableArray不能保存
- 14. 爲什麼setjmp不能保存堆棧?
- 15. 爲什麼對象引用不能引用預期的對象?
- 16. 爲什麼使用實體框架,我不能保存當前DateTime.Now
- 17. 爲什麼不增加對象變量?
- 18. Documentum的文檔庫不能當我使用下列API的腳本保存的對象來保存對象
- 19. 爲什麼不使用class-keyword不能創建對象?
- 20. 爲什麼COM對象不使用IDisposable?
- 21. 爲什麼svg不能在引導媒體對象中工作?
- 22. 爲什麼這個datamapper對象不會保存?
- 23. GORM爲什麼不保存我的對象?
- 24. 爲什麼流利Nhibernate不保存子對象?
- 25. 爲什麼我的GORM對象不保存到數據庫?
- 26. 爲什麼在保存/加載/加載RData之後對象變得不同了?
- 27. 爲什麼DbFlow無法保存對象而不被分配給變量?下面
- 28. 爲什麼我不能使用函數來改變值? AngularJS
- 29. 爲什麼我不能使用變量來設置iCal事件?
- 30. 爲什麼這個文件字段不能保存在節點對象上?
你是非常正確的。您還應該提及TCustomVariantType和TInvokeableVariantType類。這些類顯示了類需要做的所有事情,以便能夠*(不僅僅是存儲)在Variant中使用,而不必實現IDispatch。 – 2008-12-14 17:34:00
+1 Rob:TCustomVariantType和TInvokeableVariantType相當強大。一些性能處罰,但是[可能會繞過一些低級黑客攻擊](http://blog.synopse.info/post/2011/07/01/Faster-variant-late-binding)。 – 2013-10-10 06:47:04