4

ウィンドウレス コントロールは魔法ではないことを知っています。ウィンドウレス コントロールは、入力フォーカスを持つことができます (例: Internet Explorer)。入力フォーカスは描画にすぎません:

ユーザーがキーを連打し始めると、適切に反応します。コントロールにフォーカスがあるため、キーストロークはそのフォーカスされたコントロールを対象としていることがわかります。

私の (Windows®) ウィンドウの場合、ウィンドウのない子コントロール (TGraphicControl の子孫であるとしましょう) がキーボード イベントを取得することを知っておく必要あります。したがって、フォームのOnKeyDown, OnChar,の間OnKeyUpに、ウィンドウのない子コントロールに移動するふりをする必要があります。

私ができることですが、それは苦痛です。

しかし、その場合、ユーザーはおそらくナビゲーションを使用したいと思うでしょうTabそして、Delphi の通常のタブ コントロールの順序処理を何らかの方法でインターセプトし、これがタブ オーダーの次 (および前) であると自分自身にフックする必要があります。

私ができることですが、それは苦痛です。

そして、ActiveControl以外は何も理解しない がありTWinControlます。そのため、Delphi が誰がフォーカスを持っているかを突き止めようとすると、おかしくなってしまいます。したがって、ActiveControl の代替実装が必要になります。

私ができることですが、それは苦痛です。

言い換えれば、これはあまりにも多くの仕事ですか?私は Delphi のすべてと戦っていますが、キーボード入力で数十個のウィンドウレス コントロールにアクセスできるようにするためですか? Delphi の設計者は、対話型のウィンドウレスコントロールを使用することを考えたことはありませんでした。

Delphi は喜んで私を助ける機会を与えてくれましたが、私は痛みの道を選びました。


ウィンドウレス コントロールについては、さらに説明が必要です。

対話するすべてのコントロールが Windows コントロールである必要はありません。Windows ウィンドウではないコントロールにフォーカスし、キーボード入力を送信することは十分に可能です。

たとえば、Internet Explorer ブラウザー ウィンドウに表示されるほとんどすべてのコントロールは、ウィンドウのないコントロールです。次のスクリーンショットでは、入力できる編集コントロールと、(このスクリーンショットでは) フォーカスのあるボタンを確認できます。

代替テキスト

点線のフォーカス四角形が表示され、ボタンは青みがかっています (Windows では、フォーカスがあることを示します)。

ボタンにフォーカスがあるときに押すとSpacebar、ボタンが押されます。これが機能する理由は、Microsoft がコントロールのウィジェット ライブラリ全体を作成したためです。これらのコントロールのルック アンド フィールは、通常のコモン コントロールと (ほぼ) まったく同じです。適用されるテーマに至るまで、Windows コモン コントロールのほぼ正確なクローンです。Google Search

Mozilla Firefox と Google Chrome も、コントロールのウィジェット ライブラリを使用します。Microsoft の組み込みのウ​​ィンドウ コントロールは使用せず、代わりにグラフィカルでインタラクティブなウィンドウレスウィジェットのライブラリを使用します。

また、適切な開発環境があれば、ウィンドウのないウィジェットは「通常の」ウィンドウ コントロールと同じように機能します。GTK+ はウィジェット ライブラリであり、Glade はそのウィジェット ライブラリでコントロールをレイアウトできる IDE です。

Firefox、Chrome、Blender がどの開発環境で作成されたかはわかりませんが、それらのウィジェットはウィンドウレス コントロールをサポートしています。


それでは、私の質問に移ります。

私が間違っていない限り、Delphi はベースTControl(幅、高さを持ち、それ自体をペイントできる) をサポートしていますが、キーボード フォーカスを受け取ることができないようです。Borland が Delphi の VCL を汎用ウィジェット ライブラリとして設計したことはないように思えます。これをサポートする唯一の証拠は、フォームActiveControlが TWinControl であることです。

property ActiveControl: TWinControl;

これは、Delphi がウィンドウ コントロールに限定される可能性がある、または限定されなければならないという意味ではありません。VCL ウィジェット ライブラリは、ウィンドウのないコントロールにフォーカスを与えることをサポートするように拡張できます。

しかし、おそらくDelphi はすでに windowless controls をサポートしていますが、私はそれを認識していませんか? にフォーカスを与えることをサポートするために、Delphi にはすでに確立されたメカニズムがありTControlますか? しかし、私はそれなりに賢い人間であり、Delphi の VCL は他のウィジェット ライブラリでできることを実行できないと確信しています。

これは別の質問につながります:フォームをサブクラス化し、それをサポートするためにどれだけの作業が必要になるでしょうか? チームBの誰かで、私よりずっと賢く、すでにそれを試して、不可能であるという結論に達した人はいますか?

ウィンドウレス コントロールのサポートを追加しようとするのが不可能に近い場合 (つまり、無駄な場合)、何週間も無駄に費やさないように、今、前もって質問しています。Delphi 開発者のコ​​ミュニティの知識を利用しようとしています。

私は質問をしています。

4

7 に答える 7

4

ウィンドウレスコントロールを構築してDelphiのVCLフレームワークに適合させるのは無駄です

例としてInternetExplorerを取り上げます。しかしその場合、それはそれに存在するすべてを完全に担当します。アクティブコントロールとは何かという独自の内部概念がありますが、外部から見るとどのように見えるかを考えてください。これは1つの巨大なコントロールにすぎません。OSにフォーカスがあるものを尋ねると、ブラウザのサブコントロールのどれにフォーカスがあるように見えても、単一のブラウザコントロールにフォーカスがあります。

Tabキーを押すと、編集コントロールと同じように、ブラウザがタブ文字を消費したかのようにOSに表示されます。編集コントロールは、カーソルをいくつかのスペースに移動し、タブ文字を内部バッファーに追加します。ブラウザコントロールは、カーソルをディスプレイの別の領域に移動します。

あなたはDelphiTFormでこれらすべてを行うことを考えています。Delphiフォームには、アクティブコントロールを管理し、キーストロークを処理するためのフレームワークがすでにあり、すべてと戦う必要があります。ウィンドウレスコントロールが必要な場合は、Internet Explorerルートに移動し、それらを保持する独自のコンテナーコントロールを作成して、その内部で発生するすべてのことを引き続き管理できるようにします。

コンテナーをVCLコントロールにすることはできますが、コンテナーに配置することはおそらくできません。コンテナーは、VCLのフォーカスおよびキーボード処理ルールを使用することを期待しています。InternetExplorerに通常のWindowsコントロールを配置できないことにも注意してください。そこに置くものはすべて、特定のActiveXインターフェイスを経由する必要があります。インターフェイスも必要になるかもしれません。あるいは、コンテナで動作するように設計した特別な祖先クラスから派生した独自のコントロールクラスのセットを作成することもできます。で始めないでくださいTGraphicControl; VCLに定着しすぎているため、分派制御ライブラリの基盤として使用できません。

大変な作業になりますが、InternetExplorerも同様です。

于 2010-02-23T15:49:55.717 に答える
4

はい、それは無駄です。
Delphi のせいではありません。Windows 自体と戦っているだけです。
ウィンドウ コントロールのように動作するコントロールが必要な場合は、ウィンドウ コントロールを使用します。
その通りです。ウィンドウ化されたコントロールの API スタック全体をゼロから再作成しようとするのは大変です。

于 2010-02-23T07:50:33.470 に答える
3

うん、あなたはほとんどそれを理解しています。ウィンドウのないコントロールを使用すると、Windows がユーザーを支援するためにできることはすべて失われます。1つの実際のウィンドウに2つ以上あるのは苦痛です。

于 2010-02-23T03:28:04.203 に答える
1

これらのプログラムのほとんどは、もともとRADタイプのツールを使用して開発されたものではない可能性が高いため、車輪の再発明を行うしかありませんでした。Delphiの最大の利点の1つは、必要な外観を提供するための深いVCLおよびサードパーティコンポーネントのサポートです。

複雑な(税務準備)フォームベースのアプリケーションで使用されるウィンドウハンドルの量を減らすために私が大成功を収めた手法の1つは、キャンバスにテキストを描画し、単一のTCustomEdit子孫をユーザーが編集している位置に移動することでした。TAB / Up / Downキーをキャプチャして、編集を適切な位置に移動するのは簡単でした。私たちが発見した課題は、マウスのホバーフィールドの周りにホットな長方形を描くことでした。最終的に、TObjectのグリッド配列になりました。配列要素はnil(フィールドなし)、TLIst(グリッドには複数のフィールドが含まれます)、またはフィールド記述子を含むクラスになります。これにより、ボックスに含まれるフィールドが1つ、または最大で4つである可能性が高いため、実行する必要のある範囲チェックの量が削減されました。

于 2010-02-23T17:08:31.937 に答える
1

fpGUI Toolkitは、必要なものの例です。ソース コード リポジトリにある最新の fpGUI コードは、マルチウィンドウ設計に基づいています。つまり、すべてのウィジェット/コンポーネントにはウィンドウ ハンドルがありますが、Windows または Linux は、基本的な通知メッセージ (mouseenter、mouseex など) 以外は、そのウィンドウに対して何もしません。fpGUI には、各コンポーネントの移動先、フォーカス可能かどうか、外観などを完全に制御できます。fpGUI の一部のウィジェット/コンポーネントは、ウィンドウ化されていないコンポーネントでもあります。例: TfpgScrollbar、TfpgMainMenu、ComboBox 内のボタンなど。

真の非ウィンドウ バージョンが必要な場合は、ウィンドウ ハンドルを持つ最上位ウィンドウが 1 つしかないことを意味し、そのウィンドウ内の他のすべてのウィジェット/コンポーネントは実際には OS に存在しません (ウィンドウ ハンドルはありません)。 fpGUI も役に立ちます。fpGUI ツールキットの初期設計は、このような設計に基づいていました。ここでも、コードの v0.4 ブランチのソース コード リポジトリを調べます。その設計では、fpGUI は絶対にすべてを処理し、mouseenter/mouseleave イベントを作成し、コンテナー コンポーネントの座標系を変換し、(偽の) コンポーネントのフォーカス状態を処理する必要がありました。他の OS にも簡単に適用できる非常に移植性の高いフレームワークがあります。

はい、fpGUI は Free Pascal コンパイラを使用して Object Pascal 言語で完全に実装されており、クロスプラットフォーム サポートを提供しています。現在、fpGUI は Windows、Linux (32 および 64 ビット)、Windows Mobile、Embedded Linux (ARM) デバイスで動作します。

于 2010-02-26T23:21:08.307 に答える
0

fgGUIが役立つと思います。

最初にそのWikiを確認してください。

このフレームワークは完全にPascalで記述されているため、Delphiのアプリケーションに使用できると思います。実際にはFreePascalに基づいています;)

HTH

于 2010-02-24T06:31:24.423 に答える
0

ここであなたの問題が実際に何であるかはわかりませんが、この小さな歴史は関連していると思います...

1ダースのフォームに記入するアプリケーションがあります。ユーザーは、追加のフォームに入力することも、アプリケーション自体によって入力された値を変更することもできます。

さて、最初の実装では、すべての入力フィールドにウィンドウ化されたコンポーネントを使用して、フィールドがフォーカスと入力を受け取ることができるようにしました。このすべてのウィンドウが多くのリソースを消費したため、これは大きな問題であることが判明しました。

すべての入力フィールドにウィンドウのないコントロールが用意されました。つまり、最終的には、フォームとその入力フィールドを組み合わせた図だけが得られるということです。ユーザーが図面内をクリックするか、いくつかのキーストロークを使用してフォーカスを移動/設定すると、クリックされたフィールド用の新しいウィンドウ コントロールが作成されます。ユーザーが次の入力フィールドに移動すると、最初のウィンドウが破棄され、新しいウィンドウが作成されます。このようにして、ウィンドウ化されたコントロールが 1 つだけになり、速度が大幅に向上しました。

繰り返しますが、あなたが本当に何を管理したいのかわかりません。TWinControl は何らかの理由で TWinControl ですが、それが何であれ、あなたが望むものに対する解決策があるかもしれません...

于 2010-02-23T12:39:16.623 に答える