gpt4 book ai didi

delphi - 如何加快 Delphi XE2 的文字自动化速度

转载 作者:行者123 更新时间:2023-12-03 15:33:21 24 4
gpt4 key购买 nike

我在 Delphi 应用程序中使用 Word 自动化,但速度非常慢。我已经将我的代码精简到最低限度,并希望有一些经验的人可以告诉我哪里出了问题(而且我实际上希望我已经出了问题,这样我可以加快速度)

我的应用程序中自动化的本质是处理书签。该应用程序打开一个带有一些特殊书签的文档,浏览这些书签并根据它们的名称更改它们。真实版本还大量处理文档变量和字段代码。一个典型的文档有 50-80 个书签,其中一些是嵌套的。我还使用一些临时文档来构建文本和图像 block ,这些文本和图像 block 连续放置在要生成的文档中。附加的代码是一个非常精简的版本,没有此功能,但它显示了不需要的行为(即生成文档的时间)。在所附示例中,生成文档大约需要 2.5 秒。对于典型的真实文档,大约需要 30-40 秒,有时甚至更长。

我希望有人说“你做的这一切都是错误的。当从 Delphi 进行 Word Automation 时,你必须始终记住 XXX!”。

由于整个项目(即使完全剥离)也相当大,因此我制作了这个小应用程序。如果我的做法有明显的错误,希望从这段代码中可以看出。

请创建一个新的 VCL 表单应用程序。打开 Word,然后创建一个新文档。在第一行输入一些文本,对其进行标记并插入书签。在第二行输入一些文本,并将其添加为书签。将文件另存为“c:\temp\bm.doc”作为 Word 97-2003 文档。运行应用程序后,您应该有一个新文档('c:\temp\bm_ generated.doc'),第一行有一个随机数字,并且没有书签。

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, OleServer, WordXP, Vcl.StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
vWordApp : TWordApplication;
vDoc : WordDocument;
vFileName : OleVariant;
vIndex : OleVariant;
vBookmark : Bookmark;
vSave : OleVariant;
begin
vWordApp := TWordApplication.Create(nil);
try
vWordApp.ConnectKind := ckNewInstance;
vWordApp.Connect;
vFileName := 'c:\temp\bm.doc';
vDoc := vWordApp.Documents.Open(vFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

//Replace bookmark text with random string:
vIndex := 1;
vBookmark := vDoc.Bookmarks.Item(vIndex);
vBookmark.Range.Text := inttostr(random(10000)); //Will also delete the bookmark!

//Delete bookmark content and bookmark
vIndex := 1; //This will be the bookmark that was originally the first, since that was deleted when we sat the text
vBookmark := vDoc.Bookmarks.Item(vIndex);
vWordApp.Selection.SetRange(vBookmark.Range.Start, vBookmark.Range.End_);
vWordApp.Selection.Text := '';

vFileName := 'c:\temp\bm_generated.doc';
vDoc.SaveAs2000(vFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

vWordApp.NormalTemplate.Saved := true; //For å slippe spørsmål om "normal.dot" skal lagres
vSave := wdDoNotSaveChanges;
vWordApp.Quit(vSave);
vWordApp.Disconnect;
finally
vWordApp.Free;
end;
end;

end.

最佳答案

你可以尝试:

vWordApp.ScreenUpdating := False;

也许还有

vWordApp.Visible := False;

(完成后请记住设置回以前的值)。

关于delphi - 如何加快 Delphi XE2 的文字自动化速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com