把控件属性保存为文件/文本文件的方法,及DELPHI的HELP里的例子的BUG |
答題得分者是:mustapha.wang
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
用 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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |