怎么把组件里的内容转成流,需要时再将流转成原来的内容。(50分)

  • 主题发起人 易名烦
  • 开始时间
对不住了,你也帮忙啊!
 
我有做过把控件保存到数据库中。并再恢复回来。
一切正常,并写了一个自定义标签(很火兰)
 
to wwolf:
把主要的代码贴出来看一下,主要是写和读的时候。
 
没什么分。。。懒得动.呵呵。。。
 
不会吧,wwolf以前都助人为乐,怎么这次这样啊,没道理!
 
呵呵,被你说一下我都不好意思了。。。。。
 
啊!!!本想贴上来的。突然发现我居然没有备份。。。

呜~~~,源码在原来的公司里。。。。我倒~
 
能贴出来吗?
 
to:易名烦

我正烦呢!也不知道还在不在,会不会被后来都format了。。。。

那。。。。咳。。。都是当时没留心。我试试回去找找,只能碰运气啦。
 
谢了先!
 
procedure LoadMyLabelFromDB(aName:String;isBox:Boolean;var aStream:TMemoryStream);
var
Rs:TAdoDataSet;
ls:String;
begin
Rs := TAdoDataSet.Create(Nil);
Rs.Connection := SysConnection;
if isBox then ls:='1 'else ls:='0 ';
Rs.CommandText := 'Select * from 自定义标签 where isBox='+ls+
'and ReportName='''+aName+'''';
try
Rs.Open ;
if Rs.RecordCount >0 then
begin
Rs.First;
aStream.Clear;
(Rs.FieldByName('Object') as Tblobfield).SaveToStream(aStream);
aStream.Position :=0;
end;
Rs.Close;
except
on e : exception do
ShowMessage('读取自定义标签时出错!错误信息:'+#10#10+e.Message )
end;
Rs.Free;
end;

procedure SaveMyLabelToDB(aName:String;aStream:TMemoryStream;isBox:Boolean);
var
Rs:TAdoDataSet;
ls:String;
begin
Rs := TAdoDataSet.Create(Nil);
Rs.Connection := SysConnection;
if isBox then ls:='1 'else ls:='0 ';
Rs.CommandText := 'Select * from 自定义标签 where isBox='+ls+
'and ReportName='''+aName+'''';
try
Rs.Open ;
if Rs.RecordCount >0 then
begin
Rs.First;
Rs.Edit;
(Rs.FieldByName('Object') as Tblobfield).LoadFromStream(aStream);
Rs.Post;
end
else
begin
Rs.Append ;
Rs.FieldByName('ReportName').Value := aName;
TBlobField(Rs.FieldByName('Object')).LoadFromStream(aStream);
// (Rs.FieldByName('Object') as Tblobfield).LoadFromStream(aStream);
Rs.FieldByName('isBox').Value := isBox;
Rs.Post ;
end;
rs.Close;
except
on e : exception do
ShowMessage('保存自定义标签时出错!错误信息:'+#10#10+e.Message )
end;
Rs.Free;
end;

//以下是调用时的情况
//****************************************
procedure TSaveForm.btnOKClick(Sender: TObject);
var Stream: TMemoryStream;
begin
if FindStrInList(edRptName.Text,ListBox1.Items) then
if application.MessageBox('已有一同名的标签存在,是否覆盖?','确认',MB_YESNO)=IDNO then exit;
Stream := TMemoryStream.Create;
try
Stream.WriteComponent(CustomLabelForm.ActiveMDIChild);
SaveMyLabelToDB(edRptName.Text,Stream,(CustomLabelForm.ActiveMDIChild as TDemoForm).isBox.Checked);
CustomLabelForm.ActiveMDIChild.Caption := edRptName.Text;
finally
Stream.Free;
end;
end;

///////////////////////////////

procedure TCustomLabelForm.NOpenClick(Sender: TObject);
var
i:integer;
Stream: TMemoryStream;
begin
if LoadForm.showModal=mrCancel then exit;
Screen.Cursor := -11;
DemoForm := TDemoForm.Create(Self);
for i := DemoForm.ComponentCount - 1 downto 0 do
DemoForm.Components.Free;
Stream := TMemoryStream.Create;
LoadMyLabelFromDB(LoadForm.ComboBox1.Text,LoadForm.RadioBox.Checked,Stream);
try
try
Stream.ReadComponent(DemoForm);
except
on e : exception do
ShowMessage('读取自定义标签时出错!错误信息:'+#10#10+e.Message );
end;
finally
Stream.Free;
end;
DemoForm.Caption :=LoadForm.ComboBox1.Text;
for i:= DemoForm.ComponentCount-1 downto 0 do
begin
if DemoForm.Components.ClassName ='TQuickRep' then
begin
TForm((DemoForm.Components as TQuickRep)).OnMouseDown := DemoForm.ReportOnMouseDown ;
TForm((DemoForm.Components as TQuickRep)).OnDblClick := NSettingClick;
end
else
begin
if DemoForm.Components.ClassName ='TStaticText' then
begin
(DemoForm.Components as TStaticText).OnMouseDown := ObjectMouseDown;
end
else
begin
if DemoForm.Components.ClassName ='TShape' then
begin
(DemoForm.Components as TShape).OnMouseDown := ObjectMouseDown;
end
else
begin
if DemoForm.Components.ClassName <> 'TCheckBox' then
DemoForm.Components.Free;
end;
end;
end;
end;
DemoForm.Left := (ClientWidth - DemoForm.Width) div 2;
DemoForm.Top := (ClientHeight - DemoForm.Height-86) div 2;
SetMenuState(True);
Screen.Cursor := 0;
end;


 
我是把整个表单都包括进去了。同时包括表单上的各控件及其属性。

呵呵,也不是我理解题目的意思是否正确。。。
 
谢谢,看看先!
 
beta,我写的读出代码:
procedure StreamToMsgPart(Stream: TMemoryStream; Mp: TIDMessageParts);
procedure ReadString(Stream: TMemoryStream; Str: string);
var
Size:integer;
begin
stream.Read(Size,4);
stream.Read(str,size);
end;
procedure ReadInteger(Stream: TMemoryStream; Int: Integer);
begin
Stream.Read(int,4);
end;
var
i,ls: Integer;
begin
stream.Position:=0;
for i := 0 to mp.Count - 1 do
begin
ReadString(Stream,mp.ContentTransfer);
ReadString(Stream,mp.ContentType);
ReadString(Stream,mp.ExtraHeaders.text);
ReadString(Stream,mp.ExtraHeaders.NameValueSeparator);
ReadInteger(Stream,ls);
mp.ExtraHeaders.CaseSensitive:=chr(ls);
ReadInteger(Stream,ls);
mp.ExtraHeaders.UnfoldLines:=chr(ls);
ReadInteger(Stream,ls);
mp.ExtraHeaders.FoldLines:=chr(ls);
ReadInteger(Stream,mp.ExtraHeaders.FoldLength);
end;
end;
 
你的读出流的过程的参数必须是变参!否则无法传回来:
procedure ReadString(Stream: TMemoryStream; [red]var[/red] Str: string);
procedure ReadInteger(Stream: TMemoryStream; [red]var[/red] Int: Integer);

不过由于很多属性(好像是全部[:)])不能作为变参,于是你需要定义为函数:
function ReadString(Stream: TMemoryStream): string;
var
Size:integer;
begin
stream.Read(Size,4);
stream.Read(Result, size);
end;

然后这样用:
mp.ContentTransfer := ReadString(Stream);
其他类似,你再根据这个写试一试?

sorry,前几天学校网络断了几天:(
 
能解决邮件乱码的问题吗?
 
http://www.playicq.com/dispdoc.php?t=&amp;id=2193
 
多人接受答案了。
 
:易名烦
我最近也正在做,研究了你上面所说的所有方法,但还是在“stream.write(str[1],size"这里有错,你可不可以把你解决的方法给我一份,谢了
wangzhengbo@21cn.com
 
顶部