转帖:怎样实现olecontainer控制Word预览时可以翻页?

怎样实现olecontainer控制Word预览时可以翻页? 


怎样实现olecontainer控制Word预览时可以翻页?

实现word预览:

    oleContainer1.Loadfromfile(FFileName);

实现word编辑:  

      try

        oleContainer1.Loadfromfile(FFileName);        

      except

        oleContainer1.CreateObjectfromfile(FFileName, False);

      End;

      oleContainer1.DoVerb(-1) ; //(shangshang提供)

如何实现预览时翻页?

本贴200分给shangshang ,谁解决了预览时翻页将得到300分(200分另外开贴给)


这个效果可能是很难实现了,算了不做这个效果了,结帖。。。

另外200分在另外一个帖子给,打算给分如下:

蓝叶菱 100

小神通 50

nadsky 50


今天算总帐了,是怎么滴,呵呵,都来了。


什么叫预览翻页呢?自己控制翻页吗?


就是在预览状态下翻页,不是在编辑状态下翻页。


编辑状态也可以翻页,你只要把WORD锁定成窗体就可以了,和预览一样,而且效果非常的好。

不过你一定使用OLE对WORD加密(文档保护为窗体),。

一下是一段保护程序。

procedure TFrmCertificate_Sample.Word2000DocumentBeforeClose(

  Sender: TObject; var Doc, Cancel: OleVariant);

var

  SaveChanges,OriginalFormat,RouteDocument:OleVariant;

  FileName,FileFormat:OleVariant;

  NoReset,Password:OleVariant;

begin

  NoReset:=False;

  Password:='19781101';

  Word2000.Selection.Document.Protect(wdAllowOnlyComments,NoReset,Password);

//-------你把保护改成窗体就可以了。

  SaveChanges:=wdDoNotSaveChanges;

  OriginalFormat:=Unassigned;

  RouteDocument:=Unassigned;

  FileName:=MyFrame.WordFile;

  FileFormat:=EmptyParam;

  Word2000.Selection.Document.SaveAs(FileName,FileFormat,EmptyParam,EmptyParam,EmptyParam,

                     EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

  MyFrame.Pages:=Word2000.Selection.Information[wdNumberOfPagesInDocument]+1;

  try

     Word2000.Quit(SaveChanges,OriginalFormat,RouteDocument);

     Word2000.Disconnect;

  except

     on e: Exception do

     begin

       ErrMessage('软件远程接口错误!'+#13+'错误号码:'+e.Message);

       Word2000.Disconnect;

     end;

  end;

  MyMessage.Msg:=CM_WORDQUIT;

  PostMyMsg(MyFrame.WaitHwnd);

end;

对于使用WORD2000(wordApplication)接管OLE,你应该能够找到资料。


var

VWordApp, VVisible: Variant;

 

AWordDoc.PrintPreview;

  VWordApp.Selection.EndKey(6);

  VWordApp.Selection.HomeKey(6);

  VPageCount := AWordDoc.BuiltInDocumentProperties['Number of Pages'];

  for VIndex := 1 to VPageCount do

    VWordApp.Browser.Next;

  AWordDoc.ClosePrintPreview;

试试这个


谁有oleContainer这个控件完全使用手册


是用olecontainer在预览状态下翻页,不是在编辑状态下翻页(默认状态下是只能看到第一页的内容,现在想看到第二页及第二页以上的内容)。这么做的原因是可以集成在一个窗体里,用WordApplication做就没有意义了,就变成两个窗体,不符合要求。[:)]


unit PreviewWord;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, DB, ADODB, OleCtnrs,ComObj, Buttons, Mask, DBCtrls,

  ExtCtrls;

type

  TForm1 = class(TForm)

    ADOConnection1: TADOConnection;

    ADOQuery1: TADOQuery;

    OpenDialog1: TOpenDialog;

    OleContainer2: TOleContainer;

    DBEdit1: TDBEdit;

    DataSource1: TDataSource;

    BitBtn1: TBitBtn;

    Button1: TButton;

    Panel1: TPanel;

    ScrollBox1: TScrollBox;

    OleContainer1: TOleContainer;

    ScrollBox2: TScrollBox;

    Splitter1: TSplitter;

    procedure Button1Click(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure DBEdit1Change(Sender: TObject);

  private

    procedure s_ole_clickck(Sender:TObject;Button:TMouseButton; Shift: TShiftState; X, Y: Integer);

    function create_S_Ole(nn:integer):ToleContainer;

    procedure delete_s_ole;

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

function get_th(i:integer):string;

var

    s:string;

begin

    s:='一    二    三    四    五    六    七    八    九    十    十一  十二  十三';

    s:=s+'  十四  十五  十六  十七  十八  十九  二十  二十一二十二二十三二十四二十五二十六二十七二十八二十九三十 ';

    result:=(trim(copy(s,i*6+1,6)));

end;

function get_olecontainer(word:variant):string;

var

    ss:string;

begin

    word.selection.homekey(6);             //Ctrl+Home;

    word.browser.next;                     //Next Page;

    word.selection.homekey(6,1);           //Ctrl+Shift+Home

    ss:=word.selection;

    try

        word.selection.cut;                //cut

    except

        ss:='';

        word.selection.WholeStory;

        word.selection.cut;                //cut

    end;

    result:=ss;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

    BS: tmemorystream;

    word:variant;

    s:string;

    BlobField: TField;

begin                                //分解Word 原文

    dbedit1.DataField:='';

    delete_s_ole;

    if not OpenDialog1.Execute then exit;

    with adoquery1 do begin

        close;

        sql.Text:='delete from File_nr';

        execsql;

        close;

        sql.Text:='select * from File_nr';

        open;

    end;

    word:=createoleobject('word.application');

    word.documents.add;

    word.Selection.InsertFile(OpenDialog1.FileName);   //打开word文件

    s:='s';

    while s<>'' do begin

        s:=get_olecontainer(word);          // 得到Word的每一页

        if olecontainer2.canpaste then olecontainer2.paste;

        olecontainer2.update;

        with adoquery1 do begin          //存贮得到的一页Word文件

            bs:=tmemorystream.Create;;

            olecontainer2.SaveToStream(bs);

            blobField:=fieldbyname('nr');

            Append;

            (BlobField as Tblobfield).loadFromStream(bs);

            Post;

        end;

    end;

    word.ActiveDocument.Saved:=True;

    word.quit;

    BitBtn1.Click;              //   预览

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var

    nn:integer;

    BS:TStream;

    olename:tolecontainer;

begin

    dbedit1.DataField:='';

    delete_s_ole;

    with adoquery1 do begin

        close;

        sql.Text:='select * from file_nr';

        open;

        first;

        nn:=0;

        while not eof do begin

            olename:=create_S_Ole(nn);

            bs:=adoquery1.CreateBlobStream(fieldbyname('nr'),bmread);

            bs.Position:=0;

            olename.LoadFromstream(bs);

            olename.update;

            nn:=nn+1;

            next;

        end;

    end;

    dbedit1.DataField:='id';

end;

procedure TForm1.s_ole_clickck(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

var

    n:integer;

    s:string;

begin

    dbedit1.DataField:='';

    s:=(sender as Tolecontainer).name;

    adoquery1.First;

    n:=strtoint(copy(s,6,length(s)));

    adoquery1.moveby(n);

    dbedit1.DataField:='id';

end;

function TForm1.create_S_Ole(nn: integer): ToleContainer;

var

    ss:Tolecontainer;

    tt:Tlabel;

    row:integer;

begin

    row:=nn+1;

    scrollbox2.VertScrollBar.Position:=0;

    ss:=tolecontainer.Create(scrollbox2);

    ss.Left:=1;

    ss.Top:=(row-1)*180+10;

    ss.Width:=130;

    ss.Height:=150;

    ss.Name:='ole_s'+inttostr(nn);

    ss.parent:=scrollbox2;

    ss.SizeMode:=smScale;

    ss.Visible:=True;

    ss.AllowInPlace:=False;

    ss.AllowActiveDoc:=False;

    ss.AutoVerbMenu:=False;

    ss.AutoActivate:=aaManual;

    ss.OnMouseDown:=s_ole_clickck;

    tt:=Tlabel.Create(scrollbox2);

    tt.parent:=scrollbox2;

    tt.Left:=ss.Left+45;

    tt.Top:=ss.top+ss.Height+5;

    tt.Caption:='第'+get_th(nn)+'页';

    tt.Visible:=True;

    result:=ss;

end;

procedure TForm1.DBEdit1Change(Sender: TObject);

var

    BS: TStream;

begin

    if dbedit1.DataField='' then exit;

    with adoquery1 do begin

        bs:=adoquery1.CreateBlobStream(fieldbyname('nr'),bmread);

        bs.Position:=0;

        olecontainer1.LoadFromstream(bs);

        olecontainer1.update;

        if olecontainer1.Visible then

        olecontainer1.SetFocus;

    end;

    dbedit1.DataField:='id';

end;

procedure TForm1.delete_s_ole;

var

    i:integer;

begin

    for i:=scrollbox2.ControlCount-1 downto 0 do begin

        scrollbox2.Controls[i].Destroy;

    end;

end;

end.


上面例子不错的,你可以吧数据库去掉。

这个是我在www.tomore.com找到的。你也可以找到过。我记得我以前找到一个带数据库的。其实你可以自己建立库,猜的。

不OLE看WORD的所有页面。


uses ActiveX;

procedure TForm1.Button1Click(Sender: TObject);

var

 IOO: IOleInPlaceObject ;

begin

OleContainer1.DoVerb(ovShow);

if OleContainer1.State in [osUIActive]  then

 begin

   OleContainer1.OleObjectInterface.QueryInterface(IOleInPlaceObject,IOO);

   IOO.UIDeactivate;

   IOO :=nil;

 end;

 olecontainer1.oleobject.application.wordbasic.fileprintpreview;

// 或者 OleContainer1.OleObject.PrintPreview;

 OleContainer1.DoVerb(ovShow);

end;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值