問題タブ [tframe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - オブジェクトインスペクターにTFrameの子孫の追加プロパティを表示する
Delphiオブジェクトインスペクタは、設計上、TFrameの子孫の追加のプロパティを表示しません。人々は、オブジェクトインスペクターでTFormの子孫のプロパティを表示するために一般的に使用される既知のトリックを使用することを提案する傾向があります。秘訣は次のとおりです。TFormの子孫のカスタムモジュールを次のようなデザインタイムパッケージを介してDelphiIDEに登録します。
オブジェクトインスペクターは、この方法でTFrame子孫のインスタンスの追加のプロパティを表示できますが、フォームに埋め込まれている間はフレームの動作を失います。再設計できず、サブコンポーネントのイベントを実装できず、子コントロールを受け入れます(これはできません)。ただし、独自の設計領域では正常に動作します。
DelphiIDEがTFrame専用に提供する動作のように見えます。それらはおそらく一種の一般的な施設ではありません。
フレームの動作を失うことなくこれを達成する他の方法はありますか?
Delphi2007を使用しています
@ Tondrej、
事前に感謝し、問題のコメントを読んでください。
frameunit.dfm:
delphi - TFrame 継承のリファクタリング
私からのさらに別の TFrame IDE 登録コンポーネントの質問です。助けてくれてありがとう、仲間のプログラマー。: )
ここでダリアンの TFrame 継承の提案をいじってみましょう:
仕様:
基本的に、私は IDE に登録した TFrame ベースのコンポーネントを持っていますが、それは素晴らしく機能しました。私は現在、既存のコンポーネントの非ビジュアル機能とプロパティの大部分を共有するいくつかの「姉妹」コンポーネントを開発しています。したがって、その多くを、新しいコンポーネントと古いコンポーネントの両方が継承できる親/スーパークラスに移動することは理にかなっています。
このようにTFrameの継承を「リファクタリング」する最良の方法は何ですか? (これは TForm クラスの子孫にも当てはまるかもしれませんが、確かではありません)。注意点や注意点は?
例:
たとえば、何もない新しい TFrame を作成し、そのフレーム TMyBaseFrame を呼び出してみました。次に、既存のコンポーネント (TMyFrameTreeView と呼びましょう) のクラス定義を、TFrame ではなくそれから継承するように変更しました。
正常にコンパイルされましたが、フォームにドロップしようとすると、「ClientHeight not found」(または「ClientHeight property not found」) が表示され、フォームにドロップされませんでした。関連する DFM から ClientHeight と ClientWidth を削除すると大混乱が生じ、いずれにせよサイズ変更時に置き換えられました。子孫クラスの ExplicitHeight と ExplicitWidth に気付き、継承された値からのプロパティ値のオーバーライドに関連していると考えていますが、よくわかりません。New -> Inherited Items を介してまったく新しいフレームを再作成し、すべてをコピーしても、まだ良い結果が得られていません。
ファイナルノート
これは、DFM ファイルのストリーミングや複数世代の子孫などで、すぐに厄介になる可能性があることを理解しています....これが、全体的な「注意すべきこと」の概念的な側面を求めている理由の一部ですが、特定の問題の現実世界のより単純なバージョンも同様です(私には、実行可能なはずです)。
学習の試みでハックするための小さなテスト パッケージを作成し、多くのことを学んでいますが、それはゆっくりと進んでおり、Delphi の「ジェダイ マスター」からのガイダンス/洞察は、最も高く評価されます。: )
回答の更新は後で:
以下の両方の回答が役に立ちました。同様に、通常の TFrame からの変更がない「ベース フレーム クラス」を作成し、プロパティやメソッドなどを追加する前にそれを継承すると、継承ストリーミングが非常に安定するようです。理由はわかりませんが、これまでのところそうです。
delphi - TFrame をフォームのように扱う Delphi IDE
TFrame クラスを微調整 (プロパティ、メソッドなどを追加) していると、IDE が混乱し、フレームがヘッダー/キャプション、境界線などを備えたフォームであると認識しているかのように動作します。クラスは TFrame の子孫として宣言されます。これの原因、防止方法、および修正方法についてのアイデアはありますか?
Delphi 2007 Pro を使用しています。また、(重要な場合) 注意してください。TFrame の子孫は通常、設計時パッケージを介して IDE に (つまり、パレット上に) 登録されます。
後で: 追加の「詳細」: 現時点でこの問題が発生しているフレームは、視覚的には非常に基本的な TFrame です (真新しい TFrame からの変更はサイズと背景色のみです)。
クラス宣言は次のとおりです。
このフレームは、他の多くの基本クラスとして使用されます。私は通常、EXE プロジェクトの一部としてではなく、関連するフォームを開いた状態などで、それが属する BPL プロジェクトから直接編集しています (これらのフレームはすべてパレットにインストールされるため)。
また、「ツール」→「オプション」で「埋め込みデザイナー」にチェックを入れます。
すべての DFM ファイルも、バイナリではなくテキストとして保存しています (それが重要な場合)。
delphi - パラメータを Delphi TFrame に渡す
シングルトンとグローバル変数を避けるために、パラメータを TFrame コンポーネントに渡せるようにしたいと考えています。ただし、TFrame は通常、設計時にフォームに含まれるため、デフォルトのコンストラクタしか使用できません。
もちろん、TFrame が作成された後、親フォームは OnCreate コールバックでいくつかのプロパティを設定できます。ただし、これはプロパティが忘れられないことを保証するものではなく、依存関係はコンストラクターを使用するほど明確ではありません。
dfm ファイルの読み取り中にコンポーネントを作成するためのファクトリを登録できると便利です。次に、ファクトリによって作成されたときに、必要なパラメーターを TFrame コンストラクターに渡すことができます。これを達成する方法はありますか?
または、パラメータを TFrame に渡す方法について、より良い解決策を持っている人はいますか?
delphi - カスタムフレームの登録
Delphi 2009では、私のプロジェクトの1つに、他のいくつかのコントロールの基本クラスとして使用したいいくつかのコントロールを含むカスタムフレームがあります。このフレームをIDEウィザードとして登録して、[新しいアイテム]リストで使用できるようにします。新しく追加したアイテム(カスタムフレーム)をプロジェクトに追加すると、次のようになります。
- オブジェクトインスペクターでカスタムフレームに追加したすべてのプロパティとイベントを表示します。
- TFrameではなく、カスタムフレームから新しく作成したフレームを取得します。
わかりました。オブジェクトインスペクターにプロパティとイベントを表示するために、カスタムモジュールをIDEに登録します。フレームに対しては正しく機能しません。幸いなことに、誰かがStackOverflowでこれについて言及し、これに対する答えが与えられています。
オブジェクトインスペクターにTFrameの子孫の追加プロパティを表示する
次に、カスタムフレームのDFMをロードするために、カスタムフレームのコンストラクターにInitInheritedComponentを追加しました。このようなもの:
動作しません!それでも、自分のフレームではなく、デザイナーで空のフレームが作成されます。カスタムモジュールをIDEに登録しないと、InitAliExpressComponentがなくてもフレームが正しく表示されますが、追加のプロパティはオブジェクトインスペクターに表示されません。
コンストラクターソースをこれに変更した場合(TMyFrameをTFrameに置き換える):
フレームはデザイナに正しく追加され、追加のプロパティはオブジェクトインスペクタに表示されますが、フレーム上のコンポーネントがすでに存在していると文句を言うため、アプリケーションの実行は失敗します。
だから、私の質問は、DFMを使用してカスタムフレーム(フォームではない)から派生フレームを作成し、その追加のプロパティをObjectInspectorに表示するDelphiIDEウィザードを使用するためのソリューションは何ですか?
ところで、デザイン時にもコントロールを使用できるようにする必要があるため、実行時にフレームにコントロールを作成したくありません。
誰かが私にこのことを明らかにしてくれることを願っています。
よろしく
編集:
これらのフレームは、実際にはウィザードコンポーネントのページとして使用されます。ウィザードコンポーネントは実行時にそれらを作成します。「新規アイテム」メニューに、プロジェクトにウィザードページを追加し、IDEデザイナーでそのレイアウトを設計し、ウィザードに表示されるようにウィザードコンポーネントに登録するオプションをユーザーに提供してほしい。ウィザードページにはいくつかの必須コントロールといくつかのカスタムプロパティおよびイベントが必要なため、TFrameから基本クラスを継承しています。
delphi - 複数ページのフォームに Delphi tframe を使用する必要がありますか?
アプリケーションには、ユーザーが何をしているかに応じて異なる「状態」を持つフォームがいくつかあります。たとえば、ファイルを一覧表示すると、フォームはそのファイルに関するデータをグリッドに表示しますが、ボタンをクリックすると、グリッドはそれに関連するグラフに置き換えられます。簡単に言えば、フォームのコントロールは、ユーザーが何をしたいかによって異なります。
もちろん、それを行う明白な方法は、必要に応じてコントロールを表示/非表示にすることでした。少数の場合は魅力のように機能しますが、状態ごとに 10/15+ コントロール (または実際には 3 つ以上の状態) に達すると、使用できなくなります。
私は現在 TFrames を試しています: すべての状態のフレームを作成し、フォーム上に各フレームのインスタンスを作成し、Visible を使用して必要なもののみを表示します - いくつかのコントロールをオンにしながらそれらはすべてそれらを共有するため、どのフレームからでもその上に。
これは私がやりたいことをする正しい方法ですか、それとも途中で何かを逃しましたか? tframe インスタンスを 1 つしか作成できないと思っていたので、表示するインスタンスを選択しましたが、そのようには見えません。
ありがとう
delphi - パッケージ内のフレーム継承と複製ファイル
私は、TFrames と ModelMaker を使用して多くのコンポーネントを開発してきました。ビジュアル デザイン/開発 + 継承 + ModelMaker の組み合わせが非常に魅力的であることがわかりました。次に、これらの TFrame の子孫を登録ユニットで登録すると、そこから本格的なパレットベースのコンポーネントになります。Delphi 2007 を使用しています。
このプロセスの小さな「障害」について学習した早い段階で、TFrame の子孫が正しくストリーミングされない (多くの場合、IDE ではフレームではなくフォームとして表示される) ことで遭遇する多くの問題が、導入することで完全に排除できることがわかりました。変更なしで TFrame から継承する独自の「TBaseFrame」クラスを作成し、それを基本クラスとして使用してコンポーネントを開発します (メソッド、プロパティなどを追加します)。TFrame から直接継承するクラス/フレームにプロパティやメソッドなどを追加すると、dfm ファイルのストリーミングが混乱することがよくありました。
それで、私がねじれを解決したら、全体的にうまくいきました.
しかし、昨日、私は新しい問題に遭遇しました:
結果のコンポーネントをパッケージ セットにインストールし、意味のある方法でグループ化します (つまり、アプリ 1 のすべての「パネル」は 1 つのパッケージにあり、アプリ 2 の多数の「ビューアー」は別のパッケージにあるなど)。
TBaseFrame クラスがパッケージに含まれていない場合、継承する TFrame の子孫コンポーネントは IDE に読み込まれません。しかし、TBaseFrame をパッケージに追加すると、複数のパッケージに同じソース PAS ファイルが含まれていると、競合する Delphi レポートが表示されます。
すべての frame= ベースのコンポーネントを 1 つの巨大なパッケージに入れることもできますが、セットの数の性質を考えると、時間の経過とともに大きくなりすぎたり手に負えなくなったりすることがはっきりとわかるので、そうしないことを本当に、本当に望んでいます。開発する予定です。この競合を解決する他の方法はありますか?
更新 -- これを「適切に」動作させるための秘訣があります -- 以下のコメントを必ずお読みください。
delphi - TFrame内のEventHandler?
TForm
3つの同一の(TVehicleUnitFrame)をTFrames
含む(TVehicleEditForm)があります。
フレームのすべてのインスタンスがフレーム内で独自のイベントを処理するという考え方でしたeventhandler
。問題は、eventhandler
が呼び出されないことです。
eventhandler
Createメソッドをオーバーライドして、フレーム内にbyコードを割り当てようとしましたが、その場合もハンドラーは呼び出されません。
eventhandler
しかし、フォームからフレームの外側を割り当てると、正常に機能します。このような:
そして、これはボタン1つだけです!フレーム内に多くのコンポーネントがあるので、これは多くの割り当てになります...これをオブジェクトインスペクターで直接実行する必要がある場合は、非常に醜いコードです。
D2007を使用しています。原因のアイデアはありますか?
よろしくローランド
delphi - Delphi、フレームとフォーム。マルチドキュメント インターフェイスとは?
昨日、「MDI vs タブ付きインターフェース」についての議論を始めました。アプリを MDI ベースで開発し続けるか、それとも子フォームをタブ シートに埋め込むべきかを尋ねました。代わりに TFrames を使用する必要があると誰かが指摘しました... 私の質問は: なぜですか?
TFrame にフォームを埋め込むときに TFrame を使用する利点は何ですか? これまでのところ、何もわかりませんが、切り替えにはコードの一部を書き直すだけで済みます...
(とにかく、設計時に埋め込みを使用するつもりはありません!)
前もって感謝します
delphi - Delphi でフレームを使用する一般的な方法は何ですか?
私はいつもの散歩をしていて、いくつかのフレームの議論に出くわしました。
私は主に Delphi 愛好家であり、プロではありません。そのため、TFrame を独自の方法で使用する方法を学ばなければなりませんでした。
- ユニット内に TFrame を作成します。
- そのユニットをメイン フォームの Uses 句に追加します。
- その TFrame の型のプライベート変数を持つ
- フォームの OnCreate は TFrame をインスタンス化し、それを Create と .Parent の両方で TPanel にアタッチします。
- 私のアクションの 1 つで、TFrame.Visible := True と .BringToFront を設定しました。
これは、個人的に熟考した後の私の実践です。
フレームを他にどのように使用できますか?