6

TCustomForm.FormStyleに関する Delphi のドキュメントには、「実行時に FormStyle を変更することはお勧めできません」という注記が追加されています。

実行時にフォームスタイルを変更することが推奨されない理由を知りたいです。ユーザー インターフェイスの観点からお勧めできませんか、それとも技術的な問題が発生する可能性がありますか? 実行時にフォームスタイルを変更すると、どのような問題が発生する可能性がありますか?

使用事例

MDI アプリケーションのマルチ モニター サポートを改善したいと考えています。現在、すべての子ウィンドウはメイン ウィンドウ (MDI 親ウィンドウ) 内で開かれます。ユーザーが望むのは、子ウィンドウをメイン ウィンドウの外に開いたり移動したりして、子ウィンドウが Windows デスクトップのどこにでも配置できる別のフローティング ウィンドウとして開かれるようにすることです。

Adobe Photoshop、Google chrome、および Microsoft Internet Explorer でこの機能の例を見てきました。(タブはタブバーから移動でき、別のフローティング ウィンドウで開きます)

4

2 に答える 2

9

FormStyle実行時に をfsNormalからfsMDIformまたはに変更するにfsMDIChildは、ウィンドウ ハンドルを再作成する必要があり、フォーム上のすべてのコントロールのすべてのウィンドウ ハンドルを再作成する必要があります。それが発生した場合、Delphi の制御の及ばないことがたくさんあります。Windows コントロールに依存するサード パーティ コントロールを使用しているのに、サード パーティ コントロールがその状態を保存する方法を知らない可能性があります。Window ハンドルが再作成されると、ユーザーはすべての作業を失います。

幸いなことに、この問題を回避できます。

  • MDI の使用をやめ、すべてのウィンドウを「フローティング」にして、別の方法で処理してください。MDI は、しばらくの間、時代遅れになっています。
  • あなたが持っているコントロールの種類によっては、うまくいくかもしれません。そうでない場合は、何が問題なのかを確認して回避します (例: 一部のコントロールの状態を自分で保存し、スワップ後に復元する必要がある場合があります)。
  • すべてをフレームに入れてみてください。ユーザーが移動したい場合は、新しい空の非 MDI/MDI フォームを作成し、フレームを再ペアレント化して、古いフォームを破棄します。
于 2013-02-14T10:08:07.967 に答える
7

ほとんどの場合、フォーム スタイルの変更によってウィンドウ ハンドルが再作成されるためです。これにより、すべての子ウィンドウのハンドルも強制的に再作成されます。

ウィンドウの再作成は、一般に、気付かないうちに発生する可能性があります。しかし、再作成に問題があるコントロールがあります。たとえば、過去にツールバーコントロールでこれに苦しんでいました。最近のバージョンの Delphi は、再作成に対してより回復力があります。

于 2013-02-14T10:03:30.303 に答える