在delphi中如何打开、关闭和修改word文档 急啊!在线等 ( 积分: 200 )

  • 主题发起人 主题发起人 jdlp
  • 开始时间 开始时间
J

jdlp

Unregistered / Unconfirmed
GUEST, unregistred user!
比如在delphi中的某个edit中输入姓名:***,则点击某个按钮后,打开一个word文档并把***插入到某个特定的位置。
 
比如在delphi中的某个edit中输入姓名:***,则点击某个按钮后,打开一个word文档并把***插入到某个特定的位置。
 
大虾们,给点建议啊!
 
在Delphi的Servers组件页中有很多用于操作Office的组件,你可以在网上搜索它们的用法。
 
我就是不会用这些控件。摸不到门啊!
那位大虾可以说说怎们用啊!
 
江湖救急啊!
 
我的天! 全文检索 里面至少有200个答案!
 
呵呵,别为难他了.
给你个最简单的例子
var
Template,NewTemplate :OleVariant;
begin
Template:=emptyParam;
NewTemplate:=true;
WordApplication1.Connect;
WordDocument1.ConnectTo(WordApplication1.Documents.Add(EmptyParam,NewTemplate) );
WordApplication1.Visible:=true;
WordDocument1.Paragraphs.Add(EmptyParam).Range.InsertAfter('阿里巴巴是个快乐的青年');
WordDocument1.Disconnect;
WordApplication1.Disconnect;
end;
 
屏蔽工具栏
For i = 1 To ThisDocument.CommandBars.Count
If Not ThisDocument.CommandBars(i).Enabled then
ThisDocument.CommandBars(i).Enabled = True
End If
Next
上面是vba 代码 你可换成delphi 代码即可
一. if not DirectoryExists('c:/qqqq') then
CreateDir('c:/qqqq');
二.GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序
三.
一、Delphi程序启动Word采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word二、Delphi程序新建Word文稿格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)Template: 使用模板的名称,NewTemplate: 新建文档的类型,True表示为模板,False表示为文档DocumentType: 文档类型,默认为空白文档Visible: 打捞的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:/Temlate.dot',NewTemplate:=False);
三、Delphi程序打开Word文稿格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument, PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate, Format,Encoding,Visible)FileName: 文档名(包含路径)Confirmconversions: 是否显示文件转换对话框ReadOnly: 是否以只读方式打开文档AddToRecentFiles: 是否将文件添加到"文件"菜单底部的最近使用文件列表中PassWordDocument: 打开此文档时所需要的密码PasswordTemplate: 打开此模板时所需要的密码Revert: 如果文档已经,是否重新打开文档WritePasswordDocument: 保存对文档更改时所需要的密码WritePasswordTemplate: 保存对模板进行更改时所需要的密码Format: 打开文档时所需使用的文件转换器
Encoding: 所使用的文档代码页
Visible: 打开文档的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False, AddToRecentFiles:=False);四、Delphi程序保存Word文稿格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter)FileName: 文件名。默认为当前文件夹和文件名。FileFormat 文档保存的格式。LockComments 如果为 True,则此文档只允许进行批注。Password 打开文档时的口令。AddToRecentFiles 如果为True,则将文档添至"文件"菜单中最近使用的文档列表中。WritePassword 保存对文档的修改所需的口令。ReadOnlyRecommended 如果为 True,在每次打开文档时,Word 将建议用户采用只读方式。EmbedTrueTypeFonts 如果为 True,则将文档与 TrueType 字体一起保存。SaveNativePictureFormat 如果为 True,则从其他系统平台(例如 Macintosh)导入的图形仅保存其 Windows 版本。SaveFormsData 如果为 True,则将窗体中用户输入的数据存为一条数据记录。SaveAsAOCELetter 如果文档包含一个附加,当此属性值为 True 时,将文档存为一篇 AOCE 信笺(同时保存邮件)。举例:Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument, AddToRecentFiles=False);


五.打开word文档
filename := dlgopen.filename;
confirmconversions := false;
readonly := false;
addtorecentfiles := false;
passworddocument := '';
passwordtemplate := '';
revert := true;
writepassworddocument := '';
writepasswordtemplate := '';
format := wdopenformatdocument;
wordapplication.documents.open( filename, confirmconversions,
readonly, addtorecentfiles, passworddocument, passwordtemplate,
revert, writepassworddocument, writepasswordtemplate, format );
{assign worddocument component}
itemindex := 1;
worddocument.connectto(wordapplication.documents.item(itemindex));
{turn spell checking of because it takes a long time if enabled and slowsdo
wn winword}
wordapplication.options.checkspellingasyoutype := false;
wordapplication.options.checkgrammarasyoutype := false;
end;


ExcelApplication.DisplayAlerts[0] := False;
八:打开文档调试过的
Filename := 'D:/TRY.DOC';
Confirmconversions := false;
Readonly := false;
Addtorecentfiles := false;
Passworddocument := '';
Passwordtemplate := '';
Revert := true;
Writepassworddocument := '';
Writepasswordtemplate := '';
Format := wdopenformatdocument;
Encoding := '';
Visible := true;
WDA.Connect;
WDA.Documents.Open(FileName, Confirmconversions, Readonly,
Addtorecentfiles, Passworddocument, Passwordtemplate, Revert,
Writepassworddocument, Writepasswordtemplate, Format, Encoding, Visible);
四.查找的问题
begin
try
Wordapplication.Connect;
except
MessageDlg('Word may not be installed', mtError, [mbOk], 0);
Abort;
end;

Wordapplication.Visible := True;
WordApplication.Caption := 'Delphi automation';
end;

关闭Word用如下代码。如果想保存Doc文件,请修改SaveChanges变量的内容:
var
SaveChanges, OriginalFormat, RouteDocument: OleVariant;
begin

SaveChanges := WdDoNotSaveChanges;
OriginalFormat := UnAssigned;
RouteDocument := UnAssigned;
try
WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument);
WordApplication.Disconnect;
except
on E: Exceptiondo

begin

Showmessage(E.Message);
WordApplication.Disconnect;
end;

end;

end;

让Word打开一个指定的文件,需要先放置OpenDialog,然后调用
WordApplication.Documents.Open:
var
ItemIndex :OleVariant;
FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format: OleVariant;
begin

if not dlgOpen.Execute then

Exit;

{Opendo
cument}
FileName := dlgOpen.FileName;
ConfirmConversions := False;
ReadOnly := False;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := True;
WritePasswordDocument := '';
WritePasswordTemplate := '';
Format := wdOpenFormatDocument;

WordApplication.Documents.Open( FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format );

{Assign WordDocument component}
ItemIndex := 1;
WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));

{Turn Spell checking of because it takes a long time if enabled and slowsdo
wn Winword}
WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;
end;

让Word替换标记字符串要使用WordDocument.Range.Find.Execute,这里用Delphi替
换了<#Name>:
var
FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike,
MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace: OleVariant;
begin

FindText := '<#Name>';
MatchCase := False;
MatchWholeWord := True;
MatchWildcards := False;
MatchSoundsLike := False;
MatchAllWordForms := False;
Forward := True;
Wrap := wdFindContinue;
Format := False;
ReplaceWith := 'Delphi';
Replace := True;

WordDocument.Range.Find.Execute( FindText, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith, Replace );

end;

var Word_Handle,Doc_Handle:OleVariant;
try
Word_Handle:=GetActiveOleObject('Word.Application');
except
try
Word_Handle := CreateOleObject('Word.Application');
except
Exit;
end;
end;
Word_Handle.Visible := True;
Word_Handle.Documents.Open(filename);
do
c_Handle:=Word_Handle.Documents.Add(Template:=AppPath+'Database/Template.dot',NewTemplate:=False);
Word_Handle.ActiveDocument.SaveAs(FileName:='D:/aa/'+jdbh+'.doc',FileFormat:=wdFormatDocument,AddToRecentFiles:=False);

procedure ReplaceStr(SourceStr,DestStr:string;WordHandle:OleVariant);
begin
WordHandle.Selection.Find.ClearFormatting;
WordHandle.Selection.Find.Text :=SourceStr;
WordHandle.Selection.Find.Replacement.Text := DestStr;
WordHandle.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

话题1623342的标题是: WORD控制老问题,搜索不到还是直接请教了:不用WORD控件,用OLE方式控制WORD不知哪里有详细的资料。 (0分)
分类:OLE/Automation
sunyb (2003-02-21 10:33:00)
比如字体格式、表格操作等
sunyb (2003-02-15 11:52:00)
真的没人帮忙吗?
sunyb (2003-02-15 16:27:00)
看来一定要用WORD控件了
ildg (2003-02-15 16:44:00)
呵呵,我最近也要用这个东东,于是就花了两天的时间学了一下,感觉得效果很好,把我的一点点心得告诉你吧,其实很简单的,相信你一个小时就能熟练掌握:首先你要知道怎么在word中录制宏,我相信所有的人都会,然后是将宏改写成delphi的代码。步骤如下:1、创建word对象,定义如下: var FWord: Variant;//word对象 FDoc: Variant;//文档对象 创建: try FWord := CreateOleObject('Word.Application');
FWord.Visible := True;
except Screen.Cursor := crDefault;
ShowMessage('创建word对象失败!');
Exit;
end;
2、然后就是把你录制的宏粘贴在里面进行修改。需要注意以下问题: 在宏里面没有指定父对象的对象其对象都是word对象而不是文本对象, 例如宏“Selection.TypeText Text := '11'”就改为 “FWord.Selection.TypeText(Text := '11');”。 office vba是一们完整的基于对象的语言,对象很多但容易掌握, 你可以查找你机器上的文件:VBAWRD9.CHM(我用的是word2000,其它的版本 名字稍有不同),此帮助文件可能是最好的资料了。 再要注意的就是office vba里面定义了很多常量,所以转为delphi的代码时 就会提示常量没有定义,所以你要注意引用word2000这个单元(其它的版本 也要引用相关的单元。) 另外,创建对象用到的createoleobject要引用comobj单元。 ————录制宏然后再装换成delphi代码是很好的解决方案,如果还有什么问题请联系我。
华盖 (2003-02-15 18:32:00)
Uses Word2000, ComObj;var Word_Handle,Doc_Handle:OleVariant;
try Word_Handle:=GetActiveOleObject('Word.Application');
except try Word_Handle := CreateOleObject('Word.Application');
except Exit;
end;
end;
Word_Handle.Visible := True;
Word_Handle.Documents.Open(filename);
do
c_Handle:=Word_Handle.Documents.Add(Template:=AppPath+'Database/Template.dot',NewTemplate:=False);
Word_Handle.ActiveDocument.SaveAs(FileName:='D:/aa/'+jdbh+'.doc',FileFormat:=wdFormatDocument,AddToRecentFiles:=False);procedure ReplaceStr(SourceStr,DestStr:string;WordHandle:OleVariant);
begin
WordHandle.Selection.Find.ClearFormatting;
WordHandle.Selection.Find.Text :=SourceStr;
WordHandle.Selection.Find.Replacement.Text := DestStr;
WordHandle.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

sunyb (2003-02-15 19:51:00)
谢谢楼上两位,但是我要的是DELPHI控制WORD的比较系统的资料(因为OLE方式功能肯定要超过使用DELPHI控件的),你们所提供的我都搜索到了;我以前编的程序都是从服务器上下载模板,然后替换书签进行打印的,而且只用了COMOBJ一个单元。但是我现在需要做的是动态生成一张表格:1、首先输入标题,设置为黑体、加粗、居中;2、根据数据记录生成表格,插入数据。看来用OLE的人不多啊,后天要交差,实在没法也就用DELPHI控件了。
hhxxj (2003-02-16 3:59:00)
不要用OLE了,很难控制!
向红林 (2003-02-16 9:35:00)
可以先设计好 word 模板 在模板上进行控制。你会发现要简单些。
ildg (2003-02-16 11:03:00)
我受不了你了,不是说得很清楚了吗?如果你不知道怎么画表格,然后再加粗的话,就先将你要画的表格录制成一个宏,把你所有的要要求的东东都录上,然后再把宏粘贴到delphi的代码中,改一下就行了。————用ole控制word的人肯定是很多的,只是这本来就是很简单的问题,自己知道方法怎么去解决就行了。所谓授之以鱼不如授之以渔,别人已经告诉你怎么去学去用了,如果你还搞不定,那就是你自己的问题了
sunyb (2003-02-16 19:58:00)
TO ildg:首先谢谢你的帮助。但是我想用另一种方法解决,因为用控件的方法实在很简单!我在一些资料中看到用OLE控制WORD的方法是功能最全面的,所以想借完成任务的机会学习一下。看您的意思是从中国到美国只要能坐船就可以了,而不去想进一步尝试坐飞机?再次感谢回答我的问题。看了《DELPHI4编程技术内幕》也只是讲的很简单,难道真的没有这方面的资料?
ildg (2003-02-17 18:31:00)
我没说用控件去解决这个问题啊,直接创建ole对象是最灵活的,以前有人的文章也很明显的说明了这一点。如果你说的不是用ole,那我就没话说了。又如果你认为ole就是你说的用控件,那我也没法说了。如果上面两点都不成立的话,那就是用ole了。用ole的资料哪里有?到处都有,但是最好最全的就是word本身的帮助,我第一次回答你的时候也说了。其它的我没话说了。
sunyb (2003-02-18 22:04:00)
to : ildg您有没有尝试过不引用WORD97 或 WORD2000单元,单用COMOBJ单元编程控制WORD?
ildg (2003-02-21 10:33:00)
呵呵,这两天没来上班,今天才看到你的文章,sorry。word2000之类的单元是定义了一些常量,不引用这个单元当然是可以的,但是如果你不引用的话在程序里面就没办法用vba里面的常量了,那样的话修改代码就比较麻烦,这时候你只需要这样:1、打开word2、打开visual basic编辑器3、按下f2键然后就可以在对象浏览器中搜索你要找的常量,如:你如果要知道wdListNumberStyleLegalLZ在word中被定义为多少, 一查就知道是254,然后你就在程序里面将所有的wdListNumberStyleLegalLZ 都换成254就行了。——如果常量比较多的话,需要很长的时间来换这个,所以说包含word2000文件是最明智的选择,并不是包含了word2000了以后就是用控件了,只是用了常量而已。
五.字体设置
话题576396的标题是: 如何在word中,插入一个表格、图表(位置可以指定)。表格、图表是根据数据库生成的。 (0分)
分类:数据库-文件型
天与地 (2001-11-19 8:29:00)
如何在word中,插入一个表格、图表(位置可以指定)。表格、图表是根据数据库中的数据来生成的。
RedBeret (2001-06-21 16:29:00)
听听。
天与地 (2001-06-22 10:39:00)
各位老大,感觉这个问题也挺适用的!帮帮忙。
maming (2001-06-25 9:25:00)
我也想知道。
bnulaw (2001-06-25 9:31:00)
在word中录一段宏分析一下就可以了。如简单加入一表格的VB代码如下:ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixedselection.insertrowsbelow 1改为delphi:var word:variant;
begin
word:=createoleobject('word.application');
word.visible:=true;
word.documents.open('e:/abc.doc',false);
word.activedocument.range(0,0);
word.activedocument.tables.add(word.activedocument.range,2,3);
word.activedocument.sellection.insertrowsbelow(1);
end;
但是在comobj单元里好象没有wdWord9TableBehavior这些常量的定义,在vba的帮助中也找不到,不知道该怎么转换成相应的值?恳请高手指点
天与地 (2001-07-03 11:11:00)
bnulaw: 你好,我现在可以实现在word文字的替换,文字的读取,在控制word的中的表时碰到了问题,只能在某一行的前面添加行,而不能从指定的某行的后面新添行,你的语句: word.activedocument.sellection.insertrowsbelow(1);
在delphi中好像不能实现,望进一步指教,最好有原玛,是经编译过的。先感谢了,另外,以后会有控制图的操作。
天与地 (2001-07-03 11:19:00)
大家帮帮忙。
小虫~ (2001-07-31 2:18:00)
!
天与地 (2001-09-06 13:29:00)
这个问题我已经基本搞定了,可以在word中插入文字、表格、图像。数据可以跟数据库挂接。
Dawn7 (2001-09-06 19:03:00)
天地兄:把你的这段已通过了的代码发给我一份吧!我再做年终工作总结的表格打印时也遇到了这个问题,请让我学习一下!Thanks!我的E_Mail: Dawn7@21cn.com
小虫~ (2001-09-06 20:31:00)
正在做这方面的软件,主要通过一些字符替换达到目的, MainForm.WordDocument.Range.Find.Execute( FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace );数据库可以通过变量将数据读出来,处理后插入 vTypeName:=dm.tbItemSelectSum.FieldByName('TypeName').AsString;
//名称 MainForm.WordDocument.Range.InsertAfter(CNum[tmpst]+'、'+vTypename);字体设置procedure setfont(vName:string;vSize,vBold,vItalic:integer);
{字体设置}begin
with MainForm.WordFontdo
begin
ConnectTo(MainForm.WordDocument.Sentences.Get_Last.Font);
Underline := 0;
//下画线 (1,2) Bold := vBold;
//粗体 Italic := vItalic;
//斜体 Emboss := 0;
//阳文 Engrave := 0;
//阴文 shadow := 0;
//阴影 do
ubleStrikeThrough := 0;
//双删除线 StrikeThrough := 0;
//删除线 Size := vSize;
//字号 Name := vName;
//字体 end;
end;
核心差不多就这些了!但是我也有个问题没有解决,就是有关表格中列以及行的删除和插入,不知哪位知道?天与地,我们交流一下啊:)xiao@chong.com.cn
天与地 (2001-11-19 8:29:00)
多人接受答案了。
zhang_yz6666 (2002-09-25 10:34:00)
天与地,能否把你在word中插入文字、表格、图像,图表的功能交流一下。我的邮箱是:zhang_yz@163.com
大鼻子 (2002-12-25 17:17:00)
天与地, 把你在word中插入文字、表格、图像,图表的功能也给我发一份吧, 我的邮箱:[brown]sunyp@slof.com[/brown]谢谢!
执行 procedure
话题1227261的标题是: 出现[Error] Main.pas(100): Not enough actual parameters,这是为什么!??!?(抱歉,没钱了) (0分)
分类:OLE/Automation
Delphi之旅 (2002-07-28 8:56:00)
unit Main;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls, Db, DBTables, OleServer, Word97, clipbrd, Word2000;type TMainForm = class(TForm) DataSource: TDataSource;
DBGrid: TDBGrid;
DBNavigator: TDBNavigator;
WordDocument: TWordDocument;
DBImgFishImg: TDBImage;
Table: TTable;
BtnInsertRecord: TButton;
WordApplication: TWordApplication;
WordFont: TWordFont;
ChkBoxNewDoc: TCheckBox;
GroupBox: TGroupBox;
lblFont: TLabel;
Fonttype: TListBox;
ChkBoxEmboss: TCheckBox;
ChkBoxItalic: TCheckBox;
ChkBoxBold: TCheckBox;
ChkBoxUnderline: TCheckBox;
ChkBoxEngrave: TCheckBox;
ChkBoxShadow: TCheckBox;
ChkBoxDoublestrike: TCheckBox;
ChkBoxStrike: TCheckBox;
Size: TEdit;
lblFontSize: TLabel;
btnCloseWord: TButton;
BtnPrint: TButton;
BtnPreview: TButton;
GroupBox2: TGroupBox;
lbDocs: TListBox;
procedure BtnInsertRecordClick(Sender: TObject);
procedure Form1Close(Sender: TObject;
var Action: TCloseAction);
procedure Form1Create(Sender: TObject);
procedure Form1Activate(Sender: TObject);
procedure btnCloseWordClick(Sender: TObject);
procedure BtnPrintClick(Sender: TObject);
procedure BtnPreviewClick(Sender: TObject);
procedure WordApplicationDocumentChange(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var MainForm: TMainForm;implementationuses Variants;{$R *.dfm}procedure TMainForm.BtnInsertRecordClick(Sender: TObject);var Template,NewTemplate,ItemIndex:OleVariant;
procedure setfont;
begin
WordFont.ConnectTo(WordDocument.Sentences.Get_Last.Font);
if ChkBoxUnderline.checked then
WordFont.Underline := 2;
if ChkBoxBold.checked then
WordFont.Bold := 1;
if ChkBoxItalic.Checked then
WordFont.Italic := 1;
if ChkBoxEmboss.Checked then
WordFont.Emboss := 1;
if ChkBoxEngrave.checked then
WordFont.Engrave := 1;
if ChkBoxShadow.checked then
WordFont.shadow := 1;
if ChkBoxDoublestrike.checked then
WordFont.DoubleStrikeThrough := 1;
if ChkBoxStrike.checked then
WordFont.StrikeThrough := 1;
WordFont.Size := StrToInt(Size.text);
if Fonttype.Itemindex >= 0 then
WordFont.Name := FontType.Items[FontType.Itemindex];
end;
begin
try Template:= EmptyParam;
NewTemplate:= True;
ItemIndex := 1;
try Wordapplication.Connect;
except MessageDlg('Word may not be installed', mtError, [mbOk], 0);
Abort;
end;
Wordapplication.Visible := True;
WordApplication.Caption := 'Delphi automation';
{ Create newdocument } Template := EmptyParam;
NewTemplate := False;
if ChkBoxNewDoc.Checked then
begin
WordApplication.Documents.Add(Template,NewTemplate);
////此行出错!!!!!!!!!!!!!!!!!!! {Assign WordDocument component} WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));
end;
{Turn Spell checking of because it takes a long time if enabled and slowsdo
wn Winword} WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;
{Insert data} DBImgFishImg.CopyToClipboard;
WordDocument.Sentences.Last.Paste;
WordDocument.Range.InsertAfter('Common Name: ' + Table.Fields.Fields[2].AsString + #13);
SetFont;
WordDocument.Range.InsertAfter('Species Name:' + Table.Fields.Fields[3].AsString + #13);
WordDocument.Range.InsertAfter('Length: ' + Table.Fields.Fields[4].AsString + #13);
WordDocument.Range.InsertAfter(' ' + #13);
WordDocument.Range.InsertAfter(' ' + #13);
WordDocument.Range.InsertAfter(' ' + #13);
BtnCloseWord.Enabled := True;
BtnPrint.Enabled := True;
BtnPreview.Enabled := True;
except on E: Exceptiondo
begin
ShowMessage(E.Message);
WordApplication.Disconnect;
end;
end;
end;
procedure TMainForm.Form1Close(Sender: TObject;
var Action: TCloseAction);
begin
Table.Close;
end;
procedure TMainForm.Form1Create(Sender: TObject);
begin
Fonttype.Items := Screen.Fonts;
end;
procedure TMainForm.Form1Activate(Sender: TObject);
begin
Table.Open;
end;
procedure TMainForm.btnCloseWordClick(Sender: TObject);var SaveChanges, OriginalFormat, RouteDocument: OleVariant;
begin
SaveChanges := WdDoNotSaveChanges;
OriginalFormat := UnAssigned;
RouteDocument := UnAssigned;
try WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument);
WordApplication.Disconnect;
BtnCloseWord.Enabled := False;
BtnPrint.Enabled := False;
BtnPreview.Enabled := False;
except on E: Exceptiondo
begin
Showmessage(E.Message);
WordApplication.Disconnect;
end;
end;
end;
procedure TMainForm.BtnPrintClick(Sender: TObject);
begin
WordDocument.PrintOut;
end;
procedure TMainForm.BtnPreviewClick(Sender: TObject);
begin
WordDocument.PrintPreview;
end;
procedure TMainForm.WordApplicationDocumentChange(Sender: TObject);
begin
lbDocs.items.add(WordDocument.Name);
end;
end.

Delphi函数:
function FileSetAttr(const FileName: string;
Attr: Integer): Integer;
定义在SysUtils单元
WebBrowers的缩放显示
WebBrowser中页面的放大或缩小
show a miniature view of a Webpage in TWebbrowser? procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;const pDisp: IDispatch;
var URL: OleVariant);
begin
WebBrowser1.OleObject.Document.Body.Style.Zoom := 0.50;
end;
 

文件的操作
自定义文件数据结构的一个支持单元
如果用DELPHI中的数据库控件的话,在以后的软件发布中将带有大量的库文件,才能使用,这将增大发布软件的容量大小,我想自己用如:filecreate,read,write,..等函数来自编一个DAT文件,对其进行操作,在对dat文件的操作过程中,读和写都很容易,我想在此问各位高手,-----如何对dat文件进行数据修改和删除里面的记录数据呢?? 你可以到http://www.21jx.com/~tinydb/gb/下在一个TinyDB.以下是其网页上的介绍:TinyDB 是什么?TinyDB是提供给Delphi和BCB程序员的一组Delphi组件,目前包含 TTinyTable 和 TTinyDB。·完全兼容Delphi和BCB中所有的Data Controls·无须BDE的支持,无须附带任何DLL或OCX,开发绿色软件的最佳选择·支持对BLOB型字段数据的压缩,并提供多种不同压缩方案·优良的加密性能,预置三种先进的加密算法对数据库进行加密·提供数据处理扩展接口,可挂接任意压缩和加密或者自定义算法·加密和压缩均对用户透明,存取数据库时自动进行·单一文件型数据库,无论数据库多复杂,只有一个文件·完全支持基本的数据库结构定义·接口和Delphi(BCB)中的数据库相关组件保持一致,易于使用·提供配套工具 TinyDB Desktop 以及详细开发帮助文档和例程 TinyDB 能做什么?  当我们用Delphi或BCB做一个软件的时候,如果要将大量数据保存到硬盘上,通常采用的方法无外乎两种:第一种是使用Borland Database Engine(BDE);第二种是自己制定一个文件格式,用读写文件的方法把数据保存到文件中。  对于第一种方法,没什么可说的,这大概是最常用也是最权威的方法。但它有个缺陷:必须附带并安装BDE的支持包。这对于开发一个力求精致小巧、绿色实用的软件来说,似乎并不是最好的方案。  而第二种方法,虽然无须BDE的支持,但文件格式的拟定、维护往往让人累不堪言。当软件的功能增加,文件格式需要做相应调整的时候,为了保持兼容性而付出的代价往往是相当巨大的。而且稍有不慎,便会给用户数据带来损失。  TinyDB所要做的事情,便是在不需要BDE支持的前提下,给软件提供一个稳定的数据库系统,把逻辑格式和物理格式分开,并提供高效的压缩和加密功能,让软件开发者能方便而且快速地建立绿色、实用、稳定、安全的数据库程序。 关于TinyDB软件名称:TinyDB目前版本:2.0软件性质:免费软件开发平台:Windows9x/NT/2000语言支持:Delphi, C++Builder 5.0 或更高版本********************MSHawk(憨憨) (2001-4-26 16:27:00) 得0分老兄,我这儿有个东西可能能满足你的要求。unit SingleLinkList;//单链表单元文件interfacetypeint = integer;TSDLinkListRec = class//单链表数据类。publicNext: TSDLinkListRec;constructor Create;
end;
TSDLinkListMGR = class//单链表管理类。privateFCount: integer;publicHead: TSDLinkListRec;constructor Create;destructor Destroy;override;function IndexOf(Index: integer): TSDLinkListRec;function GetIndex(SL: TSDLinkListRec): int;procedure Clear;virtual;procedure Append(SL: TSDLinkListRec);virtual;procedure Insert(Index, SL: TSDLinkListRec);virtual;procedure Delete(SL: TSDLinkListRec);virtual;procedure MovePrev(SL: TSDLinkListRec);procedure MoveNext(SL: TSDLinkListRec);property Count: int read FCount;
end;
implementationconstructor TSDLinkListRec.Create;
begin
inherited;Next := nil;
end;
constructor TSDLinkListMGR.Create;
begin
inherited;Clear;
end;
destructor TSDLinkListMGR.Destroy;
begin
Clear;inherited;
end;
function TSDLinkListMGR.IndexOf(Index: integer): TSDLinkListRec;varT: TSDLinkListRec;i: integer;
begin
i := 1;Result := nil;T := Head;while T <> nildo
begin
if i = Index then
begin
Result := T;Break;
end;
T := T.Next;Inc(i);
end;
end;
function TSDLinkListMGR.GetIndex(SL: TSDLinkListRec): int;varP: TSDLinkListRec;
begin
Result := 0;P := Head;while P <> nildo
begin
Inc(Result);
if P = SL then
Exit;P := P.Next;
end;
Result := 0;
end;
procedure TSDLinkListMGR.Clear;varT: TSDLinkListRec;
begin
T := Head;while T <> nildo
begin
Head := T.Next;T.Destroy;T := Head;
end;
Head := nil;FCount := 0;
end;
procedure TSDLinkListMGR.Append(SL: TSDLinkListRec);varT: TSDLinkListRec;C: integer;
begin
T := SL;C := 0;while T <> nildo
begin
inc(C);T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SLelse
begin
T := Head;while T.Next <> nildo
T := T.Next;T.Next := SL;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Insert(Index, SL: TSDLinkListRec);varT, T1, T2: TSDLinkListRec;C: integer;
begin
C := 0;T := SL;while T <> nildo
begin
inc(C);T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SLelse
begin
T := Head;while T <> nildo
begin
if T = Index then
begin
T1 := T;T.Next := SL;T2 := SL;while T2.Next <> nildo
T2 := T2.Next;T2.Next := T1;Break;
end;
T := T.Next;
end;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Delete(SL: TSDLinkListRec);varT: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = SL then
begin
Head := SL.Next;SL.Destroy;
endelse
begin
T := Head;while T <> nildo
begin
if T.Next = SL then
begin
T.Next := SL.Next;SL.Destroy;Break;
end;
T := T.Next;
end;
end;
dec(FCount);
end;
procedure TSDLinkListMGR.MovePrev(SL: TSDLinkListRec);varP, C: TSDLinkListRec;
begin
if (SL = nil) or (SL = Head) then
Exit;
if Head.Next = SL then
begin
C := SL.Next;SL.Next := Head;Head.Next := C;Head := SL;
end;
P := Head;C := P.Next;while (C.Next <> SL) and (C.Next <> nil)do
begin
P := C;C := C.Next;
end;
if C.Next = nil then
Exit;P.Next := SL;C.Next := SL.Next;SL.Next := C;
end;
procedure TSDLinkListMGR.MoveNext(SL: TSDLinkListRec);varP, C: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = nil then
Exit;P := Head;C := P.Next;while C <> SLdo
begin
P := C;C := C.Next;
end;
if C.Next = nil then
Exit;C := SL.Next;P.Next := C;SL.Next := C.Next;C.Next := SL;
end;
end.
以上是一个单链表的完整实现。包括两个类:之一是单链表中的存储数据的类。之二是对此单链表进行管理的类。在管理类中实现了一下操作:1、APPEND操作:向链表中添加节点。2、INSERT操作:向链表中插入节点。(插入的节点在INDEX节点后面。)(注意:以上操作支持多节点。)3、DELETE操作:删除链表中的一个节点。4、MOVEPREV操作:将一个节点移动到其前一个节点前。5、MOVENEXT操作:将一个节点移动到其后一个节点后。6、INDEX操作:通过索引方式查找节点。对此两个类的使用方法如下:TUserRec = class(TSDLinkListRec)privateFStatus: TUserStatus;//当前用户状态。FUserID: Word;//用户ID。FSpeakHandle: THandle;procedure SetUserStatus(Value: TUserStatus);procedure GeneralUserID;//产生用户ID。procedure GeneralComEnCode;//产生用户加密密码。publicUserName: TShortString;//用户名称。FullName: TShortString;//用户全名。PassWord: TShortString;//用户密码。UserLevel: Word;//用户等级。数值越低,则权限越低。数值越高,则权限越高。LoginSource: TLoginSource;//登录源。LoginComputerUNC: string;//登录源计算机的UNC名。(统一命名规则。)LoginTime, LogOffTime, ElapsedTime: string[16];//登录时间、取消登录时间以及登录持续时间。ListenComCount, SpeakComCount: Word;//对话计数器。ComEnCode: array [0..LenCode - 1] of Byte;//用户加密密码。TimeOut, TimeNoLink: int;//客户未连接时间。当此时间减小到零时,将断开客户连接。以秒为单位。property Status: TUserStatus read FStatus write SetUserStatus;property UserID: Word read FUserID;property SpeakHandle: THandle read FSpeakHandle write FSpeakHandle;constructor Create;destructor Destroy;override;procedure ReadFromFile(var F: Text);procedure WriteToFile(var F: Text);
end;
TUserMGR = class(TSDLinkListMGR)DefaultUser: TUserRec;Modifyed: Bool;function FindUserByName(UserName, PassWord: TShortString): TUserRec;function FindUserByDoMain(DoMain: string): TUserRec;function FindUserByLoginSource(S: string): TUserRec;function FindUserByID(ID: DWord): TUserRec;procedure ReadFromFile(FileName: string);procedure WriteToFile(FileName: string);constructor Create;destructor Destroy;override;
end;
以上的TUserRec类是关于用户的数据类,而TUserMGR类是对此用户链表的管理类。在加入用户时,可以这样做:varUser: TUserRec;
begin
User := TUserRec.Create;User.UserName := '*****';User.FullName := '*****';......Users.Append(User);
end;
 在删除用户时,可以这样做:varUser: TUserRec;
begin
User := TUserRec(Users.IndexOf(*));Users.Delete(User);
end;
在遍历用户时,可以这样做:varUser: TUserRec;
begin
User := TUserRec(Users.Head);while User <> nildo
begin
......User := TUserRec(User.Next);
end;
end;
 

文件的操作
话题1464947的标题是: 关于文本文件的几个问题 (0分)
分类:系统相关
商朝子 (2002-11-29 12:20:00)
我想在软件中把一些特定的记录存储在一个文件中,但我不希望该文件能被人用记事本打开,同时软件可以识别并使用该文件,请某位好心的大虾告诉俺方法.另外小弟还想问一下如何在软件中读取文本文件中的记录,比如我在文本文件中录入了以下内容:NAME=商朝子怎样在软件中读取NAME的内容呢?(在不使用.ini文件的情况下).还有就是怎样才能在文本文件中加入一行记录或删除(修改)特定的记录呢?
shadowno (2002-11-27 16:01:00)
自己建立文件格式咯!你好有钱!这样不好,会通货膨胀的!
商朝子 (2002-11-27 16:09:00)
TO shadowno:小弟太菜,大虾可否详细道来?呜呜呜...我以为和论坛一样,没想到还有什么积分,呜呜呜...一会儿就浪费了300点...[:(][:(][:(]
Adnil (2002-11-27 16:15:00)
可以用有类型文件,如type PhoneEntry = record FirstName, LastName: string[20];
PhoneNumber: string[15];
Listed: Boolean;
end;
PhoneList = file of PhoneEntry;
商朝子 (2002-11-27 16:21:00)
这样的话不还是会被人用记事本打开吗?苦恼中...[:(][:(][:(]
lcl_003 (2002-11-27 16:24:00)
但是看到的是乱码啊
kongklj (2002-11-27 16:41:00)
就是用类型文件了!
娃娃 (2002-11-27 16:48:00)
什么东西不能被记事本打开的,只要是保存在硬盘上的文件基本上都可以被记事本打开的(除非有特殊字符的会有一部分看不到),关键是看到的内容是否有意义。就象是你用记事本打开Notepad.exe文件的时候,你打开了,却看不懂
wql (2002-11-27 16:52:00)
不想让别人用即使本打开,只有自己定义文件格式,例如: Type OneLine = String[191];
{ 定义一行最大有191个字节 }procedure writeOneLine(_item:string);
Var _Line:OneLine;
TmFl : File;
begin
AssiGnFile(TmFl,'c:/oneline.bin');
If (fileexists('c:/oneline.bin')) then
begin
reset(tmfl,1);
seek(tmfl,filesize(tmfl));
end else
rewrite(tmfl,1);
_Line:=_item;
blockwrite(tmfl,_line,sizeof(OneLine));
closefile(tmfl);
end;
procedure tform1.button1click(sender:tobject);// 把Edit1中的内容写入自定义文件中.begin
writeOneLine(edit1.text);
// 把Edit1中的内容写入自定义文件中.end;
procedure TForm1.Button2Click(Sender: TObject);// 把自定义文件读入memo1中. Var _Line:OneLine;
TmFl : File;
begin
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
memo1.lines.clear;
while not eof(tmfl)do
begin
blockread(tmfl,_line,sizeof(OneLine));
memo1.lines.add(_line);
end;
closefile(tmfl);
end;
//这样别人用即使本打开的是乱码了!例如读取 name=的内容.function readitem(item:string):string;// 把自定义文件读入memo1中. Var _Line:OneLine;
TmFl : File;
_pos:word;
begin
result:='空';
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
while not eof(tmfl)do
begin
blockread(tmfl,_line,sizeof(OneLine));
_pos:=pos(uppercase(item)+'=',uppercase(_line));
if _pos<>0 then
begin
delete(_line,1,_pos+length(item+'=')-1);
result:=trim(_line);
closefile(tmfl);
exit;
end;
end;
closefile(tmfl);
end;
showmessage(readitem('NAME'));//显示name=的内容.例如添加用writeOneLine('name=商朝子');即可.删除有点麻烦,但好人做到底,给你编:function deleteitem(item:string):boolean;// 把自定义文件读入memo1中. Var _Line:OneLine;
TmFl : File;
tfl : File;
_pos:word;
begin
result:=false;
AssiGnFile(TmFl,'c:/oneline.bin');
If (not fileexists('c:/oneline.bin')) then
begin
showmessage('file not exists!');
exit;
end else
reset(tmfl,1);
assignfile(tfl,'c:/oneline.1);
rewrite(tfl,1);
while not eof(tmfl)do
begin
blockread(tmfl,_line,sizeof(OneLine));
_pos:=pos(uppercase(item)+'=',uppercase(_line));
if _pos=0 then
blockwrite(tfl,_line,sizeof(OneLine));
end;
closefile(tmfl);
closefile(tfl);
erase(tmfl);
renamefile('c:/oneline.1','c:/oneline.bin');
result:=trueend;
例如删除用deleteitem('name');即可.
dhycq (2002-11-27 16:55:00)
可以考虑对文件进行加密,在你使用的时候先解密,再打开
jsxjd (2002-11-27 17:10:00)
procedure TForm1.Button1Click(Sender: TObject);var s:TStrings;
begin
s:=TStringList.Create;
s.LoadFromFile('d:/temp.txt');
s.Add('aaaaaaaa');//添加一行 s.Delete(0);//删除第一行 s.savetofile('d:/temp1.txt');
s.free;
end;
商朝子 (2002-11-29 12:20:00)
非常感谢各位.(文件格式的问题俺也不是不知道,但...)
文件类型:
采用以下代码设计文件关联,测试通过,1.但是注册完成后,不知道怎么样恢复,恢复文件原来默认的打开方式?2.而且这个打开文件时,只能打开短文件名,不能打开有空格的长文件名(如:ABC for v0.1.mmd)----------------------------------------------- sKeyName := 'ReadMeFile';
sKeyValue := '音乐文件';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, '', REG_SZ, pchar(sKeyValue), 0);
sKeyName := '.mmd';//后缀名 sKeyValue := 'ReadMeFile';
RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, '', REG_SZ, pchar(sKeyValue), 0);
sKeyName := 'ReadMeFile';
sKeyValue :='c:/index.exe %1';
{ 注意路径 } RegCreateKey(HKEY_CLASSES_ROOT, pchar(sKeyName), lphKey);
RegSetValue(lphKey, 'shell/open/command', REG_SZ, pchar(sKeyValue), MAX_PATH);-----------------------------------------------------------------
guilinlzy (2002-01-23 14:29:00)
只能供你参考。文件类型的关联在Windows 95以后都是通过注册表来实现的,所以只能从写注册表入手。注册表设置完毕后并不能立刻生效,需要调用API函数SHChangeNotify通知系统本应用程序已经执行,需要系统更新Shell。procedure RegisterFileType(cMyExt,cMyFileType,cMyDescription,ExeName:string;
IcoIndex:integer;
do
Update:boolean=false);var Reg: TRegistry;
begin
Reg:=TRegistry.Create;
try Reg.RootKey:=HKEY_CLASSES_ROOT;
Reg.OpenKey(cMyExt, True);
//写入自定义文件后缀 Reg.WriteString('', cMyFileType);
Reg.CloseKey;
//写入自定义的文件类型 //格式为:HKEY_CLASSES_ROOT/cMyExt/(Default) = 'cMyFileType' //下面为该文件类型创建关联 Reg.OpenKey(cMyFileType, True);
Reg.WriteString('', cMyDescription);
//写入文件类型的描述信息 Reg.CloseKey;
// 下面为自定义文件类型选择图标 // 加入键格式为 HKEY_CLASSES_ROOT/cMyFileType/DefaultIcon // /(Default) = 'Application Dir/Project1.exe,0' Reg.OpenKey(cMyFileType + '/DefaultIcon', True);
Reg.WriteString('', ExeName + ',' + IntToStr(IcoIndex));
Reg.CloseKey;
// 下面注册在资源管理器中打开文件的程序 Reg.OpenKey(cMyFileType + '/Shell/Open', True);
Reg.WriteString('', '&amp;Open');
Reg.CloseKey;
// 格式:HKEY_CLASSES_ROOT/Project1.FileType/Shell/Open/Command // (Default) = '&quot;Application Dir/Project1.exe&quot;
&quot;%1&quot;' Reg.OpenKey(cMyFileType + '/Shell/Open/Command', True);
Reg.WriteString('', '&quot;' + ExeName + '&quot;
&quot;%1&quot;');
Reg.CloseKey;
//最后,让资源管理器实现我们加入的文件类型,只需调用SHChangeNotify即可 ifdo
Update then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
finally Reg.Free;
end;
end;
Slong (2002-01-23 14:32:00)
你会改,不会恢复,不是开玩笑吧,用同样的方法把它改回来就行了。而打不开有空格的长文件名的问题,改善的方法是这样:把sKeyValue :='c:/index.exe %1';
{ 注意路径 }改成:sKeyValue :='c:/index.exe &quot;%1&quot;';
{ 注意路径 }就没问题了。
laohe (2002-01-23 19:22:00)
:Slong你的建议太好了,可以方便地打开空格的长文件名的文件,谢谢,至于注册表已经可以了,当时是抓不到路径。同时感谢guilinlzy的支持,
修改记录文件类型
话题1094413的标题是: 用Delphi怎样修改记录类型的文件? (0分)
分类:数据库-文件型
feifan (2002-05-12 13:36:00)
老兄:小弟在用delphi写问件时出现了一个问题,想请你帮忙!事情是这样的:有个一自定义记录类型为:typeTDatarecord=recordnumber:integer;s:string[25];p:char;
end;
有一个自定义文件是:datefile:file of TDatarecord;
//TDatarecord 也就是上面的自定义记录类型!在这个文件中,有多个记录,我怎样才能找到基中一个number为0的记录,并打其中的s的值改为&quot;www&quot;并保存修改!能用代码表示一下吗?当然伪代码也可以!
gxx (2002-05-12 13:35:00)
自已写一个查找算法,定位到该忘记录,然后修改,好象没别的省事的办法
张无忌 (2002-05-12 13:36:00)
这个不难啊先用 count:=文件的总长度 div sizeof(TDatarecord)再循环 for i:= 1 to countdo
读到类型变量中来,具体方法很简单 在判断对应的字段的值
页眉和页脚的设置(调试通过了)
FirstPage:=True;
PageNumberAlignment :='';//设置页码的显示格式 wdAlignPageNumberRight
WDA.ActiveDocument.Sections.First.Headers.Item(wdHeaderFooterPrimary).Range.Text:='恒志天成';//页眉的内容
WDA.ActiveDocument.Sections.First.Headers.Item(wdHeaderFooterPrimary).Range.Paragraphs.Alignment:=wdAlignParagraphRight;
//页眉的对齐方式
WDA.ActiveDocument.Sections.First.Footers.Item(wdHeaderFooterPrimary).Range.Text:='微软公司';//页脚的内容
WDA.ActiveDocument.Sections.First.Footers.Item(wdHeaderFooterPrimary).Range.Paragraphs.Alignment:=wdAlignParagraphRight;
//页脚的对齐方式
WDA.ActiveDocument.Sections.First.Headers.Item(wdHeaderFooterPrimary).PageNumbers.Add(PageNumberAlignment,FirstPage);
//页眉中插入页码
WDA.ActiveDocument.Sections.First.Footers.Item(wdHeaderFooterPrimary).PageNumbers.Add(PageNumberAlignment,FirstPage);
//页脚插入页码
 
多谢各位,等调试通过就给分。
 
看看这个吧
一、前 言

  玩过 PowerBuilder的朋友一定知道, PB中最重要的技术就是它的 DataWindow技术,用它来设计表单、处理数据录入、设计报表十分方便。然而 Delphi的报表支持功能远不及 PB。 Delphi的专业版中包括了 QuickReport,不过它是集合由 QSD AS(一家挪威公司)授权的报表组件。当然,我们也可以使用外部报表工具,如 ReportSmith或 Cristal Report。不过控制稍嫌复杂,并且它们与 Delphi之间缺少集成性。
  我们在开发 《公文管理系统》网络版时,在实现公文打印时,尝试过不同的方法来实现。我们的要求是将一篇普通公文按公文格式打印出来,而用户能对其进行排版进行一些简单的控制。小辉刚开始是用的 QuickReport来试的,效果很不尽人意,特别是对一些中文格式的支持方面;后来小辉一不作二不休,干脆自己手工编写打印程序,不依赖设计工具,只可惜小辉技术不到家,写到一半时玩不下去了,只好另找出路。正好那天来了份 《中国计算机报》,上面有一篇介绍如何在 VB中使用 Excel的文章。小辉一想:何不用 Delphi将数据发送到 Word,由 Word来完成编辑排版工作呢?说穿了,就是用 OLE自动化技术。
  小辉一试,效果竟还可以。——虽然对于一个程序员来说,自己编的程序中要挂接一个别人的应用程序才能完全实现自己的功能,就象鸡群里插只鸭,心里总有点那个。但由于开发任务紧,主任又隔三隔四的来催,虽然最终有点不伦不类,小辉也顾不得那么多了。好了,废话少说,看看是怎样实现的吧——
二、窗体设计

  说穿了其实很简单。小辉在这里做了一个简单的示例程序:
   1. 设置窗体 Form1的 Font.name为‘宋体’, Font.size为 12;
   2. 窗体上依次放置 lable1-labe5五个 tLable控件,其 caption属性分别为‘文号’、‘标题’、‘收文单位’、‘正文’、‘发文单位’
   3. 在窗体上依次放置 tEdit、 tEdit、 tEdit、 tMemo、 tEdit五个编辑控件,其 name属性分别为 :ED_WenHao、 ED_BiaoTi、 ED_ShouWenDanWei、 ED_ZhenWen、 ED_FaWenDanWei。
   4. 在窗体上依次放置两个 tButton控件,其 name属性分别为 Btn_PrintToWord、 btn_Quit, Caption属性分别为‘打印’和‘退出’。
  窗体设计格式可参考本文末所附图片。

三、代码设计

  
  程序段如下所示:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,OleCtnrs,ComObj;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ED_WenHao: TEdit;
ED_BiaoTi: TEdit;
ED_ShouWenDanWei: TEdit;
ED_ZhenWen: TMemo;
ED_FaWenDanWei: TEdit;
Btn_PrintToWord: TButton;
Btn_Quit: TButton;
procedure Btn_PrintToWordClick(Sender: TObject);
procedure Btn_QuitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
//开始:数据发送到 word事件
procedure TForm1.Btn_PrintToWordClick(Sender: TObject);
vAR
VarWord: Variant;// 创建 WORD时所用
begin
try
// 1. 建立 OleObject,连接 word97
VarWord:=CreateOleObject('word.basic');
// 2. 建立 Word97的新文件
VarWord.FileNew;
// 3. 设置 Word97的基本状态
VarWord.ViewZoom75;
//设置显示比例为 75%
VarWord.ViewPage;
//改为页面显示方式
// 4. 将当前数据控件上的信息发送至 Word97
// 4.1 发送文号数据
VarWord.CenterPara;
//居中
Varword.font('宋体 ');
//设置字体
VarWord.FontSize(14);
//设置字号
varword.insert(#13+#13+ ED_WenHao.Text+#13+#13+#13);
// 4.2 发送标题数据
VarWord.font('黑体 ');
VarWord.Fontsize(16);
VarWord.insert( ED_BiaoTi.text+#13);
// 4.3 发送收文单位数据
VarWord.LeftPara;
//左对齐
VarWord.Font('宋体 ');
VarWord.fontSize(14);
VarWord.Insert(#13+ ED_ShouWenDanWei.Text+': '+#13);
// 4.5 发送正文数据
VarWord.fontSize(14);
VarWord.Insert( ED_ZhenWen.Text+#13);
// 4.6 发送发文单位数据
VarWord.RightPara;
//右对齐
VarWord.fontSize(14);
VarWord.Insert( ED_FaWenDanWei.Text+#13);
// 5 最后设置
VarWord.StartOfdocument;
//到文首
VarWord.AppMaxiMize;
//设置窗口最大化
VarWord.AppShow;
//显示应用程序
except
showmessage('运行 Microsoft Word 失败! ');
end;
//end of try
end;
//end:数据发送到 word事件

//开始:窗口关闭事件
procedure TForm1.Btn_QuitClick(Sender: TObject);
begin
close;
end;
//End:窗口关闭事件
end.
// 这是主程序的尾部

四、附 注

一、说明
  1、因只是一个演示示例,故没有与后台数据库连接起来,实际操作可将相应的 tEdit、 tMemo控件用 tDBEdit、 tDBMemo控件所代替,增加 tTable、 tDataSource等控件,连接数据库。
  2、本示便没有考虑如何进行批量打印
  3、程序在 Pwin97、 Delphi 4.0专业版、中文 Word97下通过。
  4、由于 Word有不同的版本,微软在每种外语中转换了一些 OLE自动化接口,如果用其他版本的 Word,本程序运行有可能出错。
  5、可以通过 word97帮助中归结的宏命令来得到相应的驱动命令;亦或可在 Word97下单击[工具]菜单--单击[自定义]--单击[键盘]按钮,可以查看到 Word97中分类别显示的 Word命令。
二、优点与缺点
  1、通过 OLE自动化技术,将公文的排版打印工作交给 Word去完成,对最终用户而言,控制较方便。
  2、在 Word97的若对数据进行了修改,则不能传回调用它的主程序,反映到数据库中。这是它的不便这处。
  3、本例只是在特殊情况下的一种应用,若要打印大量数据标签,制作表格,本人觉得还是用报表灵活一些。

小辉
 
通过各位的帮助现在打开、关闭等操作是没什么问题了。
我现在想要这样的一个效果。
比如在delphi的界面中有几个edit分别是姓名、性别、年龄等等,在word中先做好模板,然后点击“打印预览”按钮,打开word并把上述的内容自动添加到word的相应表格中。
这应该如何实现呢?
我检索了一下,但是都讲得不是很详细,至少对于我这个菜鸟不太理解。
望那位高人能给一段详细一点的代码。
 
可以用替换的方法实现:(delphi6,word2003调试通过)
procedure TForm1.DoPrintExecute(Sender: TObject);
var
aSelection,
aDocument : Variant;
Replace,
FileName : OleVariant;
procedure FReplace(FindText : String;
ReplaceWith : String);
begin
aSelection.Find.ClearFormatting;
aSelection.Find.Replacement.ClearFormatting;
aSelection.Find.Text := FindText;
aSelection.Find.Replacement.Text := ReplaceWith;
aSelection.Find.Forward := True;
aSelection.Find.Wrap := wdFindContinue;
aSelection.Find.Format := False;
aSelection.Find.MatchCase := False;
aSelection.Find.MatchWholeWord := False;
aSelection.Find.MatchByte := True;
aSelection.Find.MatchWildcards := False;
aSelection.Find.MatchSoundsLike := False;
aSelection.Find.MatchAllWordForms := False;
replace := wdReplaceAll;
aSelection.Find.Execute(EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, replace, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
begin
if dlgopen.Execute then
with WordApplicationdo
begin
Connect;
Visible := False;
filename := dlgopen.FileName;
aDocument :=do
cuments.OpenOld(FileName, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
aSelection := Selection;
FReplace('<name>',trim(edit1.Text) );//姓名
FReplace('<department>',trim(edit2.Text) );//单位
FReplace('<date>', trim(edit3.Text) );//日期
FReplace('<sex>', trim(edit4.Text) );//性别
FReplace('<nation>', trim(edit5.Text) );//民族
FReplace('<nativeplace>', trim(edit6.Text) );//籍贯
FReplace('<degree>', trim(edit7.Text) );//文化程度
FReplace('<policy>', trim(edit8.Text) );//政治面貌
FReplace('<language>', trim(edit9.Text) );//掌握语言
FileName := 'G:/a.doc';//另存为文件名
aDocument.SaveAs(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Visible := True;
Disconnect;
end;
end;
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部