【问题标题】:How to check if a form is modal before it's drawn?如何在绘制之前检查表单是否是模态的?
【发布时间】:2016-08-23 13:27:23
【问题描述】:

我的一些表单既可以显示为普通表单,也可以显示为模态表单。 如果它们显示为模态形式,我必须隐藏一些在模态状态下无用的组件。

if(fsModal in Self.FormState) then
begin 
  //hiding some components...
end;

我想在表格绘制之前执行我的代码,以避免不必要地绘制更多次。

【问题讨论】:

  • 问题中的代码有什么问题?你不是已经找到答案了吗?就个人而言,虽然这感觉不对。我会在表单中添加一个定制的方法来显示它。作为参数传递给该方法是否显示模态或非模态。在调用ShowShowModal 之前,在该方法中采取适当的操作。
  • 这是在哪里执行的?在 OnShow 活动中?因为那是你需要它的地方,我想。
  • 您是显示表单的人。因此,在您显示表单之前,请执行您需要做的任何事情。然后做ShowModal.
  • 将代码放在OnShow 处理程序中的缺点是什么?无论如何,我会按照我上面描述的方式来做。您不需要将所有内容都放入事件中。您可以向您的类添加方法。而表单只是一个类。
  • @DavidHeffernan:过去我遇到过由 OnShow 中的代码引起的图形问题。最重要的是..如果我可以画一次,为什么还要画两次?从我的角度来看,这是一件不可接受的事情。

标签: forms delphi


【解决方案1】:

我以为 OnShow 在窗体可见之前执行,但似乎并非如此。所以你可以这样做:

TMyForm = class( TForm )  // this will already be in your source
public
  function ShowModal: Integer; override;
end;

function TMyForm.ShowModal: Integer;
begin
  // hide some components
  Result := inherited;
  // show them again in case next time it is a Show
end;

您不能以相同的方式覆盖 Show - 您必须覆盖 visible 属性,这样更容易重置组件的可见性,如图所示。

【讨论】:

    【解决方案2】:

    您可以为两种类型的显示编写一些初始程序:

    (in Form)
    procedure TfrmForm01.Init(p_Modal: Boolean);
    begin
      if p_Modal then
        begin
          edtForModalForm.Visible := False;  // hide some components
          ShowModal;
        end
      else
        Show;
    end;
    

    你可以通过参数调用表单。模态为真,无模态为假:

    (In main program)
    procedure TForm1.btnShowFormClick(Sender: TObject);
    var
      v_F : TfrmForm01;
    begin
      v_F := TfrmForm01.Create(self);
      v_F.Init(True);
    end;
    
    procedure TForm1.btnShowModalFormClick(Sender: TObject);
    var
      v_F : TfrmForm01;
    begin
      v_F := TfrmForm01.Create(self);
      v_F.Init(False);
    end;
    

    我在 Delphi7 中编写并测试了这个示例。

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 2021-03-23
      • 2019-05-15
      • 2012-05-05
      • 2020-10-03
      • 2015-12-17
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多