Delphi XE中的“保持在上面”的主窗体和模态对话框

前端之家收集整理的这篇文章主要介绍了Delphi XE中的“保持在上面”的主窗体和模态对话框前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Delphi XE Update 1中,如果父(主)窗体的FormStyle设置为fsStayOnTop,我将会看到模态窗体的随机行为.

1)使用MainFormOnTaskbar:= False(旧的方式),所有的“只是工作”.使用新的MainFormOnTaskbar:= True,当主窗体设置为“保持在顶部”时,模态窗体将隐藏在主窗体的后面.在大多数情况下说

modalForm.PopupParent := self;

就在调用modalForm.ShowModal之前似乎有所帮助.但不总是.

2)所有我的模式都是简单的,没有装饰,位于MainFormCenter,不使用表单继承等.但是PopupParent修复程序只适用于大约一半,而另一半仍然隐藏在主窗体之后.最奇怪的是,在一种情况下,不相关的代码行的排序中断或使其生效.参见本代码标记为(1)和(2)的行:

procedure TEchoMainForm.DBMaintenancePrompt( actions : TMaintenanceActions );
var
  frm : TDBMaintenanceForm;
begin
  frm := TDBMaintenanceForm.Create( self );
  try
    frm.Actions := actions; // (1)
    frm.PopupParent := self; // (2)
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;

当按此顺序执行时,模态窗体正确显示在主窗体的顶部.但是当我扭转线路时,模态形式隐藏在主体之后.标记为(1)的行设置了模态窗体的属性,这导致在TRzCheckGroup中未选中的多个复选框被选中,该TRZCheckGroup位于TRzPageControl(来自Raize组件)上.这是当上面的行(1)执行时运行的setter方法

procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions);
var
  ma : TMaintenanceAction;
begin
  for ma := low( ma ) to high( ma ) do
    cgMaintActions.ItemChecked[ ord( ma )] := ( ma in Value );
  end;
end;

如果行(1)和(2)的顺序相反,这足以显示主窗体后面的模态.

这可能指向TRzCheckGroup(当setter代码运行时被操纵),但是我有两个其他表单显示相同的问题,不要使用TRzCheckGroup(或TRzPageControl).并且我无法使用Raize组件复制一个单独的示例应用程序的问题.在setter的持续时间内禁用表单,pagecontrol或TRzCheckGroup不起作用.

它似乎不是一个时间问题,因为当模态窗体显示隐藏一次,它总是.行为的改变仅来自重新排列代码行.

3)最后一个观察:我的模态形式相当简单,所以他们立即显示,没有明显的延迟.但是当主窗体是fsStayOnTop时,我经常可以看到模式窗体显示在它的顶部,然后看到它被“推”在后面.然后,在击中Esc时,(隐形)模态形式显示在主窗体的顶部几秒钟,然后关闭.

要么是我错过了事后看起来很明显的东西,要么是这个调用心理的调用,我不知道.有什么想法吗?

UPDATE.我试图跟踪发生在另一个表单上的问题.它有几个按钮(Raize)和一个TSyntaxMemo(来自eControl.ru的增强备忘录组件).这种形式与遇到问题的其他形式几乎没有任何共同之处.在删除部分代码和测试后,现在可以通过在将备注组件分配字符串的方法中进行微小更改来重现此问题:

这是我的原始代码,它导致包含编辑器的表单隐藏在主窗体后面:

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := Value;
end;

当我将作业更改为空字符串时,表单正确显示

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := ''; // CRAZY! Problem goes away
end;

当我向编辑器分配一个字符时,表单将再次隐藏:

procedure TEditorForm.SetAsText(const Value: string);
begin
  Editor.Text := 'a'; // Problem is back
end;

当然,另外两个有问题的表单不使用这个编辑器组件或其任何单元.

我已经尝试删除备忘录控件并再次添加(创建订单等),但没有任何效果.如果我在代码中创建备忘录,则相同.只要非空字符串分配给备忘录的Text属性,表单就会隐藏.

解决方法

前几天我也有同样的问题.我的解决方案是添加一个Self.BringToFront;到模式形式的OnShow事件.

猜你在找的Delphi相关文章