起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 194|回复: 7

【搞定】以下代码添加ole附件保存不了?应该怎么修改?**

[复制链接]
发表于 2007-7-20 12:26:36 | 显示全部楼层 |阅读模式
procedure TFormNetwork.BtnAddAssClick(Sender: TObject);
begin
  DataSetBrokerAccessorie.DataSet.Append;//附件数据集添加
  if OpenDialog.Execute then                        
  begin
    TOleContainer(INFONETWORKPLAN.TYJWLJH(DocView1.Doc).DataEditAss.InplaceControl).
    CreateObjectFromFile(OpenDialog.FileName, False);//加ole附件  INFONETWORKPLAN.TYJWLJH(DocView1.Doc).DataEditNumber.Text :=
  SysUtils.IntToStr(DataSetBrokerAccessorie.DataSet.RecordCount + 1);//添加序号
  INFONETWORKPLAN.TYJWLJH(DocView1.Doc).DataEditName.Text := OpenDialog.FileName;//添加路径
    DataSetBrokerAccessorie.DataSet.Post;
    DataSetBrokerAccessorie.DataSet.ApplyUpdates;
  end;

end;


但是执行后ole附件中还是空的,我把后面2句屏蔽后,可以看见DataEditNumber字段存在附件,但是直接保存还是保存不上,而打开一次后再保存才能保存,为什么?应该怎么修改??
回复

使用道具 举报

 楼主| 发表于 2007-7-20 12:55:22 | 显示全部楼层
http://bbs.justep.com/forum.php?mod=viewthread&tid=1951

No.2  导入文档之后,如何保存到字段中
var
  lOle:TOleContainer;
begin
    lOle := (EDContent.InplaceControl) as TOleContainer;
    if lOle.InsertObjectDialog then
    begin
        StreamSaveToField(dsbOATpgroup.DataSet.FieldByName('OASendtpcontent'),lOle);
    end;
//  if  DLGLoaddoc.Execute then
//     lOle.CreateObjectFromFile(DLGLoaddoc.FileName, False);
end;


static procedure TOARsgroup.StreamSaveToField(AField:TDataField;AOle:TOleContainer);
var
  lStream: TMemoryStream;
begin
  lStream := TMemoryStream.Create;
  try
    AOle.AllowInPlace := True;
    AOle.SaveToStream(lStream);
    if  not AField.DataSet.Active then AField.DataSet.Open;
    AField.DataSet.Edit;
    TBlobField(AField).LoadFromStream(lStream);
    AField.DataSet.Post;
  finally
    lStream.Free;
  end;
end;


lOle := (EDContent.InplaceControl) as TOleContainer;中的EDContent是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 13:09:47 | 显示全部楼层
结贴吧,不好意思
if OpenDialog.Execute then
  begin
    DataSetBrokerAccessorie.DataSet.Append;
    TBlobField(DataSetBrokerAccessorie.DataSet.FieldByName('Accessories')).LoadFromFile(OpenDialog.FileName);
    DataSetBrokerAccessorie.DataSet.FieldByName('Number').AsInteger :=
    DataSetBrokerAccessorie.DataSet.RecordCount + 1;
    DataSetBrokerAccessorie.DataSet.FieldByName('Name').AsString :=
    OpenDialog.FileName.;
    DataSetBrokerAccessorie.DataSet.Post;
    DataSetBrokerAccessorie.DataSet.ApplyUpdates;
  end;

用以下这句解决了TBlobField(DataSetBrokerAccessorie.DataSet.FieldByName('Accessories')).LoadFromFile(OpenDialog.FileName);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 13:41:57 | 显示全部楼层
不过现在又出这样的错误,刚开始还好一点,多试了几次就怎么出现这样的问题? ;)  ;)  ;)  ;)

1.jpg

76.86 KB, 下载次数: 135

回复 支持 反对

使用道具 举报

发表于 2007-7-20 14:11:25 | 显示全部楼层
多试几次:是什么意思?

同一条记录多次载入文件吗?

另外,错误定位在哪句代码上?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 14:17:28 | 显示全部楼层
错误应该在TBlobField(FieldByName('Accessories')).LoadFromFile(OpenDialog.FileName); 代码上
多试几次就是多条记录都增加了附件。加了几次后报那个错误就再也加不了附件了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 15:10:32 | 显示全部楼层
找了你们好多帖子,有的说能用TBlobField(FieldByName('Accessories')).LoadFromFile(OpenDialog.FileName);写入OLE字段,有的说必须要TOleContainer.CreateObjectFromFile这个,想想都乱了,自己再试几次吧,希望你们也尽量给我回复用那种好!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-20 15:50:31 | 显示全部楼层
var
  I: Integer;
  lFileName: string;
  lOle: TOleContainer;
  lStream: TMemoryStream;
begin
  if OpenDialogAccessorie.Execute then
  begin
    lFileName := OpenDialogAccessorie.FileName;
    I := Pos('\',lFileName);
    while I<>0 do
    begin
      lFileName := Copy(lFileName,I+1,Length(lFileName)-I+1);
      I := Pos('\',lFileName);
    end;

    lOle := TOleContainer.Create(self);
    try
      lOle.Parent := Self;
      lOle.CreateObjectFromFile(OpenDialogAccessorie.FileName, False);
      try
        lStream := TMemoryStream.Create;
        lOle.SaveToStream(lStream);

        with DataSetBrokerAccessorie.DataSet do
        begin
          Append;
          TBlobField(FieldByName('Accessories')).LoadFromStream(lStream);
          FieldByName('Number').AsInteger := RecordCount + 1;
          FieldByName('Name').AsString := lFileName;
          Post;
          ApplyUpdates;
        end;
      finally
        lStream.Free;
      end;
    finally
      lOle.free;
    end;
  end;

结贴吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-12 18:55 , Processed in 0.046199 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表