Run Time 時期的實體存檔 |
缺席
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
請教各位先進一個蠻奇特的問題。
我在Run Time時,將某個物件的很多Property 做了複雜的設定。若我要將這些Property 的設定存檔,供將來使用,傳統的做法是將這些設定值,一個一個的存到 INI 或 DB 中。下次再將這些設定值讀出後分別放到各物件Property中。可是這種作法就要針對各種物件的各個Property去寫Code。如果物件種類一多時,就會有很長很長很長很長很長很長很長的Code要寫。 我的問題是,有沒有可能在Run Time 時,將已經設定好Property的實體物件,直接存到某個 Binary File 。然後下次要用的時候,再直接把這個Binary File 載入進來,直接形成上一次的實體物件狀態。 不知道各位先進有沒有看法或是作法。 感謝各位先進 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
OO 是沒有「直接」定義此功能,但是依據物件的永續機制,是可以做到的,在此理論說太多沒意思
來看如何做 1. 了解如何將你的 Form 打包存放到 DLL 內,成為 resource 2. 瞭解如何將 DLL 內的 Form 資源叫出,並套用 3. 了解如何修改 DLL 內的 resource 4.以上三點,可以做到你的要求,並指使用一個指令儲存(WriteRootComponent/WriteComponent)與讀取(ReadRootComponent/ReadComponent/ReadComponents) ===================引 用 carstyc 文 章=================== 請教各位先進一個蠻奇特的問題。 我在Run Time時,將某個物件的很多Property 做了複雜的設定。若我要將這些Property 的設定存檔,供將來使用,傳統的做法是將這些設定值,一個一個的存到 INI 或 DB 中。下次再將這些設定值讀出後分別放到各物件Property中。可是這種作法就要針對各種物件的各個Property去寫Code。如果物件種類一多時,就會有很長很長很長很長很長很長很長的Code要寫。 我的問題是,有沒有可能在Run Time 時,將已經設定好Property的實體物件,直接存到某個 Binary File 。然後下次要用的時候,再直接把這個Binary File 載入進來,直接形成上一次的實體物件狀態。 不知道各位先進有沒有看法或是作法。 感謝各位先進 |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
感謝各位先進的指導,小弟只是想把有實體產生的 Instance 自動的將其 Property 存檔,以省去針對每個Property去寫Code做儲存的時間。我研究後,已經可以實作了,作法也跟各位分享一下。
[code delphi] procedure SaveAllPropertyToStream(Instance: TPersistent); var PropList: PPropList; i,j,k:Integer; TypeData: PTypeData; begin i:=GetPropList(Instance,PropList); for j:=0 to i-1 do SavePropertyToStream(Instance,PropList[j]^.Name); end; procedure SavePropertyToStream(Instance: TPersistent; PropName: string); var Stream: TStream; begin Stream := TFileStream.Create(BaseComponentName '_' Instance.GetNamePath '_' PropName '.Data' ,fmCreate ); with TMyWriter.Create(Stream, 1024) do try WriteListBegin; WriteProperty(Instance, GetPropInfo(Instance.ClassInfo, PropName)); WriteListEnd; finally Free; end; Stream.Free; end; [/code] 如此就可以將某個 Instance 的所有Property存在檔案中了。 但經過小弟實測後,大部份的Property皆能儲存,但有某些Instance 明明有某個 Property ,但卻不會出現在 GetPropList 中,所以就會漏掉這些 Property。 比如 ListBox 中的 Itemindex 就不會出現,我也百思不得其解。不過這樣的功能已經解決我大部份的問題了。謝謝各位先進 |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
希望有幫助
[code delphi] procedure SaveAllPropertyToStream(Instance: TPersistent); var PropList: PPropList; i,j,k:Integer; TypeData: PTypeData; begin i:=GetPropList(Instance,PropList); for j:=0 to i-1 do SavePropertyToStream(Instance,PropList[j]^.Name); end; procedure SavePropertyToStream(Instance: TPersistent; PropName: string); var Stream: TStream; begin Stream := TFileStream.Create(Instance.GetNamePath '_' PropName '.Data' ,fmCreate ); with TMyWriter.Create(Stream, 1024) do try WriteListBegin; WriteProperty(Instance, GetPropInfo(Instance.ClassInfo, PropName)); WriteListEnd; finally Free; end; Stream.Free; end; procedure LoadALLPropertyFromStream(Instance: TComponent); var Stream: TStream; PropList: PPropList; i,j,k:Integer; TypeData: PTypeData; begin i:=GetPropList(Instance,PropList); for j:=0 to i-1 do LoadPropertyFromStream(Instance,PropList[j]^.Name); end; procedure LoadPropertyFromStream(Instance: TPersistent; PropName: string); var Stream: TStream; begin Stream := TFileStream.Create(Instance.GetNamePath '_' PropName '.Data' ,fmOpenRead ); with TMyReader.Create(Stream, 1024) do try ReadListBegin; while not EndOfList do ReadProperty(Instance); ReadListEnd; finally Free; end; Stream.Free; end; [/code] ===================引 用 pceyes 文 章=================== 雖已結案,但能否順便po一下load的方法, 謝謝! |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |