使用Delphi开发Office Word插件

办公自动化实战:Python与VBA驱动Word/WPS文档批量处理插件开发指南 办公自动化是提升现代办公效率的核心技术,其原理在于通过编程接口控制办公软件,自动执行重复性任务。在文档处理领域,这项技术价值显著,能大幅减少人工操作错误,解放人力投入更具创造性的工作。Python和VBA是实现自动化的关键技术,Python凭借其丰富的库生态和跨平台能力,结合python-docx或win32com等库,可灵活处理.docx文件或驱动本地Word进程;VBA则深度集成于Office,适合开发内嵌的复杂宏。典型的应用场景包括公文格式批量标准化、表格图片统一处理、敏感信息批量替换以及基于模板的文 阅读详情
使用Delphi开发Office Word插件
作者: 来源:plwww 发布时间:2006.08.15

在Office 2000中提供了基于COM的插件开发框架,这使得我们可以利用Delphi来扩展Office的功能。

  在Delphi 3,4中编写基于COM的插件,我们需要自己创建COM接口的封装类,更糟糕的是要想支持事件的话还需要使用连接点(connection points)对象来实现事件回调,这是非常麻烦的。但在Delphi 5中这一切就变得非常轻松了,Delphi 5的类型库引入工具提供了/L+的开关,可以自动为我们生成封装好的OLE Server。这下子再也没有什么好抱怨的了。

Office 2000 插件框架

  在Microsoft'的网站上,知识库文章(Knowledge Base article Q230689)中有一篇:Office 2000 COM Add-In Written in Visual C++ 。文章中提供了一个例子(http://support.microsoft.com/download/support/mslfiles/ COMADDIN.EXE)。这篇文章详细地描述了插件框架中的COM接口。仔细研究一下C++代码就可以了解如何编写Office 2000插件。

  Office 2000插件其实就是一个实现了IDTExtensibility2接口的自动化对象。IDTExtensibility2 接口相当简单,插件需要实现接口定义的全部5个函数:

  OnConnection:当应用程序连接到插件时会调用这个函数。插件在函数中接收下列初始化信息——应用程序对象模型进入点的指针,连接模式(是手工加入还是通过命令行载入), 应用程序的对象模型指针和用户自定义的信息。

  OnDisconnection:当应用程序断开插件时被调用,插件应该在这里清除先前分配的资源,删除它添加到应用程序的界面元素。

  OnStartupComplete:这个函数是当应用程序自动启动插件时被调用的。调用时,其他的插件都已经被加载到了内存,这时可以同其他插件进行通信。这个函数还适合添加用户界面元素。

  OnBeginShutdown:当应用程序准备关闭并将要断开插件时会被调用,这时插件应该停止接收用户输入。

  OnAddInsUpdate:当注册的插件列表被改变后会被调用。如果我们的插件不依赖于其他插件,这个函数可以为空。

接口、类型库和常数

  创建插件前,我们需要引入COM对象的接口类型库。这里使用Delphi 5带的TlibImp.exe (Delphi5/Bin目录下)来引入类型库。新版的TlibImp.exe支持新的/L+开关,可以自动创建一个OLE Server的Delphi封装。IDTExtensibility2接口是在MSADDNDR.DLL文件中声明的,位于/Program Files/Common Files/Designer/ 目录下。调用TLIBIMP/L+/Program Files/Common Files/ Designer/MSADDNDR.DLL会生成AddInDesignerObjects_TLB.pas 和 AddInDesignerObjects_TLB.dcr两个文件。在项目的uses部分加上对上面文件的引用以便使用接口。clause of our project to gain access to the interface.使用时注意:TLIBIMP重命名接口为_IDTExtensibility2。

  本文中将使用Word 2000作为例子,如果想编写Outlook、Excel或其他Office程序的插件需要引入相应特定的类型库。比如Word的类型库是定义在/Program Files/Microsoft Office/Office/MSWORD9.OLB文件中。类似的,Excel、Access和OutLook类型库分别定义在EXCEL9.OLB、MSACC9.OLB和MSOUTL9.OLB文件中。引入的接口生成在Office_TLB.pas和Word_TLB.pas单元中。

  注意:Office 2000的插件无法工作在Office 97的应用程序中。

最简单的插件

  现在让我们来实现一个最简单的插件,它只实现了IDTExtensibility2接口而没有实现任何比较有意义的功能,但对于演示如何实现插件是一个很好的开始。

  插件可以以进程内或进程外COM服务器的形式实现,在本文中,我们创建的是进程内COM服务器。在Delphi中,选择菜单File | New命令,然后创建一个ActiveX Library,保存生成的文件,再创建一个自动化对象(Automation Object),类名定义为AddIn,把实现单元保存为AddInMain.pas。在AddInMain.pas单元的uses部分添加对AddinDesignerObjects_TLB,Word_TLB和Office_TLB单元的引用。最后添加 IDTExtensibility2 接口到类定义部分定义类要实现的接口。类定义如下:

  type

   TAddIn = class(TAutoObject, IAddIn, IDTExtensibility2)

  ...

  在类声明的protected部分,添加IDTExtensibility2 接口声明的方法定义,代码示意如下:

  // IDTExtensibility2 methods

  procedure OnConnection(const Application: IDispatch;

   ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;

  var custom: PSafeArray); safecall;

  procedure OnDisconnection(RemoveMode: ext_DisconnectMode;

  var custom: PSafeArray); safecall;

  procedure OnAddInsUpdate(var custom: PSafeArray); safecall;

  procedure OnStartupComplete(var custom: PSafeArray); safecall;

  procedure OnBeginShutdown(var custom: PSafeArray); safecall;

  使用快捷键[Ctrl][Shift][C]来完成类定义,并添加方法的实现部分的框架到单元中。为了测试插件,可添加下面代码到OnConnection方法中:

  ShowMessage('连接到' + WordApp.Name);

  添加下面代码到OnDisconnection方法的实现部分:

  ShowMessage('断开插件');

  这样就完成了一个最简单的插件了,接下来就是编译并注册插件到Word中去。

注册Office插件

  同其他COM对象一样,一个Office插件必须在系统中注册后才能使用。在Delphi中选择Run | Register ActiveX Server菜单命令,就可以注册我们刚才创建的插件。除了标准的COM注册,还需要进行Office 相关的注册,这需要在注册表中创建一个新的键值:

  HKEY_CURRENT_USER/Software/Microsoft/Office/

   <AppName>/Addins/<AddInProgID>

  <AppName>就是插件宿主应用程序的名字(这里是Word),<AddInProgID>是自动化对象的名字(这里是DIWordAddIn.AddIn,ActiveX library和类名的组合)。

  HKEY_CURRENT_USER / Software / Microsoft / Office / Word / Addins/DIWord AddIn.AddIn

  我们还需要在这个键值下创建几个值:一个DWORD类型的名为LoadBehavior的值决定插件是如何加载及被应用程序调用的。在本文中我们设定它为3–相当于1和2的结合就是应用程序连接插件并在启动时自动加载。值的意义列在表1.2中,各种值可以相互组合。

表1.2

值
意  义

$0
  断开,不加载

$1
  连接,加载

$2
  自动启动加载

$8
  只有当用户请求时才加载

$16
  只在下次程序启动时加载一次


  还有一些其他的值可以出现在注册表键值下,比如定义出现在应用程序COM管理器对话框中的名字,以及设定是否可以从命令行激活插件。

Office 2000用户界面

  Office应用程序共享一组通用的用户界面元素对象、菜单条、工具条通用控件(比如工具条按钮和组合编辑框)以及Office小助手。

  此前引入的Word类型库就包括了这些通用对象的类型库,但是Delphi引入时并没有像通常那样建立一个封装好的OLE Server,我们不得不手工创建一个Office公开的CommandBarButton对象的Delphi封装。这个对象对应于Office应用程序的一个简单的菜单项或工具条按钮。

  对大多数的Microsoft的应用程序来说,Application对象代表对象模型的切入点。Office Application类提供了对CommandBars属性的引用。CommandBar对象包括工具条、浮动工具条和菜单。Office对象模型允许我们创建或更新已有的CommandBars对象。Office_TLB.pas单元包含了ICommandBar接口,它可以被用来修改CommandBar对象。

  CommandBar有一个Controls集合属性,对应于一组CommandBarControl控件。CommandBarControl控件对应于放置在工具条上的控件,比如一个CommandBarButton对应一个简单的工具条按钮(或菜单项),CommandBarCombo控件对应组合编辑框,CommandBarPopup对应于下拉菜单和CommandBarActiveX对应于ActiveX控制。

  在Office_TLB.pas单元中,除了ICommandBarButton接口,还有一个ICommandBarButtonEvents接口用来提供对工具条上控件的事件支持。事件的支持通常是通过连接点、事件接收连接到可连接对象来实现。但这比较麻烦,我们还可以通过更简单的办法来实现事件支持。检查一下Delphi在word_tlb.pas单元创建的TWordApplication的实现代码可以发现Delphi封装了每一个可连接对象,自动实现了事件接收机制。这个单元可以作为一个范本用来创建自定义的对接口对象的封装。

  BtnSvr.pas单元包含了一个手工创建的Delphi封装。除了按标准的Delphi属性方式实现了CommandBarButton对象的属性外,还实现了InitServerData、InvokeEvent、Connect、ConnectTo和Disconnect方法。可以注意到这部分完全是模仿TWordApplication实现部分编写的CommandBarButton事件实现。主要就是在InitServerData方法中定义服务器数据。根据Office_TLB.pas中不同的接口GUID,定义一个CommandBarButton接口的内部的接口Fintf,设定InvokeEvent方法来激活基于定义在事件接口部分的DispID的Delphi事件支持。最后,Connect、ConnectTo和Disconnect方法设定Fintf给需要的接口并接收相应的事件。

  定义在BtnSvr.pas单元中的Delphi封装类命名为TButtonServer。它需要从TOleServer对象继承以便支持事件处理。

同应用程序连接

  有了工具条按钮封装类后,接下来要声明一个TWordApplication域来保存对Word Application对象的引用。此外还需要为新的工具条定义一个接口指针以及两个域使用新的TButtonServer类来保存我们要创建的新的工具条按钮和菜单项。

  在插件类的private部分添加:

  FWordApp : TWordApplication;

  DICommandBar : CommandBar;

  DIBtn : TButtonServer;

  DIMenu : TButtonServer;

  在OnConnection方法中,保存应用程序指针:

  var

   WA : Word_TLB._Application;

  begin

   FWordApp := TWordApplication.Create(nil);

   WA := Application as Word_TLB._Application;

   WordApp.ConnectTo(WA);

   …………………………..

  TWordApplication是Delphi 5中带的Server组件,ConnectTo 方法是用来连接插件和Word提供的接口。因为TWordApplication 把接口事件映射成了Delphi事件,我们可以直接使用标准的Delphi语法来设定事件处理过程。示意如下:

  WordApp.OnEventX := EventXHandler;

  比如我们如果想在Word的选区发生改变时实现某项功能,就可以设定OnWindowSelectionChange 事件。

插件如何创建新的工具条、按钮和菜单

  在创建新的工具条和按钮前,需要为按钮的OnClick过程先创建事件处理函数,下面就是简单的处理函数例子:

  procedure TAddIn.TestClick(const Ctrl: OleVariant;

   var CancelDefault: OleVariant);

  begin

   ShowMessage('有人点我了!');

   CancelDefault := True;

  end;

  CancelDefault参数用来设定是否替代缺省的菜单或工具条按钮的处理过程。这里不需要设定这个参数,因为我们将在插件中创建一个新的按钮。插件注册为在程序启动时被加载,所以OnStartupComplete方法一定会被调用,用这个方法创建用户界面元素是比较合适的。这里定义BtnIntf为CommandBarControl接口类型(要创建的CommandBarButton的父类接口)。接下来的任务是确定自定义的工具条是否已经被创建了

  DICommandBar := nil;

  for i := 1 to WordApp.CommandBars.Count do

   if (WordApp.CommandBars.Item[i].Name ='Delphi') then

    DICommandBar := WordApp.CommandBars.Item[i];

    // 确定是否已经注册了命令条

   if (not Assigned(DICommandBar)) then begin

    DICommandBar:=

WordApp.CommandBars.Add('Delphi',EmptyParam,EmptyParam,EmptyParam);

    DICommandBar.Set_Protection(msoBarNoCustomize)

  end;

  先给工具条起一个唯一的名字“Delphi”,然后在启动时检查工具条是否已经被创建了。如果是的话就把它赋值给DICommandBar,否则调用Word的CommandBars属性的Add方法创建一个新的工具条。接着给工具条添加msoBarNoCustomize的保护,这可以防止用户添加或删除工具条上的按钮。这时DICommandBar指向一个有效的工具条,我们可以从接口的Controls集合中获得工具条按钮接口指针。如果工具条上没有控件,就创建一个新的按钮。

  if (DICommandBar.Controls.Count > 0) then

   BtnIntf := DICommandBar.Controls.Item[1]

   else

   BtnIntf := DICommandBar.Controls.Add(msoControlButton,

   EmptyParam, EmptyParam, EmptyParam, EmptyParam);

  注意:集合中第一项是以1为底的,而不像Delphi中那样通常以0为底。现在我们获得了需要的工具条按钮接口,然后要创建一个基于按钮接口的TButtonServer 类封装。

   DIBtn := TButtonServer.Create(nil);

   DIBtn.ConnectTo(BtnIntf as _CommandBarButton);

   DIBtn.Caption := 'Delphi Test';

   DIBtn.Style := msoButtonCaption;

   DIBtn.Visible := True;

   DIBtn.OnClick := TestClick;

  这里使用ConnectTo 方法连接按钮的事件并设定先前创建的OnClick事件处理过程。最后,要确认使工具条可见。

  DICommandBar.Set_Visible(True);

  TLIBIMP程序创建了一个只读的而非可读写的工具条Visible 属性,但可以使用Set_Visible 方法来设定显示属性(不能生成可读写的属性可能是TLIBIMP的bug)。添加新的菜单项类似于前面,首先创建菜单的OnClick事件处理函数,下面这个过程遍历被选文本的第一段,并设定其边框样式:

  procedure TAddIn.MenuClick(const Ctrl: OleVariant;

   var CancelDefault: OleVariant);

  var

   Sel : Word_TLB.Selection;

   Par : Word_TLB.Paragraph;

  begin

   Sel := WordApp.ActiveWindow.Selection;

   if (Sel.Type_ in [wdSelectionNormal,

    wdSelectionIP]) then begin

    Par := Sel.Paragraphs.Item(1);

   if (Par.Borders.OutsideLineStyle < wdLineStyleInset) then

    Par.Borders.OutsideLineStyle := 1 + Par.Borders.OutsideLineStyle

   else

    Par.Borders.OutsideLineStyle := wdLineStyleNone;

   end;

  end;

  在OnStartupComplete方法中,添加下面的代码来获得工具菜单的接口指针,查找自定义的的菜单项,如果没有就创建新的,然后设定它的OnClick事件:

  ToolsBar := WordApp.CommandBars['Tools'];

  MenuIntf := ToolsBar.FindControl(EmptyParam, EmptyParam,

   'DIMenu', EmptyParam, EmptyParam);

  if (not Assigned(MenuIntf)) then

   MenuIntf := ToolsBar.Controls.Add(msoControlButton,

   EmptyParam, EmptyParam, EmptyParam, EmptyParam);

   DIMenu := TButtonServer.Create(nil);

   DIMenu.ConnectTo(MenuIntf as _CommandBarButton);

   DIMenu.Caption := 'Delp&hi Menu';

   DIMenu.ShortcutText := '';



图1.34

   DIMenu.Tag := 'DIMenu';

   DIMenu.Visible := True;

   DIMenu.OnClick := MenuClick;

  CommandBar接口的FindControl方法使用唯一的标识来查找菜单项,如果找到了控件就赋值给 MenuIntf,如果没有找到就创建一个新的菜单项。图1.34显示了自定义的工具条。

清理资源

  注意应该在OnBeginShutdown 方法中清理用户界面元素:

   if (Assigned(DIBtn)) then

   begin

    DIBtn.Free;

    DIBtn := nil;

   end;

   if (Assigned(DIMenu)) then

   begin

    DIMenu.Free;

    DIMenu := nil;

   end;

   if (Assigned(DICommandBar)) then begin

    DICommandBar.Delete;

    DICommandBar := nil;

   end;

  因为插件的框架是通用的,我们可以将同样的OLE Server DLL用于多个应用程序,方法就是确定将激活插件的应用程序,并使用合适的对象模型。最简单的判断方法是在OnConnection中把应用程序的IDispatch的接口指针赋值给一个OleVariant变量,然后使用相应的Name 属性来确定相应的程序:

  var

   AppVar : OleVariant;

  begin

   AppVar := Application;

   if (AppVar.Name = 'Outlook') then

   begin

    ...

   end

   else if (AppVar.Name = 'Microsoft Word') then

   begin

    ...

   end else ...

  最后,要想获得关于Office开发和Office 2000插件创建更详细的资料,可以查阅microsoft.public.officedev新闻组上的信息。

基于DELPHI的Office插件开发实战项目 DELPHI开发的Office插件通过COM技术深度集成Excel、Word和Outlook等应用程序,实现企业级自动化办公。其典型应用场景包括:财务报表自动生、合同批量生成、邮件智能推送及数据采集标准化。依托VCL框架与类型库(TLB)封装,开发者可高效调用Office对象模型,结合窗体界面与后台逻辑解耦设计,提升维护性。该类插件广泛应用于金融、制造与政务领域,支持本地化部署与高安全性控制,满足对数据隐私和定制化要求较高的业务需求。 阅读详情

相关推荐

Delphi开发Word插件:COM原生方案实战指南

Office COM加载项是Windows桌面端深度集成Word的核心技术路径,其本质是通过IDTExtensibility2接口实现宿主进程(Winword.exe)与外部DLL的进程内通信。该方案依赖Type Library导入、Ribbon XML声明式UI、STA线程模型及注册表驱动的生命周期管理,技术价值在于零.NET依赖、强环境可控性与遗留系统无缝复用。典型应用于政务内网、金融终端、制造业CAD协同等禁止远程更新、无管理员权限部署的封闭场景。本文聚焦Delphi语言下Word插件的可落地实现,涵

weixin_28716181的博客 231

delphi操作word

delphi操作word一、Delphi程序启动Word采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Applicati...

weixin_33674976的博客 565

Delphi 利用ActiveX控件实现Office助手.rar

Delphi 利用ActiveX控件实现Office助手,这个助手用过Word大概都见到过,类似墨林小人一样的动画,会眨眼,弹出提示,会做出一些向下看,寻找东西,聆听、警告等小动作,本源码基于ActiveX控件实现,可熟悉下ActiveX控件的用法,在Delphi中可以定义墨林,如下代码示:   procedure TForm1.FormCreate(Sender: TObject);   begin    WS[0]:='Acknowledge';    WS[1]:='LookDown';    WS[2]:='Sad';    WS[3]:='Alert';    WS[4]:='LookDownBlink';    WS[5]:='Search';    WS[6]:='Announce';    WS[7]:='LookUp';    WS[8]:='Think';    WS[9]:='Blink';    ICR:= Agent1.Characters.Load('merlin','merlin.acs');    ICCE:=Agent1.Characters.Character('merlin');    ICCE.Show(0);   end;      procedure TForm1.ListBox1Click(Sender: TObject);   begin    ICCE.StopAll('');    ICR:=ICCE.Play(WS[ListBox1.ItemIndex]);   end;      procedure TForm1.FormDestroy(Sender: TObject);   begin    Agent1.Characters.Unload('Merlin');   end;

Delphi开发Office插件

使用Delphi开发Office Word插件    在Office 2000中提供了基于COM的插件开发框架,这使得我们可以利用Delphi来扩展Office的功能。    在Delphi 3,4中编写基于COM的插件,我们需要自己创建COM接口的封装类,更糟糕的是要想支持事件的话还需要使用连接点(connection points)对象来实现事件回调,这是非常麻烦的。但在Delphi 5中这一

1828

DELPHI office插件

DELPHI office 插件

运用Delphi设计Office_Word插件

这是我几年前开发WORD插件工具参考的一份PDF文档资料。

Add-in Express控件Crack,Office和Delphi VCL 9.1

  Office和Delphi的Add-in Express VCL是第一个在Delphi中编写COM插件,智能标记和RTD服务器的可视化工具,它完全支持该技术并使编程扩展变得容易。此工具适用于从2000到Microsoft Office 2013和Office 2016 32位和64位的所有版本的Microsoft Office。   Office和Delphi VCL的Add-in Express的功能:   根据Microsoft Office的发展,Add-in Expressq23157023

q2315702359的博客 3671

Delphi读写Office Word DOCX文档控件DOCXReadWrite & AXWReport开发帮助手册中英文对照版.docx

很珍稀的Delphi读写Office Word控件,不是OLE技术,直接读写DOCX文件,这是本人翻译的DOCXReadWrite & AXWReport官方开发帮助手册中英文对照版,包括WORD模板的设计,可以用Delphi直接通过模板生成WORD报表。

Add-in Express for Office为构成COM插件

  用于Office和Delphi VCL的Add-in Express被描述为构成COM插件、智能标签以及RTD主机的第一个可视化工具,该工具位于Delphi,可供用户和开发人员使用。它具有完全支持该技术的能力,并使编程扩展非常方便,以便通过Microsoft Office 2019、32位和64位获得2000年所有可用的Microsoft Office变体。Add-in Express可用于办公室和Delphi,它完全依赖于快速应用程序开发和策略,允许用户和开发人员使用鼠标点击创建专业插件,就像Micr

q2315702359的博客 641

Delphi 12.3控件之Office-Tool-with-runtime-v10.14.28.0-x64.zip.rar

Delphi 12.3控件之Office_Tool_with_runtime_v10.14.28.0_x64.zip.rar

Delphi 12.3 控件之Office-Tool-with-runtime-v10.14.28.0-x64.zip.rar

Office_Tool_with_runtime_v10.14.28.0_x64.zip.rar

学习使用Delphi 2009 开发 Word 2003 插件 <一>

实现自己的第一个插件1、放置按钮 公司在网站项目还没有完成时,就开会讨论了下一步每个人要做的工作,开会讨论的结果是准备让我写 Office 插件。昨天终于是把网站给发布了。我也开始准备着手来写 Office 插件,这项工作对我来说还是很有难度的。毕竟自己没有一点开发插件的经验。边学边做吧,写下这篇文章就当是个开发记录,要是哪天不记得具体的步骤还可以上来回忆一下,老手可以...

weixin_33722405的博客 216

保姆级教程:在RK3588开发板上用CMake交叉编译ZLMediaKit(附完整toolchain配置)

本文提供了一份详细的RK3588开发板上使用CMake交叉编译ZLMediaKit的教程,包括完整的toolchain配置和实战避坑指南。从环境准备、工具链配置到依赖处理、编译部署,手把手指导开发者完成ARM64架构的流媒体服务搭建,特别适合嵌入式开发新手。

weixin_28681255的博客 383

Office2000(2003) 下 outlook,word 的 com addin 之 delphi实现!(整理摸索)

       在Office2000下的Word2000、Access2000、Excel2000、PowerPoint2000等软件中的工具条或菜单条资源中,看到一些其它软件加入的新的自定义工具条按钮或菜单条,当点击它们时,会有其不同的响应发生。在这里我们不用VB/VBA也不用vc6来实现它,而是用delphi(5,6,7)适用开发具有这种效果的Office2000内部COM插件。在Office

andyLe的专栏 1624

破解拼多多网页字体加密的Python实现(静态)

爬取或者复制粘贴出来发现数字不是6372,而是这样的一个东西 ""从上图我们可以看出数字是一行的空白,后面被浏览器渲染后才展现的数字。我们可以用这个代码查看十六位进制对应的十进制,为什么要看十进制呢?​,而字体文件中的字符映射关系(cmap)也是以十进制存储的。我们搜索这个属性我们可以看到第一个这样的属性有一个URL,这个就是解密的字体包。然后我们构造一个这样的映射字典 key就是对应的十进制,后面的值就是对应的数字。然后我们需要封装一个函数,将加密文字和映射字典传入,返回解密后的数字。

weixin_64179111的博客 3539

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 613

用Delphi制作Office的Com AddIn

最近想做一个像金山词霸那样在Word上面增加一个按钮的东西在网上找了一会儿,竟然没有Delphi的例子,没办法只好自己搞定,1. 新建一个Active Library2. 新建一个COM Object,在Class Name填一个名字,如Test。点一下Implemented Interface后面的List按钮。再点一下对话框中的Add Library按钮,选择“Program Files/Co

TomyGuan的专栏 1362

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

word闪退故障解决

昨天一天在维护个人编写的WORD插件,在进行一些什么操作后突然发现:进入WORD后,在点击菜单上的【文件】项或右键时就闪退了。 先是自救,试图删除全部的Word加载项,但是没有曲道去删除,唯一就是自己的插件在Delphi中自行卸载了。故障依旧。 第二就是重新安装Office软件,安装时选择了修复文件。故障依旧 第三就是修复windows系统文件,以管理员身份运行了cmd,在命令行中执行sfc...

程序员与注册会计师 1万+

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 530

PaddleOCR实战:给图片‘加个框’,轻松搞定小图和长图文字识别不准的难题

本文探讨了PaddleOCR在处理小图和长图时识别精度下降的问题,并提出通过图像边框预处理技术显著提升OCR识别效果。详细介绍了使用OpenCV实现智能边框添加的方法,包括核心原理、工程实践中的关键细节以及性能优化策略,帮助开发者轻松解决非常规尺寸图像的文本检测难题。

weixin_29313547的博客 188
上一篇: OLE 焦点问题
下一篇: Delphi中停靠技术的实现
pgnet
博客等级 码龄20年 9粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值