簡體   English   中英

取消/中止在Delphi / C ++ Builder中創建新表單?

[英]Cancel / abort creating a new form in Delphi / C++Builder?

有沒有辦法從窗體的OnCreate事件處理程序或C ++ Builder構造函數中取消或中止表單創建?

基本上,我希望能夠從OnCreate或構造函數中調用Close()並讓它完全跳過顯示表單。 我有幾種形式,作為初始化的一部分可能會確定它們根本不應該顯示。 (我意識到我可以拆分初始化的這一部分或者從調用表單或類似的內容中添加額外的檢查,但是如果有辦法從OnCreate或構造函數中干凈地完成所有這些操作,那么這似乎是最簡單的。)

編輯:回應一些評論,一些不顯示的邏輯是UI邏輯而不是業務邏輯; 表單可能會在顯示之前顯示確認,或者它可能使用公共對話框來獲取表單的輸入,然后在用戶取消該對話框時中止。 (其中一些是業務邏輯,需要重構,但通常很難找到時間來重構所有需要它的東西。)

您始終可以在OnCreate處理程序中調用Release ,但這會導致表單快速顯示然后被關閉。 不是很專業的事情。

所以這是另一個想法。 讓表單具有公共函數或屬性,以返回它們實際上是否顯示。 然后你通常會有

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

你將會擁有

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

話雖如此 - 任何其他編碼方式(所以你不創建一個會被立即銷毀的形式)肯定會更好。 特別是如果你想在UI和業務層之間保持清晰的分離,那么讓代碼決定是否在表單之外顯示表單會更好。 只有在做出決定后才能創建表單。

我認為甚至不必首先創建表單要好得多。 如果您正在執行一些確定表單甚至不需要的邏輯,並且該邏輯包含對表單重要的狀態,則將邏輯重新分解為單獨的對象(甚至是數據模塊)並傳遞對象作為財產的形式。 這是一個簡單的例子(使用對象方法):

單元1

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

單元2

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;

然后你的代碼中的某個地方,你想要確定你是否應該顯示你的gui或不使用如下的內容:

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;

這也假設表單不在自動創建列表中,需要以模態顯示。

在構造函數中使用Abort 它提出了一個無聲的例外。 如果對象在構造函數中有異常,則調用析構函數並釋放內存。 如果不添加異常處理代碼,則Abort的優點是您不必擔心顯示異常對話框。

添加一個在需要時返回實例的類函數。 然后確定是否應該顯示表單的方法仍然在該類中,但是它可以確定在實際構造表單之前是否有必要。 將其稱為“CreateIfNeeded”,它將像構造函數一樣工作,但如果不需要,則不會實際構造表單。 最小的代碼更改和最大的靈活性。

只需在OnCreate中引發異常。 您還需要重新定義HandleCreateException方法的行為(默認情況下顯示錯誤消息,而不是取消創建)。

我會覆蓋ShowModal

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM