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

把控件属性保存为文件/文本文件的方法,及DELPHI的HELP里的例子的BUG

答題得分者是:mustapha.wang
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 22:38:21 IP:218.17.xxx.xxx 未訂閱
用 TStream.WriteComponent(AComponent)可以把一个控件的属性保存到TStream中。TStream自然可以保存为文件。相对的另一个函数可以把保存到文件里的属性调进来,把当前的控件的属性改掉:TStream.ReadComponent(AComponent) 但这样保存的数据是2进制的。人读不懂。 然后,我查到HELP,用 ObjectBinaryToText 这个函数可以把2进制的数据转换为文本数据。这样就可以读懂了。结构和在IDE里把FORM保存为TEXT时看到的一样。 关于这个函数,HELP里有EXAMPLE。但EXAMPLE里的函数例子不能正常执行。 那个例子如下: function StringToComponent(Value: string): TComponent; var StrStream:TStringStream; BinStream: TMemoryStream; begin StrStream := TStringStream.Create(Value); try BinStream := TMemoryStream.Create; try ObjectTextToBinary(StrStream, BinStream); BinStream.Seek(0, soFromBeginning); Result := BinStream.ReadComponent(nil); finally BinStream.Free; end; finally StrStream.Free; end; end; ------------------- 但上面这个函数,一运行的话,会报告错误。比如你保存的是一个TLabel的属性。它会告诉你没有TLabel这个类型。 OK,在这个函数的前面加上 RegisterClass(TLabel); ,这下它认识TLabel了。运行正常不出错误。但是 ... Label1:=StringToComponent(S) as TLabel; (当然,这个S一定是合法的文本),可惜,Label1的属性并没有跟着变为S描述的样子。 我不知道这是不是BUG,还是我不会用? 但我把它改造后,Label1的样子就可以跟着S来变了: ---------------------------------- procedure StringToComponent(Value: string; AC:TComponent); var StrStream:TStringStream; BinStream: TMemoryStream; begin StrStream := TStringStream.Create(Value); try BinStream := TMemoryStream.Create; try ObjectTextToBinary(StrStream, BinStream); BinStream.Seek(0, soFromBeginning); Result := BinStream.ReadComponent(AC); finally BinStream.Free; end; finally StrStream.Free; end; end; ----------------------------------- 改造后的上面这个procedure 是可以让 Label1 的外观变得和S文本描述的一样了。 这个东东有什么用?我只想到拿来做动态变换语言用。比如把界面上的英文提示立即变为中文。还有其它用吗? ------------------------- BTW:第一次发的时候,网络断了。再发一次,不知道是否会发重?
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-30 17:33:29 IP:218.1.xxx.xxx 未訂閱
Delphi的StringToComponent是创建了一个新的元件,如Lable100, 把它赋给个Label1,是何意思?是Label1这个指针指向了Label100,而你也失去了对原来的Label1的踪迹,只能用for i:=0 to ComponentCount-1 去找了,还不能用名称,因为Label1已经叫Label100了。一般说来,应该用 Label1.Assign(StringToComponent(S) as TLabel);但要看TLabel实作Assign没有。 你修改了StringToComponent后,ReadComponent的参数有元件了,就把属性给你传入的元件了。 Label1:=StringToComponent(S) as TLabel; 这套东西是delphi本身用来处理DFM的,我们确实能用来保存参数。
------
江上何人初见月,江月何年初照人
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-30 17:44:38 IP:218.17.xxx.xxx 未訂閱
谢谢您的解答!!
系統時間:2024-05-05 21:44:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!