Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使用TControl.Align:=alCustom?_Delphi_Layout - Fatal编程技术网

Delphi 如何使用TControl.Align:=alCustom?

Delphi 如何使用TControl.Align:=alCustom?,delphi,layout,Delphi,Layout,简单的问题。我有一个由3个组件组成的面板。它们都有Align:=好的。 但问题是,在运行时,它们的顺序与设计时间不同 我可以改为使用alCustom在右边边界强制执行订单吗? 我使用D2007。是的,您可以进行任何类型的自定义对齐。只需使用控件的OnAlignInsertBefore()和OnAlignPosition()事件。(它们存在于Delphi 2007中,但尚未发布,因此不会出现在对象检查器的“事件”选项卡中;您仍然可以在代码中分配它们。我在下面展示了原型;它们记录在TAlignIns

简单的问题。我有一个由3个组件组成的面板。它们都有Align:=好的。 但问题是,在运行时,它们的顺序与设计时间不同

我可以改为使用alCustom在右边边界强制执行订单吗?
我使用D2007。

是的,您可以进行任何类型的自定义对齐。只需使用控件的OnAlignInsertBefore()和OnAlignPosition()事件。(它们存在于Delphi 2007中,但尚未发布,因此不会出现在对象检查器的“事件”选项卡中;您仍然可以在代码中分配它们。我在下面展示了原型;它们记录在TAlignInsertBeforeEvent和TAlignPositionEvent下的帮助文件中;您还可以看到CustomAlignInsertBefore和OralignInsertBefore。)

文档中对这两种方法的参数都有很好的描述

在Delphi 2010中,这些事件将发布并显示在对象检查器的“事件”选项卡中


我从没见过你的问题,不过。。。您是否尝试过将它们全部设置为alNone,将它们从右边缘移开,然后重新设置Align:=按您希望它们出现的顺序排列?

请看一下从中的演示2。

您手头没有透露太多问题,但我会看一看流程面板

在flowpanel上放置控件时,会“自动”显示新的订单属性。可以设置控件的流动方式,如果需要控件之间的空间,可以设置每个控件的边距


稍微澄清一下:新的“order属性”实际上被称为“ControlIndex”,它将出现在对象检查器的底部。

Oh!我经常看到这种情况发生。当您有TSplitter实例“切换”到表单的远端时,这尤其愚蠢,实际上禁用了它们。过去我总是用额外的Tpanel和锚定来解决这个问题。我不得不采用Ken的建议,将对齐设置为“无”,然后按照您希望的顺序将它们设置为“右”。我想补充一点,你必须把它们从右手边移到足够远的地方。假设表单上有两个组件:RightControl(右对齐)和NoneControl(无对齐)。如果NoneControl.Right>RightControl.Right,则更改NoneControl.align:=OK将使其位于RightControl的右侧。因此,我将它们全部设置为负数(例如,在表单创建中),然后将对齐设置为右侧。最新的Delphi 2007版本也会发布这些事件。(不知道这是从一开始还是通过更新添加的。)通过操纵这些控件的可见性,在设计时和运行时可能会出现不同顺序的问题。虽然我还没有尝试过,但这似乎是最好的解决方案(更少的编码)。现在我尝试了,但没有成功。我在FlowPanel中添加了3个按钮,但在面板上看不到任何order属性。我误解你了吗?我想我有点不明白。“order”-属性名为“ControlIndex”,将显示在对象检查器的底部。好的,我找到了它。这是一种很好的方式,可以强制为组件订购特定的订单。到目前为止,我已经使用了alLeft、OK、alClient等,但组件数量有限。好!!
TAlignInsertBeforeEvent = function(Sender: TWinControl; 
  C1, C2: TControl): Boolean of object;

TAlignPositionEvent = procedure(Sender: TWinControl; Control: TControl;
  var NewLeft, NewTop, NewWidth, NewHeight: Integer;
  var AlignRect: TRect; AlignInfo: TAlignInfo) of object;