0

それは私にとって非常に実用的な解決策のように見えますが、私は悪いかもしれない何かを支配しているのだろうかと思っています...

ユーザーがウォークスルーする必要のある2つのフォームがあります。ユーザーがボタンをクリックすると、form1がポップアップします。ユーザーが[OK]を押すと、2番目のポップアップが表示されます。ユーザーがもう一度[OK]をクリックすると、画面が消えます。または、ユーザーが[再試行]をクリックすると、画面が最初の画面に戻ります。2つの画面は完全に異なるサイズで、情報が異なります。

だから私はこのコードを思いついた:

  Form1 := TForm1.Create(SharedData);
  Form2 := TForm2.Create(SharedData);
  repeat
    ModalResult := Form1.ShowModal;
    if (ModalResult = mrOK) then ModalResult := Form2.ShowModal;
  until (ModalResult <> mrRetry);
  Form1.Release;
  Form2.Release;

私はこのコードをテストしましたが、それは魅力のように機能しているようです。このコードでは、SharedDataは、両方のフォームによって操作されるデータを含むオブジェクトです。2つのフォームを作成する前にこのオブジェクトを作成し、ModalResult == mrOKの場合は、データをデータベースに書き戻すだけです。

問題は、これは2つのフォーム間の反転を処理するためのクリーンなソリューションだと思いますが、このような構造を以前に見たことはありません。もちろん、私は天才です。(少なくとも、Egoは私にそう言っています。)しかし、このコードを使用することに反対する何かがあるのでしょうか、それとも問題ないのでしょうか。

4

2 に答える 2

2

コードが想定どおりに機能する場合は、問題ないと思います。私も以前にそのようなものを見たことがありませんが、それが何をしているのかはかなり明白です...私の本では、他の人の仕事を盲目的にフォローするよりもはるかに優れています。:-)

于 2009-09-24T12:46:20.987 に答える
1

コードに問題はありません。ただし、SharedDataを両方のフォームのコンストラクターに渡すことには疑問があります。コンストラクターをオーバーライドしていない限り(reintroduceも使用)、TForm.Create()への引数は所有者を受け入れます。その所有者は、所有するオブジェクトを解放する責任があります。自分で解放するので、所有者を割り当てる必要はありません。Create()の呼び出しにnilを渡すだけで、参照を保存したり、参照を削除するために解放されたときに所有オブジェクトのリストにアクセスしたりするオーバーヘッドを回避できます。

また、Releaseは、ボタンクリックイベントなど、コントロール自体のイベントハンドラー内から呼び出されるように設計されています。AVを回避するために、コントロールが実際に解放される前に、保留中のすべてのメッセージが処理されるようにします。イベントハンドラー内で使用していないため、これをそのまま使用すると、不要なオーバーヘッドが追加されます。Form1.Freeを安全に使用できます。代わりは。

リリースの使用を明確にするために、フォーム自体のコードで使用するためのものです。たとえば、フォームにボタンがあり、そのボタンをクリックしてフォームを解放する場合は、リリースを使用します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Release;
  Close;
end;

これにより、ボタンをクリックしてフォームを解放できますが、その後のCloseの呼び出しが最初に実行されるようになります。上記のリリースの代わりに無料を使用すると、存在しないForm1でCloseを呼び出すことになります。(上記のコードの愚かさのために、それでも問題ない可能性があります。フォームは引き続きメモリに常駐します。ただし、それでも悪い考えです。)

于 2009-09-24T14:05:39.453 に答える