0.前言

在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中。

不过,Lazarus与Delphi毕竟不是同一个东西,还是存在一些区别的,这就需要将Delphi文件转换为Lazarus需要的格式。

关于从Delphi转换到Lazarus的方法,我在这篇文章里将会介绍以下内容:

  1. Lazarus中提供的Delphi转换器
  2. 转换二进制的DFM到LFM
  3. 转换Delphi单元为Lazarus单元
  4. 转换Delphi项目为Lazarus项目
  5. 转换Delphi软件包为Lazarus软件包
  6. 关于转换的几点说明
  7. 结束语

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中字符串的更多说明可以从以下链接中看到:

String - Lazarus wiki

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转换器的更多相关文章

  1. Indy 10.5.8 for Delphi and Lazarus 修改版(2011)

    Indy 10.5.8 for Delphi and Lazarus 修改版(2011)    Internet Direct(Indy)是一组开放源代码的Internet组件,涵盖了几乎所有流行的I ...

  2. Delphi、Lazarus保留字、关键字详解

    Delphi.Lazarus保留字.关键字详解 来自橙子,万一的博客以及其他地方 保留字:变量等标识符可以再使用: 关键字:有特定含义,不能再次重新定义: 修饰字:类似保留字的功能,也就是说可以重用 ...

  3. zw版【转发·台湾nvp系列Delphi例程】Delphi 使用 HALCON库件COM控件数据格式转换

    zw版[转发·台湾nvp系列Delphi例程]Delphi 使用 HALCON库件COM控件数据格式转换 Delphi 使用 HALCON库件COM控件数据格式转换,与IHObjectX接口有关 va ...

  4. delphi 基础之四 delphi 组织结构

    delphi 组织结构 在Delphi中,一个正在开发的应用程序可以被称作项目或者工程.一般地,一个项目主要由dpr(项目).pas(单元)和dfm(窗体)三种文件组成,另外还有一些附属文件,如res ...

  5. 选择 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的全自动安装包 ...

  6. Delphi XE8中Delphi和JAVA数据类型对应关系!

    Delphi XE8中Delphi和JAVA数据类型对应关系所在单元文件:Androidapi.JNI.JavaTypes 对应关系: JObject = interface;//java.lang. ...

  7. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

  8. Delphi 提示在Delphi的IDE中,按Ctrl+Shift+G键可以为一个接口生成一个新的GUID。

    对于Object Pascal语言来说,最近一段时间最有意义的改进就是从Delphi3开始支持接口(interface),接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两 ...

  9. fastscript调用delphi方法和DELPHI调用FASTSCRIPT方法

    fastscript调用Delphi过程:  1. 先创建事件处理方法:TfsCallMethodEvent 2. 然后再用调用TfsScript.AddMethod方法,第一个参数为Delphi方法 ...

  10. delphi 权限控制(delphi TActionList方案)

    在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要.但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?大家知道 ...

随机推荐

  1. Asp.net core 学习笔记之 globalization & localization 复习篇

    更新: 2022-03-22 修订版: ASP.NET Core – Globalization & Localization 更新: 2021-06-15 之前有说过, 我没有使用默认的 f ...

  2. SpringMVC —— 请求参数

    请求映射路径    请求方式   get请求传参        post请求传参          POST请求中文参数乱码问题        请求参数(五种类型数据参数)               ...

  3. 【QT性能优化】QT性能优化之QT性能优化实战 QML优化 QT高性能 QT6系列视频课程 QT6 性能优化实战 QT高性能 QT原理源码 QML优化 GUI绘图原理源码

    QT性能优化实战视频课程 QT6 Widgets高性能应用编程 1.课前考试 2.字符串优化(上) 3.字符串优化(下) 4.绘图优化(上) 5.绘图优化(下)  6.QT界面优化(上) 7.QT界面 ...

  4. 【linux】【docker】Docker默认网段配置导致无法访问

    背景 集团有N个基地,所有基地的网络使用的是172.x.x.x网段,这本身没有什么问题!但Docker默认的桥接网段也是172.17.x.x的,如果不修改docker的默认配置会导致个别基地无法访问! ...

  5. 系统编程-进程-exec系列函数超级详解(带各种实操代码)

    我的相关博文: 系统编程-进程-close-on-exec机制 PART1  exec系列函数功能简介 exec系列函数登场 常规操作是先fork一个子进程,然后在子进程中调用exec系列函数执行新的 ...

  6. 图解连接阿里云(二)使用Paho-MQTT(支持FreeRTOS版本、Linux版本)连接1MQTT测试服务器 2阿里云物联网平台

    前沿提要: MQTT是什么不知道? 看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/10362336.html 阿里云官网玩不转? 看这一篇: ht ...

  7. 大模型训练:K8s 环境中数千节点存储最佳实践

    今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的 KubeCon 中国大会上进行了该主题分享. Kubernetes 已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢.与此同时,人工智 ...

  8. [Tkey] 与非

    解法原理1 首先我们需要明白 \(\operatorname{nand}\) 的运算: \[\operatorname{not}(a\operatorname{nand}b)=a\operatorna ...

  9. Shell分析服务器日志命令

    1.查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2.查看某一个页面被访问的次数: grep "/index.php" ...

  10. C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

    错误原因 VS平台认为scanf函数不安全,要求换成scanf_s函数 解决方案 方案一:将scanf换成scanf_s[不建议] 将scanf换成scanf_s 但是,scanf_s函数只能在vs上 ...