全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2667
推到 Plurk!
推到 Facebook!

Run Time 時期的實體存檔

缺席
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-06 02:03:10 IP:219.84.xxx.xxx 訂閱
請教各位先進一個蠻奇特的問題。

我在Run Time時,將某個物件的很多Property 做了複雜的設定。若我要將這些Property 的設定存檔,供將來使用,傳統的做法是將這些設定值,一個一個的存到 INI 或 DB 中。下次再將這些設定值讀出後分別放到各物件Property中。可是這種作法就要針對各種物件的各個Property去寫Code。如果物件種類一多時,就會有很長很長很長很長很長很長很長的Code要寫。


我的問題是,有沒有可能在Run Time 時,將已經設定好Property的實體物件,直接存到某個 Binary File 。然後下次要用的時候,再直接把這個Binary File 載入進來,直接形成上一次的實體物件狀態。

不知道各位先進有沒有看法或是作法。

感謝各位先進
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-06 10:38:47 IP:61.225.xxx.xxx 未訂閱
據我對 OO 的認知。似乎沒這個功能。@@
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-06 17:11:47 IP:61.64.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-06 17:49:46 IP:122.127.xxx.xxx 訂閱
------
努力會更接近成功
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-08 00:11:27 IP:219.84.xxx.xxx 訂閱
感謝各位先進的指導,小弟只是想把有實體產生的 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-08 14:12:44 IP:122.127.xxx.xxx 訂閱
雖已結案,但能否順便po一下load的方法, 謝謝!
------
努力會更接近成功
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-08 15:23:32 IP:203.79.xxx.xxx 訂閱
希望有幫助


[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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-01-15 10:34:28 IP:59.125.xxx.xxx 訂閱
這樣的方法,只能存取 published 的屬性,不能存取 public 的屬性。
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-01-15 11:22:16 IP:203.79.xxx.xxx 訂閱
sryang 大大:

因為小弟的需求確實也僅需要 published 的 property ,所以沒再繼續往下研究。不知知 sryang大大對於 public 的 property 列舉的方式,甚至是protected or private 的,有沒有可以指導小弟的,謝謝



===================引 用 sryang 文 章===================
這樣的方法,只能存取 published 的屬性,不能存取 public 的屬性。
sryang
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-01-15 17:32:41 IP:59.125.xxx.xxx 訂閱
用 RTTI (Run-time Type Information) 的話,就只能抓得到 published 的屬性了
至於 public 甚至是 protected 或 private 要如何列舉,我也想知道咧
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2017-12-13 13:38:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!