デルフィ:ウィンドウレスコントロールを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2315906

  •  22-09-2019
  •  | 
  •  

質問

私はそれを知っています ウィンドウレスコントロールは魔法ではありません. 。ウィンドウのないコントロールは入力フォーカスを持つことができます (例:インターネットエクスプローラ)。入力フォーカスは、次のいずれかの描画にすぎません。

ユーザーがキーを連打し始めると、適切に反応します。あなた 知る キーストロークの目的は それ フォーカスされたコントロール。コントロールにフォーカスがあるためです。

私の (Windows®) ウィンドウの場合、ウィンドウのない子コントロール ( 演じる これは TGraphicControl の子孫です) はキーボード イベントを取得します。それで、フォームの作成中に OnKeyDown, OnChar, OnKeyUp, 、彼らが私の窓のないチャイルドコントロールに行くふりをする必要があります。

できることですが、面倒です。

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

できることですが、面倒です。

そして、 ActiveControl, 、それ以外は何も理解していません TWinControlさんの。したがって、Delphi が誰にフォーカスがあるかを把握しようとすると、狂ってしまうでしょう。したがって、ActiveControlの代替実装が必要になります。

できることですが、面倒です。

言い換えると: これは仕事が多すぎるのでしょうか? 私は Delphi のすべてと戦っているのですが、キーボード入力を通じて数十のウィンドウレス コントロールにアクセスできるようにするためですか?Delphi の設計者は、インタラクティブなウィンドウレス コントロールの使用を考えたこともなかったので、今それを使おうとすると、ただスタックしてしまうだけです。 ハートロッカー?

デルフィは喜んで私を助ける機会を与えてくれましたが、私は苦痛を伴う道を選びました。


さらに詳しい説明 ウィンドウレスコントロール が必要です。

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

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

alt text

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

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

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

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

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


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

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

property ActiveControl: TWinControl;

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

でもひょっとしたら Delphi はすでにウィンドウレス コントロールをサポートしています, 、私が気づいていないだけですか?Delphi には、フォーカスの付与をサポートする確立されたメカニズムがすでにありますか? TControlの?しかし、私はそこそこ賢い人間なので、他のウィジェット ライブラリでできることは Delphi の VCL ではできないと確信しています。

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

私が今尋ねているのは、ウィンドウレス コントロールのサポートを追加することはほぼ不可能なのかどうか、ということです。無駄) - 何週間も無駄に費やさないように。Delphi 開発者のコ​​ミュニティの知識を活用しようとしています。

質問しています。

役に立ちましたか?

解決

ウィンドウなしのコントロールを構築することの無益なののDelphiのVCLフレームワークにそれらに合わせます。

あなたは一例としてInternet Explorerを起動します。しかし、その場合には、それが上に存在するすべてのものを担当して完全です。これは、アクティブ制御が何であるかの独自の内部概念を持っていますが、それは外からどのように見えるかを考える:それはちょうど1つの巨大なコントロールです。あなたがフォーカスを持っているどのようなOSを依頼する場合、単一のブラウザコントロールは、のフォーカスを持ってます。

表示されたブラウザのサブコントロールの関係なく、それを持っています ブラウザは、単に編集コントロールを行うと同じように、タブ文字を消費しているかのように

は、Tabキーを押したとき、それはOSに見えます。編集コントロールは、いくつかのスペースの上にカーソルを移動し、その内部バッファにタブ文字を追加します。ブラウザコントロールは、ディスプレイの別の領域にカーソルを移動します。

あなたは、Delphi TFormは上のすべてのこれを行うのだ思考。デルファイフォームは、既にキーストロークをアクティブ制御を管理し、処理するためのフレームワークを持っており、あなたはそれをすべてを戦うために必要があるとしています。あなたがウィンドウなしのコントロールをしたい場合、あなたはその中に起こるすべての担当に残ることができ、それらを保持するの独自のコンテナコントロールを構築します。

Internet Explorerのルートとのを行きます あなたのコンテナは、VCLコントロールすることができますが、あなたはおそらくそれを置く事ができません - 彼らはまだVCLはfocus-とキーボード処理ルールを使用することを期待されます。あなたはどちらか、Internet Explorerで、通常のWindowsのコントロールを配置することはできませんどのように注意してください。何でも、あなたは、特定のActiveXインターフェイスを介して行くことが必要である置きます。たぶん、あなたはあまりにも、インターフェイスが必要になります、または多分あなたはちょうどあなたがあなたのコンテナで動作するように設計し、いくつかの特別な上位クラスから派生コントロールクラスの独自のセットを作ることができます。 TGraphicControlを開始しないでください。あまりにもあなたの分派コントロールライブラリのための基礎として使用できるようにVCLに定着います。

これは多くの作業になりますが、その後再び、そうInternet Explorerがいた。

他のヒント

はい、それは無益である。
そして、それはあなただけでWindows自体を戦っている、Delphiのせいではありません。
あなたは、ウィンドウコントロールのような振る舞いは、ウィンドウ1を使用することを制御する必要がある場合。
そして、あなたは右、最初からウィンドウコントロールの全体APIスタックを再作成しようとしていることは苦痛ですね。

うん、あなたはかなりそれを考え出しました。ウィンドウなしのコントロール手段を使用して、Windowsがあなたを助けるために行うことができます失うすべてのこと。複数の単一実際のウィンドウ上のカップルよりも持つことは苦痛である。

これらのプログラムのほとんどは、最も可能性の高い元々RADタイプのツールを使用して開発されていなかったので選択の余地はなく、車輪を再発明するまでもなかったです。デルファイの最大の利点の一つは、あなたが望む外観を提供するために、深いVCLおよびサードパーティのコンポーネントのサポートです。

私は、複雑な(税準備)フォームベースのアプリケーションで使用されるウィンドウハンドルの量を減らすために大きな成功を収めて使用されていること

一つの技術は、キャンバス上にテキストを描画することで、位置にユーザを単一TCustomEditからの降順に移動しました編集されました。 TAB /上/下キーをキャプチャし、適切な位置にある編集を移動するのは簡単でした。マウスがフィールドの推移を中心に私たちが発見した課題は、ホット四角形を描画していました。私たちは、フィールド記述子を含ま配列要素がnilになりTObjectを、(なしフィールド)、TListの(グリッドは複数のフィールドが含まれている)、またはクラスのグリッドアレイになってしまいました。これは、我々はそれが箱だけで、ほとんどの4つの分野で、単一のフィールドが含まれ、または可能性が高いだったので、実行しなければならなかった範囲チェックの量を低減します。

fpGUIツールキットに何をしたいの例です。ソースコードリポジトリの最新fpGUIコードは、マルチウィンドウのデザインに基づいています。簡単な手段は、すべてのウィジェット/コンポーネントはウィンドウハンドルを持っていますが、WindowsまたはLinuxがそのウィンドウで何もしない、他の基本的な通知メッセージ(のMouseEnter、mouseexit、など)そのもの。彼らはフォーカス可能であればfpGUIはまだなど、彼らがどのように見えるか、いくつかのウィジェットを、各コンポーネントがどこに行くの完全な制御を持っている/ fpGUIのコンポーネントは、あまりにも非ウィンドウコンポーネントです。例えば:。TfpgScrollbar、TfpgMainMenu、コンボボックスなどでボタン

あなたは真の非ウィンドウ版をしたい場合は、ウィンドウハンドルを持っている唯一のトップレベルウィンドウがある平均、そのウィンドウ内の他のすべてのウィジェット/コンポーネントは、実際にOSには存在しない(彼らはウィンドウハンドルを持っていません)、その後、fpGUIはあまりにも助けることができます。 fpGUIツールキットの初期設計は、このような設計に基づいていました。ここでも、コードのv0.4がブランチのソースコードリポジトリに見えます。 Iその後、fpGUIは絶対にすべてを処理しなければならなかったデザイン、のMouseEnter / mouseleaveイベントを作成し、コンテナコンポーネント、ハンドル(偽の)コンポーネントのフォーカス状態などのための座標システムを変換...はい、最初のデザインは多くの作業ですが、その簡単すぎて他のOSに適用することができ非常にポータブルなフレームワークを持っています。

そして、はい、fpGUIは完全に私のクロスプラットフォームのサポートを提供する無料Pascalコンパイラを使用してObject Pascalの言語で実装されています。現在fpGUIは、Windows、Linuxの(32&64ビット)、Windowsのモバイルおよび組み込みLinuxの(ARM)デバイス上で実行されます。

私はあなたの問題は本当にここ、何であるかの見当がつかないが、私はこの小さな歴史は、関連するかもしれないと思う...

私たちは、ダースのフォームに記入するアプリケーションを持っています。ユーザーの追加フォームに必要事項を記入し、また値を変更することは、アプリケーションそれ自身が記入ます。

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

私たちは今、すべての入力フィールドのウィンドウなしのコントロールを持っています。すべて我々がで終わるということを意味は、フォームとその入力フィールドの組み合わせ図です。ユーザーの図面内のクリック、またはいくつかのキーストロークを使用していますが、/セットフォーカスを移動するとき、我々はクリックされたフィールドのための新しいウィンドウコントロールを作成します。次の入力フィールドにユーザーが移動し、我々は最初のウィンドウを破棄し、新しいものを作成するとき。この方法で私たちだけで、再び私たちに素敵な速度向上を与えた1つのウィンドウコントロールを持っています。

再び - 私はあなたが本当に管理するために何をしたいの見当がつかない。 TWinControlのが理由のTWinControlですが、それは次のようになり、これまで何を、何をしたいの解決策があるかもしれません...

私が思う fgGUI にあなたを助けるかもしれない。

ドゥチェックそのウィキの最初ます。

私はそれが完全にPascalで書かれている通り、あなたは、Delphiでアプリケーションのために、このフレームワークを使用することができると思います。実はそれはFreePascalとに基づいています。)

HTH

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top