关于TOLEContainer.LoadFromStream方法以及剪贴板消息的处理(200分)

  • 主题发起人 主题发起人 DragonPC_???
  • 开始时间 开始时间
D

DragonPC_???

Unregistered / Unconfirmed
GUEST, unregistred user!
朋友有几个Word文件,需要放到网络上面去给人家看,但是要求文件只能够看,不能够保存,不
能够使用剪贴板拷贝。(别的拷贝方式就不用考虑了~~~)
我将word文件通过编写rc文件编译到了res文件里面

代码:
{$R wordfile.RES}
//  从编译到Exe文件里面的wordfile.RES文件里面载入名字为Test,类型为WORDFILE的资源
function LoadWordFileFromRes(): TResourceStream;
begin
  result := TResourceStream.Create(Hinstance, 'Test', 'WORDFILE');
end;

并准备通过OLEContainer装载ResourceStream显示

代码:
procedure TForm1.Button1Click(Sender: TObject);
var
  res: TResourceStream;
begin
  res := LoadWordFileFromRes();
  res.Position := 0;
  //  res.SaveToFile('Temp.doc') ; 经测试产生的Temp.doc完全正确

  try
    with OleContainer1 do
    begin
      if (State = osEmpty) then
      begin
        CreateObject('Word.Document', False);
        DoVerb(PrimaryVerb);
      end;
      //  在这里没有问题,OleContainer出现了Word界面和空白文档

      LoadFromStream(res);
      //  报invalid stream format错误
      
      LoadFormFile('temp.doc') ;
      //  仍然报invalid stream format错误,我KAO
    end;
  finally
    res.Free;
  end;
end;

这是什么问题?

另外这个程序我需要配合剪贴板事件处理
代码:
private
    NextClipHwnd: HWND;
    procedure WMDrawClipBoard(var AMessage: TMessage); message WM_DRAWCLIPBOARD;
... ...

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  NextClipHwnd := SetClipBoardViewer(Handle);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ChangeClipboardChain(Handle, NextClipHwnd);
  SendMessage(NextClipHwnd, WM_CHANGECBCHAIN, Handle, NextClipHwnd);
end;

procedure TForm1.WMDrawClipBoard(var AMessage: TMessage);
begin
  //  SendMessage(NextClipHwnd, AMessage.Msg, AMessage.WParam, AMessage.LParam);

  //  探测到新的剪贴板事件以后,清除Clipboard内容
  //  Clipboard.Clear;
  //  ~~~~~~~~~~~~~~~~问题就在这里,加上这句话就整个程序完蛋,我理解可能OLEContainer
  //  的某些操作可能和Clipboard有关
  
end;
 
两中Stream的格式不一样,olecontainer的loadFromstream只能装入通过OleContainer
的SaveToStream的Stream。
 
是吗?我试试看看,如果OK这个问题分给你一半,第二个问题呢?使用OLEContainer的情况
下面如何取消系统剪贴板的工作?
 
OK,搞定,ydfq大师真是小生的再生父母呀,可怜小生在朋友面前(异性)夸下海口,这问
题算是解决了一半!谢谢!
 
我知道了,在OLEContainer读入File的时候,剪贴板的确有频繁的改动,我现在延时一段时
间在处理剪贴板消息就OK了。
 
恭喜你啊~~
 
后退
顶部