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

  • 主题发起人 主题发起人 xfast
  • 开始时间 开始时间
X

xfast

Unregistered / Unconfirmed
GUEST, unregistred user!
实现word预览:
oleContainer1.Loadfromfile(FFileName);
实现word编辑:
try
oleContainer1.Loadfromfile(FFileName);
except
oleContainer1.CreateObjectfromfile(FFileName, False);
End;
oleContainer1.DoVerb(-1) ; //(shangshang提供)
如何实现预览时翻页?
本贴200分给shangshang ,谁解决了预览时翻页将得到300分(200分另外开贴给)
 
今天算总帐了,是怎么滴,呵呵,都来了。
 
什么叫预览翻页呢?自己控制翻页吗?
 
就是在预览状态下翻页,不是在编辑状态下翻页。
 
编辑状态也可以翻页,你只要把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.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;
是不是这个效果?
 
哎,一楼又骗走200分
 
小神通 给的代码是可以集成到一个窗口,但经常看不到打印预览的效果,而且关闭时会触发异常。
 
给我问的帖子类似
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3424882
 
这个效果可能是很难实现了,算了不做这个效果了,结帖。。。
另外200分在另外一个帖子给,打算给分如下:
蓝叶菱 100
小神通 50
nadsky 50
 
蓝叶菱、小神通和nadsky请到这个地址拿分:

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3426920
 
后退
顶部