大多数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
解决方法
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中列的默认顺序。