Delphi DFM文件中的奇怪[数字] – 起源和必要性?

前端之家收集整理的这篇文章主要介绍了Delphi DFM文件中的奇怪[数字] – 起源和必要性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要将一个包中定义的大量Delphi组件更改为另一个包中的类似组件。
大多数grunt工作可以通过替换DFM文件中的文本(组件类型和属性)来完成 – 保存为文本当然。

我已经搜索Stackoverflow和谷歌和我现在调整Felix Colibri DFM解析器从http://www.felix-colibri.com/papers/colibri_utilities/dfm_parser/dfm_parser.html

我在DFM文件中遇到了解析器阻塞的“特性”:[number] s在类型规范之后,如下所示:

inherited DialoogEditAgenda: TDialoogEditAgenda
  ActiveControl = PlanCalendar
  Caption = 'Agenda'
  [snip]
  inherited PanelButtons: TRzPanel
    Top = 537
    [snip]
    inherited ButtonCancel: TRzBitBtn [0]  <== *here*
      Left = 852
      [snip]
    end
    object CheckBoxBeschikbaarheid: TRzCheckBox [1]  <== *here*
      Left = 8
      [snip]
    end
    inherited ButtonOK: TRzBitBtn [2]  <== *here*
      Left = 900
      [snip]
    end
  end
  inherited PageControl: TRzPageControl
    Left = 444
    [snip]
  end
  object PanelBeschikbaarheid: TRzSizePanel [2]  <== *here*
    Left = 967
    [snip]
  end
  object PanelScheduler: TRzPanel [3]  <== *here*
    Left = 23
    Top = 22
    [...]

许多这些DFM是严重继承的(我不得不改编Colibri的代码已经),但一个小的测试应用程序继承无法生成DFM中的[数字]。

我的问题之前不必扩展解析器代码:有谁知道这些[数字]从哪里来,因此,我可以在解析DFM文件之前删除它们吗?

谢谢

Jan

解决方法

这些数字并不完全无用。假设你有TA,TB和TC类,TB和TC都来自TA。 DFM看起来像:
object A: TA
  object X: TX
  end
end

inherited B: TB
  object Y: TY
  end
end

inherited C: TC
  object Y: TY [0]
  end
  inherited X: TX [1]
  end
end

B和C的不同之处在于它们的X和Y子组分的顺序相反。子组件顺序的确切含义取决于组件(见下文),但最显着的是,如果它们是TWinControl后代,或者它们都是不是从TWinControl派生的TControl后代,这意味着它们在X是否显示在Y ,或Y在X上。

删除这些数字可能会改变形式,所以你不应该盲目地做。但是,根据您的目标,您可以修改解析器(源代码似乎可用),以便跳过数字。

组件的相对顺序通常通常不重要,但是有一些例外。更详细地解释:

对于正常控件,子组件开始于(1)不从TWinControl派生的TControl子体,然后(2)TWinControl子体,最后(3)任何非TControl组件。在每个组件中,组件的相对顺序是可调的:对于控件,“Bring to front”和“Send to back”尽可能远地移动控件,限制是非TWinControl永远不能放在TWinControl。对于非控件,(略有误称)“创建订单”选项允许您更改订单。所以,假设你有两个标签(A和B),两个编辑控件(C和D),一个数据集和数据源(E和F),你可以得到的顺序是例如ABCDEF,BACDEF,ABDCFE ,但不是ACBDEF。

保存到DFM文件时保留该顺序:当不使用可视继承时,组件只是按顺序保存和重新加载。当你使用继承时,DFM文件得到处理基地派生,所以在上面的情况下,当创建TC时,它的X成员总是在它的Y成员之前创建。需要[0]和[1]来告诉Delphi RTL修正顺序,在那些组件顺序很重要的情况下。

组件顺序实际上取决于组件类型。由于“带到前面”/“发送回”名称建议,控件使用组件顺序指定Z顺序。对于其他组件类型,它意味着组件想要的意思。例如,菜单可以使用组件顺序来指定其菜单项的顺序(从上到下)。工具栏控件可以使用组件顺序来指定工具栏按钮的顺序,即使这些工具栏按钮本身不是控件。数据集使用组件顺序来指定字段顺序,从而也指定TDBGrid中列的默认顺序。

猜你在找的Delphi相关文章