在Delphi中替换可视化组件的最佳方法

10
在Delphi表单中,我想用另一个可视化组件替换一个组件。例如:我想用第三方包的ElPanel替换Panel组件。
我希望将第一个组件的所有相同属性和事件传递给新组件,并且属于第一个组件的所有组件(例如工具栏、备忘录、状态栏等)都应该放置在新组件上并与它们在第一个组件上的位置完全一致。
除了逐个细致地将每个属性、事件和组件转移到新组件外,是否有更好/更简单的方法来实现这一点呢?
7个回答

12

我按照以下步骤进行操作:

  1. 右键单击表单,选择(查看为文本)。
  2. 按Ctrl + F搜索组件类名称,例如TPanel,并将其替换为TElPanel
  3. 切换回表单(查看为表单)
  4. 在接口部分将TPanel更改为TElPanel。

如果您有许多使用组件,则使用GExperts将是更可行的解决方案。


这是最佳解决方案,无需使用GExperts插件。 - lkessler

10
您可以使用GExperts,或手动完成此操作。

如果要手动完成,请在记事本中打开.dfm文件,并替换所有类名(例如,将TPanel替换为TElPanel)。完成所有更改后,请使用记事本打开.pas文件并执行相同的操作。

请确保将所需的单元添加到您的用途子句中。

然后,在IDE中打开表单并清理任何不匹配的事件或未知属性问题。


实际上,在Delphi的后续版本中,你不能在记事本中编辑.dfm文件,因为它是一个二进制文件。 - lkessler
5
实际上,在早期版本的 Delphi 中,它是一个二进制文件。而在后来的版本中则是一个文本文件。要在文本和二进制 dfm 格式之间进行转换,请使用 Delphi bin\ 目录中的 convert.exe 工具。 - Tim Knipe
(参见“工具|选项|VCL设计器”下的“文本形式为新表单”选项) - Tim Knipe
似乎在Delphi 2009中默认回到了二进制格式,或者在升级到Delphi 2009时仍保留了Delphi 4的二进制dfm格式。你提到的“将新窗体作为文本”选项是个好办法。 - lkessler
在 Delphi 2010 和 XE 中执行此操作时,GExperts 对我来说失败了。可能是导致这种情况的 Open Tools API 的更改;但还不确定。 - Jeroen Wiert Pluimers

6
如果我没记错的话,优秀的免费GExperts插件可以实现这个功能。右键单击您的窗体,然后选择“替换组件”。http://www.gexperts.org

2

我认为,Replace组件GExpert的一个大缺点是它改变了源代码中组件的顺序。这对版本控制不太友好。 :-)


1

如果您在容器内有其他组件进行此替换,使用GExperts将导致一些丑陋的异常,并可能导致IDE中出现意外行为。
因此,最好的解决方案是编辑您想要更改组件类型的.dfm文件(在IDE内部或外部),并手动替换它们。也许这也会引起一些异常,但IDE会处理它们。
如果您在IDE内部进行操作,在切换到设计视图后,如果立即保存.dfm文件,IDE将要求您更改与所触摸组件相关的变量类型,从而使您可以自由更改。


1
要在文本和二进制dfm格式之间进行转换,请使用Delphi bin\目录中的convert.exe工具。- Tim Knipe(10月28日4:15)
您还可以使用表单设计器的上下文菜单-至少在BDS 2006中是这样。它是最后一个菜单项(在德语IDE中为“Text-DFM”)。

0
在我的项目中,我不得不将几十个表单从一组组件转换为另一组。我创建了一个小的Perl脚本来转换组件及其属性,并执行所有必要的映射。该脚本是快速且简单的解决方案,但高度可配置。它扫描项目目录中的所有dfm和pas文件,并根据您在ObjectBeginFound、PropertyFound、ObjectEndFound过程/事件中提供的规则转换dfm组件定义。
DFM文件应处于文本模式。已在Delphi 5文件上进行测试。我不知道它是否与更新版本兼容。如果您发现了,请发送帖子告诉我。
用法: perl.exe cxdfm.pl > logfile.txt
下载链接 http://dl.dropbox.com/u/15887789/cxdfm.pl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接