从Delphi到Lazarus——Delphi转换器
0.前言
在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中。
不过,Lazarus与Delphi毕竟不是同一个东西,还是存在一些区别的,这就需要将Delphi文件转换为Lazarus需要的格式。
关于从Delphi转换到Lazarus的方法,我在这篇文章里将会介绍以下内容:
- Lazarus中提供的Delphi转换器
- 转换二进制的DFM到LFM
- 转换Delphi单元为Lazarus单元
- 转换Delphi项目为Lazarus项目
- 转换Delphi软件包为Lazarus软件包
- 关于转换的几点说明
- 结束语
1.Lazarus中提供的Delphi转换器
在Lazarus中提供了Delphi转换器,用于把Delphi格式的文件转换成Lazarus需要的格式。
点击主菜单[工具->Delphi转换器],它的后面还有四个菜单项,用来转换Delphi文件为Lazarus文件。每个菜单项对应一种类型的文件,下面将分别讲解。

2.转换二进制的DFM到LFM
点击主菜单[工具->Delphi转换器->转换二进制的DFM到LFM…],选择你要转换的dfm文件,然后[打开],在提示窗口中回答[确定],转换工作就完成了。

使用过Delphi的人都知道,Delphi的窗体文件扩展名为dfm,是一个二进制文件,在Delphi中打开可以看到所见即所得的窗体画面,也可以通过[查看源码]看到以文本形式表示的窗体文件。
在Lazarus中,窗体文件的扩展名是lfm,在任何可以查看文本文件的程序中你都可以看到Delphi的[查看源码]中看到的内容,而在Lazarus中打开lfm看到的是所见即所得的窗体画面。上面的插图中看到的是将一个名为ULineExample.dfm的二进制文件转换为名为ULineExample.lfm文本文件。
3.转换Delphi单元为Lazarus单元
点击主菜单[工具->Delphi转换器->转换Delphi单元为Lazarus单元…],选择你要转换的pas文件,然后[打开],在出现的窗口中点击[开始转换],转换工作就完成了,转换后的文件会在Lazarus中打开,你可以原名保存或者另存为其他的文件名。

Lazarus和Delphi的源代码文件的扩展名都是pas,为了转换后不影响引用这个单元文件的其他相关文件,你需要保持原有的文件名。你不必担心原来的文件会被覆盖,因为Lazarus已经新建了一个文件夹把原来的文件备份了。你已经看到上面界面中[其他]栏目中的[制作更改文件的备份]已经被选中了。
从界面中你也看到了其他的几个选项,这些都不重要,你觉得需要了解就自己去尝试一下。
不是说Lazarus可以直接使用Delphi的文件吗?转换后的单元文件与原来的有什么不同呢?主要有以下几点:
- 在单元文件的头部添加了一个编译选项{$MODE Delphi}。在Lazarus自己创建的单元文件中这个选项是{$mode objfpc}
- 将原来的Delphi单元文件中的{$R *.dfm}改为{$R *.lfm}。这是因为Lazarus的窗体文件的扩展名是lfm
- 当Delphi与Lazarus中提供相同功能的单元有不同的名字时,要将uses下单Delphi单元名替换成Lazarus的单元名。比如Delphi的"Windows" 要替换为"LCLIntf, LCLType, LMessages"
- 或许还有我没有发现的其他修改,其实这些知道与否必要性不大。不过我猜想条件编译中可能有需要修改的东西,你可以在使用中关注一下。
上面提到的第一个改变与Lazarus的字符串表达方式有关,之所以这么做,是因为Lazarus与Delphi中字符串的表示方式是不同的。关于Lazarus中字符串的更多说明可以从以下链接中看到:
4.转换Delphi项目为Lazarus项目
点击主菜单[工具->Delphi转换器->转换Delphi项目为Lazarus项目…],选择你要转换的dpr文件,然后[打开],在出现的窗口中点击[开始转换],转换工作就完成了。
项目转换的界面跟单元转换的界面是相同的,差别只是转换文件的扩展名不同而已。
Delphi项目文件的扩展名是dpr,Lazarus的项目文件扩展名是lpr。
比如转换一个名为LineExample.dpr的项目文件,将会生成一个LineExample.lpr文件。同时还伴随生成LineExample.lpi、LineExample.lps两个文件,这是系统自己维护的,你不需要关注他们。
5.转换Delphi软件包为Lazarus软件包
转换软件包的操作跟转换项目一样,只是点击的是主菜单[工具->Delphi转换器->转换Delphi软件包为Lazarus软件包…],扩展名从dpk转换为lpk。
软件包里包含组件,需要安装后才能使用。
6.关于转换的几点说明
理论上Lazarus可以直接使用Delphi的文件,个别文件需要转换为Lazarus的文件名,但在实际应用中可能不是这么简单。主要有以下几个方面:
- 转换的窗体文件中可能包含Lazarus中不存在或者没有安装的组件,这时打开窗体文件时会提示你删除这些组件。可能你在Delphi中打开从网上下载的源代码时也会遇到这种情况。这是因为没有安装相应的组件,不是Lazarus的错误
- Lazarus追求的是跨平台编程,“一次编写,到处编译”。如果你转换的Delphi文件只支持Windows,那么它在Linux上编译时可能会出现问题。当然,如果你只想你的程序在Windows下运行,可以不用担心这个问题。
- 如果你转换的单元文件中有为了适应Delphi的不同版本而设置的条件编译代码,那么可能需要你添加对Lazarus的支持。当然如果没有相应的设置,{$ELSE} 与{$ENDIF} 之间的代码将被认为是可以在Lazarus中使用的。
- 实现同样功能的组件在Delphi和Lazarus中名字不同或者使用了不同的组件
- 文件中使用了Lazarus不支持的Delphi功能或者代码
- 还可能有一些其他的问题,只有当你在Lazarus中编译时才会发现。这些问题需要你去发现和修改。
7.结束语
我在这篇文章里主要说了将Delphi文件转换为Lazarus文件的操作方法,对于更深层次的修改并没有讨论。之所以这么多是因为有人已经写了这方面的文章,而且写得比我好。
我相信,当你点击以下链接打开网页后看到的内容对你将Delphi文件转换为Lazarus后出现问题的理解和修改有很大的帮助:
Lazarus For Delphi Users/zh CN - Free Pascal wiki
Free Pascal 编译器不支持的 Delphi 语言功能(英文)
Delphi Converter in Lazarus/zh CN - Free Pascal wiki
从Delphi到Lazarus——Delphi转换器的更多相关文章
- Indy 10.5.8 for Delphi and Lazarus 修改版(2011)
Indy 10.5.8 for Delphi and Lazarus 修改版(2011) Internet Direct(Indy)是一组开放源代码的Internet组件,涵盖了几乎所有流行的I ...
- Delphi、Lazarus保留字、关键字详解
Delphi.Lazarus保留字.关键字详解 来自橙子,万一的博客以及其他地方 保留字:变量等标识符可以再使用: 关键字:有特定含义,不能再次重新定义: 修饰字:类似保留字的功能,也就是说可以重用 ...
- zw版【转发·台湾nvp系列Delphi例程】Delphi 使用 HALCON库件COM控件数据格式转换
zw版[转发·台湾nvp系列Delphi例程]Delphi 使用 HALCON库件COM控件数据格式转换 Delphi 使用 HALCON库件COM控件数据格式转换,与IHObjectX接口有关 va ...
- delphi 基础之四 delphi 组织结构
delphi 组织结构 在Delphi中,一个正在开发的应用程序可以被称作项目或者工程.一般地,一个项目主要由dpr(项目).pas(单元)和dfm(窗体)三种文件组成,另外还有一些附属文件,如res ...
- 选择 Delphi 2007 ( CodeGear Delphi 2007 for Win32 Version 11.0.2837.9583 ) 的理由
选择 Delphi 2007 ( CodeGear Delphi 2007 for Win32 Version 11.0.2837.9583 ) 的理由 我不喜欢用InstallRite的全自动安装包 ...
- Delphi XE8中Delphi和JAVA数据类型对应关系!
Delphi XE8中Delphi和JAVA数据类型对应关系所在单元文件:Androidapi.JNI.JavaTypes 对应关系: JObject = interface;//java.lang. ...
- delphi 2010与delphi XE破解版的冲突
在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...
- Delphi 提示在Delphi的IDE中,按Ctrl+Shift+G键可以为一个接口生成一个新的GUID。
对于Object Pascal语言来说,最近一段时间最有意义的改进就是从Delphi3开始支持接口(interface),接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两 ...
- fastscript调用delphi方法和DELPHI调用FASTSCRIPT方法
fastscript调用Delphi过程: 1. 先创建事件处理方法:TfsCallMethodEvent 2. 然后再用调用TfsScript.AddMethod方法,第一个参数为Delphi方法 ...
- delphi 权限控制(delphi TActionList方案)
在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要.但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?大家知道 ...
随机推荐
- 揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证
揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证 介绍 JWT(JSON Web Tokens)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络上安全地传输信息. ...
- IDEA 换了电脑,如何导入和导出配置?
前言 我们在使用IDEA开发时,经常会设置各种各样的配置,时间一长,就会有很多个性化的东西.用起来也越来越顺手. 不过这里可能会有个问题,那就是哪一天我们要换个电脑了,或者想安装新版本的IDEA时 ...
- springboot整合shiro框架详解
在ShiroRealm 中 对所有 引入的service 加上注解 @Lazy ,防止 事务回滚失败.具体原因看该文章 新增整合swagger2,因为之前整合了shiro,所以再访问swagger的时 ...
- js的作用域有哪些 and 他们的特点
全局作用域:是所有代码的执行环境,比如script标签里所有的代码 或 独立的js 文件: 局部作用域:是函数内部代码的执行环境: 块级作用域:是 {} 内的代码执行环境:
- nodejs 和 npm 版本对应关系
一.nodejs 和 npm 的版本是有适配的 首先看下官网列明的大概匹配关系: 官网链接地址:https://nodejs.org/zh-cn/about/previous-releases 可以查 ...
- KubeSphere v3.3.1 权限控制详解
作者:周文浩,青云科技研发工程师,KubeSphere Maintainer.热爱云原生,热爱开源,目前负责 KubeSphere 权限控制的开发与维护. KubeSphere 3.3.1 已经发布一 ...
- php 对二维数组按照汉字首字母排序
1 /** 2 * 取汉字的第一个字的首字母 3 * @param type $str 4 * @return string|null 5 */ 6 function _getFirstCharter ...
- 基于pikachu靶场的水平越权详解
1. pikachu靶场搭建 如果你在之前已经使用过phpstudy了,参考pikachu 靶场环境搭建 如果在靶场搭建中遇到一些问题,参考皮卡丘靶场搭建遇到的问题大全 2. 水平越权简介 水平越权是 ...
- Air780E软件指南:UDP应用示例
一.UDP概述 UDP(用户数据报协议,UserDatagramProtocol)是一种无连接的.不可靠的传输层协议,主要用于实现网络中的快速通讯.以下是UDP通讯的主要特点: 1.1 无连接通讯: ...
- 使用Microsoft.Extensions.AI简化.NET中的AI集成
项目介绍 Microsoft.Extensions.AI是一个创新的 .NET 库,它为平台开发人员提供了一个内聚的 C# 抽象层,简化了与大型语言模型 (LLMs) 和嵌入等 AI 服务的交互.它支 ...