代码之家  ›  专栏  ›  技术社区  ›  Josh Kelley

在Delphi/C++Builder中取消/中止创建新表单?

  •  4
  • Josh Kelley  · 技术社区  · 15 年前

    是否有任何方法可以从表单的OnCreate事件处理程序或C++Builder构造函数中取消或中止表单创建?

    编辑:

    6 回复  |  直到 15 年前
        1
  •  9
  •   mghie    15 年前

    Release OnCreate

    TheForm := TSomeForm.Create(Self);
    TheForm.Show;
    

    TheForm := TSomeForm.Create(Self);
    if TheForm.ShouldAppear then
      TheForm.Show
    else
      TheForm.Release;
    

    话虽如此,任何其他的编码方式(这样你就不会创建一个会立即被销毁的表单)肯定会更好。特别是如果您希望在UI和业务层之间保持清晰的分离,那么最好使用代码来决定是否在表单外部显示表单。只有在做出决定后才创建表单。

        2
  •  7
  •   Argalatyr Rodrigo    15 年前

    我认为一开始就不必创建表单会更好。如果您正在执行一些逻辑,确定表单甚至不是必需的,并且该逻辑包含对表单很重要的状态,则将该逻辑重新分解为单独的对象(甚至是数据模块),并将该对象作为属性传递给表单。下面是一个简单的示例(使用对象方法):

    type
      TOFormTests = class
        fStateData : string;
      public
        function IsForm1Needed( someparam : string) : boolean;
        property StateData : string read fStateData write fStateData;
      end;
    

    第二单元

    uses
      : 
      UNIT1;
    
    type
      TForm1 = class(tForm)
      :
      procedure SetFormTests(value : tOFormTests);
      property FormTests : TOFormTests read fFormTests write SetFormTests;
    end;
    
    procedure SetFormTest(Value:TOFOrmTests);
    begin
      fFormTests := Value;
      // perform gui setup logic here.
    end;
    

    var
      Tests : TOFormTests;
    begin
      tests := tOFormTests.create;
      try
        if Tests.IsForm1Needed('state data goes here') then
          begin
            Form1 := tForm1.create(nil);
            try
              Form1.FormTests := Tests;
              if Form1.ShowModal = mrOk then
                // handle any save state logic here.
              ;
            finally
              FreeAndNil(Form1);
            end;
          end;
      finally
        freeAndNil(Tests);
      end;
    end;
    

        3
  •  6
  •   Jim McKeeth    15 年前

    使用 中止 在构造函数中。它引发了一个无声的例外。如果对象在构造函数中有异常,则调用析构函数并释放内存。Abort的优点是,如果不添加异常处理代码,则无需担心会显示异常对话框。

        4
  •  4
  •   Jim McKeeth    15 年前

    添加一个在需要时返回实例的类函数。然后,确定是否应显示表单的方法仍在该类中,但它可以在实际构造表单之前确定是否有必要。像“CreateIfRequired”一样调用它,它将像构造函数一样工作,但如果不需要它,它实际上不会构造表单。代码更改最少,灵活性最大。

        5
  •  2
  •   Alex    15 年前

    只需在OnCreate中引发一个异常。 您还需要重新定义HandleCreateException方法的行为(默认情况下是显示错误消息,而不是取消创建)。

        6
  •  0
  •   Anton Duzenko    6 年前

    function TfHtmlEditor.ShowModal: Integer;
    begin
      if TabControl1.Tabs.Count=0 then
        Result := mrAbort
      else
        Result := inherited;
    end;