有没有将Delphi DFM转换为Delphi源代码的工具?

4

Delphi的表单设计器非常好,但我们需要直接从源代码中工作。是否有工具或脚本可以将一批DFM文件转换为Delphi源代码?


@Chris,OP希望将许多文本dfm文件转换为它们的Pascal对应文件,有点类似于逆向工程。因此提到了具有这种能力的GExperts。 - LU RD
Delphi源代码 = Pascal代码 - MX4399
@Rob Kennedy - DFM不是存储资源编译成exe的格式吗?那不算是“源代码”-那是一种资源。提出问题的原因是为了避免TReader读取流,然后构建和绑定类实例-无论标准Delphi方法如何工作,在最终上它都有实际限制(例如动态对象组合)。 - MX4399
DFM文件被转换为二进制并链接到项目中,就像RC文件被转换为RES文件或PAS文件被转换为DCU文件一样。一旦你将所有文本文件转换为二进制,链接器就可以发挥作用了。你可以将DFM文件保留在源代码控制中,这样它们就是源代码。 - Rob Kennedy
如果我没记错,DeDe和/或RevenderPro能够重构设计类(OTA术语)源代码,只要有DFM数据。是的,Delphi表单在某种程度上受到窗口对话框资源的启发。 - Premature Optimization
显示剩余8条评论
2个回答

14
您可以使用来自GExpertsComponentsToCode函数。

不使用批处理模式,而是将所选控件复制到剪贴板中。 - MX4399
5
但是这些来源应该使得将其转化为批量模式转换器变得容易。 - Rudy Velthuis
1
请注意,GExperts 无法处理每一个控件。但大多数都可以正常工作。 - dummzeuch

0

虽然有些困难,但我已经找到了解决方案。

首先,在Delphi中使用表单编辑器设计一个表单模板,然后编写代码生成与您设计的布局相同的 .dfm 文件。

例如,我们可以导出在模板中创建的带标签的编辑框。

var Component: integer;
For Component := 0 to Form1.ComponentCount -1 do
begin
  if Form1.Component[Component] is TEdit then 
       ExportEditToMemo
  else 
  if Form1.Component[Component] is TLabel then 
       ExportLabelToMemo

...
//all components kind you want
end;

我只是展示了一段代码来实现这个布局

class procedure TTemplateFormatter.ExportLabel(ALabel: TLabel; ALines: TStrings);
begin
  ALines.add(format('  object %s: %s', [ALabel.Name, ALabel.ClassName]));
  ALines.add(format('    Left = %d', [ALabel.Left]));
  ALines.add(format('    Top = %d', [ALabel.Top]));
  ALines.add(format('    Width = %d', [ALabel.Width]));
  ALines.add(format('    Height = %d', [ALabel.Height]));
  ALines.add(format('    Caption = ''%s''', [ALabel.Caption]));

  if Not ALabel.ParentFont then
  begin
    ALines.add(format('    Font.Charset = DEFAULT_CHARSET', []));
    ALines.add(format('    Font.Color = clWindowText', []));
    ALines.add(format('    Font.Height = %d', [ALabel.Font.Height]));
    ALines.add(format('    Font.Name = ''%s', [ALabel.Font.Name]));
    ALines.add(format('    Font.Style = []', []));
    ALines.add(format('    ParentFont = False', []));
  end;
  ALines.add(format('  end', []));

完整源代码请查看以下链接:https://github.com/ricardodarocha/DfmGenerator - user6695319

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