首页 > 其他分享 >从Delphi到Lazarus——在Lazarus中使用ActiveX控件(导入类型库)

从Delphi到Lazarus——在Lazarus中使用ActiveX控件(导入类型库)

时间:2024-12-06 14:44:38浏览次数:9  
标签:控件 ActiveX Delphi 文件夹 组件 Lazarus

0.前言

Lazarus的设计目标是应用Free Pascal,所以所有凡是Free Pascal能运行的平台,Lazarus都可以运行。通俗地说就是Lazarus追求的是跨平台编程,致力于“一次编写,到处编译”。

Lazarus最初是一个基于Free Pascal的Delphi仿制品。Lazarus作为一个可能代替Delphi的集成开发环境,从诞生以来表现出顽强的生命力和高速的发展势头,支持的平台越来越多。尽管如此,我们不是专业的程序员,作为业余编程爱好者或者仅仅是为了自己工作需要而编程的人,我们绝大多数人能够用到的操作系统可能只有一种,这样的情况下跨平台编程对于我们来说是没有意义的,最多也就是为了满足好奇心而适当地学习和探讨一下罢了。

我们选择使用Lazarus的目的可能仅仅就是为了避免不喜欢Delphi的某些限制或者麻烦,而不是因为Delphi不够优秀。

作为一种跨平台的程序开发环境,Lazarus有其天然的不足。跟其他一些跨平台开发环境一样,为了能够使得用它编写的程序在移植到其他操作系统时有尽可能少的修改,保留了各种平台共有的东西,而操作系统独有的一些功能却被舍弃,而这些独有的功能有时候恰恰是我们需要用到的。

支持某种操作系统下独有的功能,我们可能有以下方法:

  • 使用仅在某种操作系统下才能使用的组件
  • 调用某种操作系统提供的API函数
  • 使用ActiveX控件支持

在这篇文章里,我将重点讲述Lazarus中使用ActiveX控件的方法。主要内容如下:

  1. Lazarus对ActiveX控件的支持
  2. 用你的电脑中安装的ActiveX控件创建组件(导入类型库)
  3. 在你的程序中使用你自己创建的ActiveX的组件 
  4. 测试结果分析及其他使用ActiveX的文章推荐

1.Lazarus对ActiveX控件的支持

ActiveX 是一种 Microsoft Windows 技术,只能在该平台上使用。

Lazarus提供了一个名为LazActiveX  0.1的软件包,用于提供对ActiveX的支持。这个软件包在Lazarus安装文件夹下的components\activex文件夹中。要想在Lazarus中使用ActiveX,就需要先安装这个软件包。安装LazActiveX  0.1的软件包的方法可以打开以下链接,参照其中的[3.安装整合IDE界面的软件包]的步骤,选择安装LazActiveX  0.1:

从Delphi到Lazarus——安装最新版的Lazarus - lexyao - 博客园

LazActiveX软件包包含 TActiveXContainer 组件和必要工具的 IDE 集成,以便从类型库或直接从对象(exe 或 dll)创建 ActiveX 组件。安装完成后组件面板中增加了一个AxctiveX页面,在这个页面中你会看到一个图标 ,这就是TActiveXContainer 组件。

Delphi 中使用AxctiveX的方法是通过组件 OleServer,而Lazarus使用的则是TActiveXContainer组件。似乎Lazarus提供的方法使用起来更加方便。

2.用你的电脑中安装的ActiveX控件创建组件(导入类型库)

在Delphi中使用过Activex的人都不会陌生,除了Delphi已经包装了的ActiveX控件之外,你要使用ActiveX的第一步的操作就是导入类型库。在Lazarus中也是需要先导入类型库。Lazarus中导入类型库的操作步骤如下:

  1. 在Lazarus的安装文件夹下建立一个名为ActiveX的文件夹
  2. 点击主菜单[工具->导入类型库…],打开[导入类型库]窗口
  3. 在窗口的列表①中选择你要使用的ActiveX控件。Lazarus将ActiveX控件分为两组,一组是可视的(Visual Controls),一组是不可视的(ActiveX References),你可以通过选项卡②切换选择
  4. 窗口下边③有三个选项,分别是“创建可视化组件”、“创建包”、“转换相关的typelibs”,建议都要选中。将来熟悉了之后你可以自己决定选或者不选
  5. 点击[确定]按钮,弹出[选择文件夹]窗口
  6. 这里以Microsoft Internet Controls为例,所以在[选择文件夹]窗口中找到你刚才创建的ActiveX文件夹,并在其中创建文件夹SHDocVw,然后选中这个新创建的文件夹点击确认。这时如果你用文件资源管理器打开SHDocVw文件夹,你会看到其中有三个文件:SHDocVw_1_1_TLB.pas、SHDocVw_1_1_TLBP.lpk、SHDocVw_1_1_TLBPreg.pas,这就是导入类型库后生成的软件包
  7. 确认了选择文件夹后弹出[软件包]窗口。你会发现这个窗口与点击主菜单[软件包->打开软件包…]打开一个软件包后的窗口是一样的。点击窗口中的[使用->安装]
  8. 在弹出的[重新构建Lazarus?]窗口中点击[是]按钮,等待Lazarus重新编译、构建、运行……

当你看到重新运行的Lazarus后,你导入类型库的操作就算是完成了。这时你再打开组件面板中的ActiveX页,你会看到增加了几个图标,这就是你导入类型库后生成的组件。你将鼠标悬停在图标上,你会看到组件的名字。

需要说明一点:建立一个名为ActiveX的文件夹是我的建议,不是必须的,你可以决定是不是要这样做。默认情况下Lazarus导入类型库后生成的软件包放置在系统的临时文件夹下,不利于今后的使用和管理。建立一个独立的ActiveX文件夹后你使用就方便多了。

3.在你的程序中使用你自己创建的ActiveX的组件

当你决定要使用ActiveX的时候,我会认为你已经知道了使用ActiveX控件的方法。按着Microsoft提供的资料,使用ActiveX有先期绑定和后期绑定两种形式。在Lazarus中,你可以遵循这种理念,但具体的操作可能要比你想象的简单了许多。下面我将通过一个例子向你展示在Lazarus中使用ActiveX的方法。

第一步、创建项目

  1. 在Lazarus中点击主菜单[文件->新建…],在打开的[新建]窗口中选择[项目->应用程序],然后[确定],这时创建了一个名为project1的项目,它包含一个名为Form1的窗体。
  2. 在属性列表中将窗体的name由Form1改为frmMain
  3. 点击主菜单[文件->保存]保存项目到名为MyBrw的文件夹中。保存时将项目名称由project1.lpi改为MyBrowser.lpi、单元文件名由uint1.pas改为main.pas

第二步、向窗体中添加组件

  1. 向窗体中添加一个状态条StatusBar1: TStatusBar
  2. 向窗体中添加一个工具条ToolBar1: TToolBar,选中工具条,在属性列表中将它的AutoSize、ShowCaptions属性设置为true,将Wrapable属性设置为false
  3. 在工具条上点击鼠标右键,选择[新建按钮],选中工具条中新建的按钮,在属性列表中将它的name改为btnOpen,Caption改为“打开”
  4. 在工具条中添加一个单行文本组件,将它的名称改为edUrl: TEdit
  5. 从组件面板中选择TAxcWebBrowser添加在窗体的中间空白处,在属性列表中将组件AxcWebBrowser1的属性Active设置为true,将Align设置为alClient

以下是添加了组件后main.pas文件中的代码:

unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
  SHDocVw_1_1_TLB;

type

  { TfrmMain }

  TfrmMain = class(TForm)
    AxcWebBrowser1: TAxcWebBrowser;
    edUrl: TEdit;
    StatusBar1: TStatusBar;
    ToolBar1: TToolBar;
    btnOpen: TToolButton;
  private

  public

  end;

var
  frmMain: TfrmMain;

implementation

{$R *.lfm}

end.

在Lazarus的代码编辑器中用鼠标点击“TAxcWebBrowser”,再点击鼠标右键,从弹出菜单中选择“查找TAxcWebBrowser的定义”,你会看到打开的SHDocVw_1_1_TLB单元文件中TAxcWebBrowser类的定义代码。

  TAxcWebBrowser = Class(TActiveXContainer)
  Private
    FServer:IWebBrowser2;
    ……

从代码中可以看出,TAxcWebBrowser继承自TActiveXContainer,这也是在向窗体添加组件时不用添加TActiveXContainer而直接添加TAxcWebBrowser的原因。

第三步、添加代码

在“对象查看器”中选择窗体组件frmMain: TfrmMain,然后在[属性->事件]中双击OnCreate和OnResize给窗体添加两个事件处理函数,然后在代码编辑器中给这两个函数添加如下代码:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Caption:='我的浏览器';
  edUrl.Text:='在这里输入你要浏览的网页的网址';
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
  edUrl.Width:=ToolBar1.ClientWidth-edUrl.Left;
end; 

在“对象查看器”中选择组件AxcWebBrowser1: TAxcWebBrowser,然后在[属性->事件]中双击OnStatusTextChange和OnTitleChange给TAxcWebBrowser组件添加两个事件处理函数,然后在代码编辑器中给这两个函数添加如下代码:

procedure TfrmMain.AxcWebBrowser1StatusTextChange(Sender: TObject; Text_: WideString);
begin
  StatusBar1.SimpleText := Text_;
end;

procedure TfrmMain.AxcWebBrowser1TitleChange(Sender: TObject; Text_: WideString);
begin
  Caption := '我的浏览器 -- ' + Text_;
end;

在“对象查看器”中用鼠标双击组件btnOpen: TToolButton,给组件btnOpen添加OnClick事件处理函数,然后在代码编辑器中给这个函数添加如下代码:

procedure TfrmMain.btnOpenClick(Sender: TObject);
var
  Flags:OleVariant;
  TargetFrameName:OleVariant;
  PostData:OleVariant;
  Headers:OleVariant;
begin
  AxcWebBrowser1.OleServer.Navigate(edUrl.Text, Flags, TargetFrameName, PostData, Headers);
end;  

第四步、运行测试

点击Lazarus工具栏中的绿色[运行]按钮,你编写的程序MyBrowser开始运行,你会看到如下图所示的窗口,这说明你的程序已经编制完成,并且经过编译后能正常运行了。

 为了进一步测试MyBrowser的效果,再做两个测试。

第一个测试,在你的电脑中随便找到一个网页文件,双击后在浏览器中打开,从浏览器的网址栏中复制它的网址,粘贴到MyBrowser的网址栏中,点击[打开]按钮,你会看到打开网页的画面如下:

 第二个测试,在你的电脑的浏览器中随便打开一个互联网上的网页,从浏览器的网址栏中复制它的网址,粘贴到MyBrowser的网址栏中,点击[打开]按钮,你会看到打开网页的画面如下:

 4.测试结果分析及其他使用ActiveX的文章推荐

从上面编写的测试程序运行结果来看,第一个第一个窗口看上去是正常的,这说明程序正常编译运行了。再看后面进一步测试的两个窗口截图,你会发现有两个问题:

第一个问题:标题栏中出现乱码。

本来在标题栏中应该显示“我的浏览器 -- <网页标题>”,但截图中看到的“我的浏览器”变成了乱码,而在Delphi中不会出现这样的现象。

为什么这样呢?这个问题应该是Lazarus使用的字符串编码格式造成的,需要对字符串进行格式转换才能正常显示汉字。

第二个问题:无法安全地打开网页。

正如截图中的网页标题所说的,“无法安全地连接到此页面”。

为什么这样呢?从截图中的文字应该了出现问题的可能原因,这不是Lazarus的问题,而是没有给TAxcWebBrowser组件设置正确的选项造成的。准确地说,是没有设置IWebBrowser的选项,这不是Lazarus的问题。

从以上问题可以看出,使用Lazarus和使用Delphi还是有区别的,而使用ActiveX控件还要了解这个ActiveX本身的设置要求。

关于在Lazarus中使用ActiveX,在网上有一篇关于LazActiveX  0.1的软件包的更加全面的介绍,你可以点开下面的网址看一看,应该会有所收获。

LazActiveX - Free Pascal wiki(英文)

标签:控件,ActiveX,Delphi,文件夹,组件,Lazarus
From: https://www.cnblogs.com/lexyao/p/18588641

相关文章

  • 从Delphi到Lazarus——Delphi转换器
    0.前言在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中。不过,Lazarus与Delphi毕竟不是同一个东西,还是存在一些区别的,这就需要将Delphi文件转换为Lazarus需要的格......
  • 界面控件DevExpress WinForms中文教程:Data Grid - Best Fit选项
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!本文主要介绍如何使用DevExpressWinFormsDataGr......
  • 从Delphi到Lazarus——Lazarus编程时可以使用的组件(控件)
    0.前言使用过可视化编程的人都知道在编程时组件的重要性。可以使用的组件越多,编程越方便快捷。理论上,Delphi中的所有组件在Lazarus中都可以使用。当然,在Windows编程时多数是可以直接使用的,有些需要做适当的修改才能使用。而在Unix或Linux下编程就有些不能使用了,这涉及到操作系统......
  • 用fpc trunk(3.3.1) 编译TMS FNC控件时出现INTERNAL 20231102
    由于fpc trunk一直在增强及调整,用不同时间段的fpc都可能存在兼容问题,如这次用fpctrunk(3.3.1)编译TMSFNC控件时出现Internal20231102,之前的能通过编译的。用最新的fpc编译LCLTMSFNCCorePkg.lpk时出现以下错误: 在fpc源码发现以下一段文字:如果使用泛型等复杂的情况下,locals......
  • B4X编程语言:B4X控件的背景色属性(Color/Background)
             B4A控件的背景色属性有两个:Color和Background,B4XView类型控件无论在B4A还是B4J,都只有Color属性。B4J其它控件没有背景色属性,要获取和设置其背景色属性,需使用As(B4XView)方法。        一、Color属性        Color属性的值类型是Int型。......
  • B4X编程语言:B4X控件的字体属性(Font / Typeface)
            除B4XView类型的控件外,B4A控件的字体属性是Typeface,B4J控件的字体属性是Font。B4XView类型的控件无论在B4A、B4J还是B4i中,其字体属性均是Font。    一、B4A控件的字体属性Typeface        Typeface属性用于设置或获取B4A控件文本字体,获取字......
  • B4X编程语言:B4A控件内容对齐方式属性Gravity详解
            Gravity属性用于设置控件的内容在控件内的对齐方式,使用Gravity属性可以对控件的内容进行灵活的对齐设置,以适应不同的界面布局需求。在B4A中,Label、Button、Imageview等控件均有Gravity属性。        Gravity属性如下:    LEFT:将内容左对齐。......
  • [原创]lazarus在(linux)设置应用在任务栏单一窗口图标显示
    如果lazarus的(linux)应用有多个form,并且form用show显示,在任务栏就会显示多个form的图标,个人感觉比较乱。如果只想显示主form图标,可以在projecr的lpk增加:Application.TaskBarBehavior:=tbSingleButton;以下是完整的lpk:programproject1;{$modeobjfpc}{$H+}uses{......
  • 界面控件DevExpress Blazor UI v24.1新版亮点:图表组件功能全面升级
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v24.1版本了,此版本发布了全新升级了图......
  • DevExpress-独立使用的控件介绍-02
    XtraEditors库提供了只能独立使用的控件,即这些控件只能依附于其他控件配合使用,不能单独使用。这些控件包括:几种类型的列表控件、数据导航控件、滚动条和一个按钮控件,这些控件都是继承于BaseStyleControl,因此支持所有Dev控件共有的样式、外观与感觉、以及工具提示机制,为应用......