关于在组件中调用word输入试题信息,在word中输入试题信息,因为试题信息比较复杂,可能有特殊符号/公式/图片表格等信息,所以调用word,关闭后返回试题信息到该组件,能保存组件中的试题信息到数据库,能从数据库中读出该试题信息显示到组件中,可是richedit不行呀,怎么实现这个功能?

解决方案 »

  1.   

    先将word存档,然后读.doc文件,保存在blog字段,这样如何?
      

  2.   

    以二进制形式存到数据库,读取到OleContainer
    读到OleContainer:
    先    MyMemoryStream.CopyFrom(ADOBlobStream,ADOBlobStream.Size);  
    然后  OleContainer1.LoadFromStream(MyMemoryStream)从OleContainer保存到数据库:
    先    OleContainer1.SaveToStream(MyMemoryStream);  
    然后  ADOBlobStream.CopyFrom(MyMemoryStream,MyMemoryStream.Size);  
      

  3.   

    能不能把思路说一下,使用什么控件OleContainer?,有完整的源代码吗?
      

  4.   

    OleContainer是Delphi自带的一个控件,在System选项卡中,它可以装载包括Word/Excel....等很多的Ole对象
    你可以把你要调用的Word文档以二进制的形式存进数据库里,然后再读取到OleContainer中显示出来,它是可以编辑修改的,就像直接使用Word一样,最后你可以把修改后的文档再次存进数据库,那就实现了你要的功能了。
    你可以先双击那OleContainer新建一个Word文档对象
    大概写了个代码,你看看吧://把Ole中的文档存到数据库
    procedure TForm1.BtnSaveFromOleClick(Sender: TObject);
    var
      MyBlobStream : TADOBlobStream;
      MyMemoryStream : TMemoryStream;
      BlobFiled : TBlobField;
    begin
      ADOQuery2.Open; //连接到你要操作的数据表
      ADOQuery2.Insert;
      MyMemoryStream := TMemoryStream.Create;
      OleContainer1.SaveToStream(MyMemoryStream);
      BlobFiled := TBlobField(ADOQuery2.FieldByName('FileBlob')); //假设存文档的字段为FileBlob
      MyBlobStream := TADOBlobStream.Create(BlobFiled, bmWrite);
      Try
        MyBlobStream.Seek(0, soFromBeginning);
        MyMemoryStream.Position := 0;
        MyBlobStream.CopyFrom(MyMemoryStream, MyMemoryStream.Size);
      finally
        MyMemoryStream.Free;
        MyBlobStream.Free;
      end;
      ADOQuery2.Post;end;//读到Ole
    procedure TForm1.BtnLoadFromOleClick(Sender: TObject);
    var
      MyBlobStream : TADOBlobStream;
      MyMemoryStream : TMemoryStream;
      BlobFiled : TBlobField;
    begin
      if MemoSqlCmd.Text <> '' then
        ADOQuery2.SQL.Text := MemoSqlCmd.Text; //这里用了个Memo写SQL语句
      if ADOQuery2.Active then Close;
      ADOQuery2.Open;
      BlobFiled := TBlobField(ADOQuery2.FieldByName('FileBlob'));
      MyMemoryStream := TMemoryStream.Create;
      MyBlobStream := TADOBlobStream.Create(BlobFiled, bmRead);
      Try
        MyMemoryStream.CopyFrom(MyBlobStream, MyBlobStream.Size);
        MyMemoryStream.Position := 0;
        OleContainer1.LoadFromStream(MyMemoryStream);
      finally
        MyBlobStream.Free;
        MyMemoryStream.Free;
      end;
      OleContainer1.Run;
    end;