線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3297
推到 Plurk!
推到 Facebook!

使用TStringList的AddObject後問題

尚未結案
santsai
一般會員


發表:1
回覆:2
積分:0
註冊:2006-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-09 15:52:00 IP:211.20.xxx.xxx 訂閱
各位先進好,

小弟想實做了一個 Class去包裝TStringList, 因想利用其AddObject()等功能, 如附件

class THashedMap : public TStringList
{
private:
...
public:
void __fastcall Add(String id,TObjects *obj);
...
}

假設我Add進去的是一個struct A *aaa, 把他轉型成TObject後就可以Add進去,取出後也可以強迫轉型成原來的struct A後來使用.
但是...

要delete這個TStringList時, 就只能在這個Class的外面取出Objects,轉型成 struct A 後才能將TStringList delete.

請問有辦法在Class裡面紀錄當初Add的型態是哪一個型態, 在Delete 時就可以取出記錄的型態資料, 然後自己轉型後再Delete?
查過使用typeInfo, classid等...最後還是不知道怎麼樣來寫.
編輯記錄
santsai 重新編輯於 2007-08-09 15:52:57, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-09 18:35:16 IP:211.22.xxx.xxx 未訂閱
你應該繼承 TList 比較好寫。
一般來講串列連結儲存的資料都是一致的,如果你要儲存不同的資料型態,繼承 TList 然後在成員中加上一個 TStringList 來儲存每一個資料的型態。
當然你分開來寫也可以,只不過違反類別的精神,而且程式碼不好維護。
santsai
一般會員


發表:1
回覆:2
積分:0
註冊:2006-09-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-09 23:13:03 IP:122.124.xxx.xxx 訂閱

===================引 用 Stallion 文 章===================
你應該繼承 TList 比較好寫。
一般來講串列連結儲存的資料都是一致的,如果你要儲存不同的資料型態,繼承 TList 然後在成員中加上一個 TStringList 來儲存每一個資料的型態。
當然你分開來寫也可以,只不過違反類別的精神,而且程式碼不好維護。

=====

謝謝,可是主要是要用到TStringList排序的功能, 不過您說的也不失一個方向..
再請問, 您說用一個TStringList儲存不同的資料型態, 是儲存資料型態的Name? 儲存之後如何用型態名稱去強迫型別轉換回原來的物件? 因為用TList存不是都要轉成TObject?該如何再轉回來呢?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-10 00:11:52 IP:211.22.xxx.xxx 未訂閱
嗯~你應該用TypeId(物件變數).Name()來儲存資訊,事後解開TList中的Items[index]裡面資料時,以相對註標中TStringList的儲存資訊作為轉型的依據。想想工程蠻大的!
希望其他網友或版大們有更好的方法。
===================引 用 santsai 文 章===================

===================引 用 Stallion 文 章===================
你應該繼承 TList 比較好寫。
一般來講串列連結儲存的資料都是一致的,如果你要儲存不同的資料型態,繼承 TList 然後在成員中加上一個 TStringList 來儲存每一個資料的型態。
當然你分開來寫也可以,只不過違反類別的精神,而且程式碼不好維護。

=====

謝謝,可是主要是要用到TStringList排序的功能, 不過您說的也不失一個方向..
再請問, 您說用一個TStringList儲存不同的資料型態, 是儲存資料型態的Name? 儲存之後如何用型態名稱去強迫型別轉換回原來的物件? 因為用TList存不是都要轉成TObject?該如何再轉回來呢?
santsai
一般會員


發表:1
回覆:2
積分:0
註冊:2006-09-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-10 13:21:07 IP:211.20.xxx.xxx 訂閱

===================引 用 Stallion 文 章===================
嗯~你應該用TypeId(物件變數).Name()來儲存資訊,事後解開TList中的Items[index]裡面資料時,以相對註標中TStringList的儲存資訊作為轉型的依據。想想工程蠻大的!
希望其他網友或版大們有更好的方法。
===================引 用 santsai 文 章===================

謝謝. 但是我想問的就是後面的這個問題, 假如我已經知道某個TObject 的型態是 某個名稱(字串)"TClassXXX" , 我怎麼把TObject轉型成真正的TClassXXX. 可以有類似像下面這段 Code的用法嗎?

String CName="TClassXXX";
TClassXXX *A = (CName) Objects[i]; //CName是個變數.




Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-10 13:26:37 IP:211.22.xxx.xxx 未訂閱
參考一下這裡,有點複雜喔!
http://www.dev.idv.tw/mediawiki/index.php/BCB中的RTTI機制
系統時間:2024-05-04 5:24:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!