屏蔽工具栏
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('', '&Open');
Reg.CloseKey;
// 格式:HKEY_CLASSES_ROOT/Project1.FileType/Shell/Open/Command // (Default) = '"Application Dir/Project1.exe"
"%1"' Reg.OpenKey(cMyFileType + '/Shell/Open/Command', True);
Reg.WriteString('', '"' + ExeName + '"
"%1"');
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 "%1"';
{ 注意路径 }就没问题了。
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的值改为"www"并保存修改!能用代码表示一下吗?当然伪代码也可以!
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);
//页脚插入页码