Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Forms 如何在窗体之前检查它是否是模态的';什么画?_Forms_Delphi - Fatal编程技术网

Forms 如何在窗体之前检查它是否是模态的';什么画?

Forms 如何在窗体之前检查它是否是模态的';什么画?,forms,delphi,Forms,Delphi,我的一些表单可以显示为普通表单和模态表单。 如果它们显示为模态形式,我必须隐藏一些在模态状态下不可用的组件 if(fsModal in Self.FormState) then begin //hiding some components... end; 我希望在绘制表单之前执行我的代码,以避免不必要地绘制更多次。我认为在表单可见之前执行OnShow,但似乎不是这样。所以你可以这样做: TMyForm = class( TForm ) // this will already be i

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

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

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

我认为在表单可见之前执行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;

您不能以相同的方式替代“显示”-您必须替代“可见”属性,以便更轻松地重置组件的可见性,如图所示。

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

(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;
您可以通过参数调用表单。对于模态形式为True,对于诺模形式为False:

(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中编写并测试了这个示例。

问题中的代码有什么问题?你还没有找到答案吗?我个人认为这是错误的。我会在表单中添加一个定制方法来显示它。作为参数传递给该方法是以模态方式显示还是以非模态方式显示。在调用
Show
showmodel
之前,在该方法中采取适当的操作。在何处执行此操作?在OnShow活动中?因为那是你需要它的地方,我想。你就是那个展示表格的人。所以在你展示表格之前,做你需要做的任何事情。然后执行
showmodel
。将代码放在
OnShow
处理程序中有什么坏处?在任何情况下,我都会按照上面描述的方式来做。你不需要把所有的事情都安排在活动中。您可以向类中添加方法。而表单只是一个类。@DavidHeffernan:过去我在OnShow中遇到过由代码引起的图形问题。首先。。如果我能做一次,为什么我要画两次表格?在我看来,这是一件不可接受的事情。