記事「指標やEAのデータを表示するダッシュボードの作成」についてのディスカッション - ページ 2

 
Artyom Trishkin #:

こんにちは。

それで。

クラスの、将来新しく動的に生成されるオブジェクトへのポインタ変数が宣言され、すぐにNULL 値で初期化される。


クラスの単純なインスタンスは次のように宣言される:

このクラスには、正式なパラメータを持たないコンストラクタがありません。

したがって、この方法でインスタンスを宣言する場合は、クラスのコンストラクタに渡さなければならないクラス・オブジェクトの必要なパラメータをすべて指定する必要があります:

------------------------

クラスを使用する例では、まずインジケータに未来のオブジェクトへの空のポインタが作成され、次に OnInit() でパネル・オブジェクトが作成され、作成されたオブジェクトへのポインタがポインタ変数に書き込まれます:


次に OnDeinit() で、このポインタによってオブジェクトがメモリから削除されます:

作成されたオブジェクトへのポインタを変数に書き込まずに、単にnew 演算子で新しい オブジェクトを作成した場合、後でそのオブジェクトを削除することができず、メモリー・リークになります。

要するに、記事の例では

  1. 未来のクラス・オブジェクトへの変数ポインタを宣言し、それをNULL 値で初期化する、
  2. 新しいクラス・オブジェクトを作成し、そのポインタを先に作成したダッシュボード変数に書き込みます、
  3. 作成されたオブジェクトにアクセスするときは、ポインタ変数とポイント ( dashboard.AnyMethod() ) を使用します。
  4. 作業の最後に、動的に作成されたクラス・オブジェクトをそのポインタによって削除します。

もしクラスの必要なインスタンス(CDashboard dashboard)がすぐに作成されていたら、それへのポインタは必要なかったでしょう。ターミナル・サブシステムが勝手に削除してくれるからだ。しかし、このクラスのインスタンスはプログラム内でこれだけとなる。

動的生成では、必要なクラスの新しいオブジェクトをその場で作成し、ポインタで参照することができる。これが、この例でクラス・オブジェクトの動的生成が使われた理由だ。簡略化され、いくつかのポイントをカバーしていない。

包括的な回答をありがとうございます!各オブジェクトに独自のコンストラクタがあり、別のケースではクラスから要求された引数を持つオブジェクトがあり、どの段階でも異なるオブジェクトを作成することができます!(Nusが少し明確になります)。

実際に情報パネルを作成するために興味を持って、それはモニタのDPIの結果であり、私の場合168。Comment();は非常に小さい!

解像度を考慮して作成したいTerminalInfoInteger(TERMINAL_SCREEN_DPI)がある.そして、私は便宜上、カラーグループごとに作成したいのです。

もしかしたら、そのような解決策をお持ちですか?あなたのコードは読みやすくていいのですが...。一方、私のコードは長くて理解しにくく、何度も書き直さなければなりません!ありがとうございました!

 
Igor Bakhrushen #:

包括的な回答をありがとう!各オブジェクトには独自のコンストラクタがあり、他のケースではクラスから要求された引数を持つオブジェクトがあり、どの段階でも異なるオブジェクトを作成することができます!(Nousが少し明確になる)。

実際に情報パネルを作成するために興味を持って、それはDPIモニタの結果であり、私の場合168。Comment();は非常に小さい!

解像度を考慮して作成したいTerminalInfoInteger(TERMINAL_SCREEN_DPI)がある.そして、便宜上、カラーグループごとに作成したい。

もしかしたら、そのような解決策をお持ちですか?あなたのコードは読みやすくていいのですが...。一方、私のコードは長くて理解しにくく、何度も書き直さなければなりません!ありがとうございました!

解決策はヘルプの例にあります:

取引、自動取引システム、取引戦略のテストに関するフォーラム。

MQLで書かれたUIのギャラリー

Artyom Trishkin, 2024.05.31 10:33 AM

こちら(TERMINAL_SCREEN_DPI)です:

スケーリング係数計算の例:

//--- 画面上に幅1.5インチのボタンを作成する。
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // ユーザーモニターのDPIを取得する
int base_width = 144;                                      標準モニターでDPI=96の場合、 // ベース幅はスクリーンポイント単位
int width      = (button_width * screen_dpi) / 96;         // ユーザーのモニターに合わせたボタン幅を計算する(DPIを考慮する)
...
 
//--- スケーリング係数の計算(単位:パーセント
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- ズーム倍率を使う
width=(base_width * scale_factor) / 100;

この方法で使用すると、解像度の異なるモニターでグラフィックリソースを 見たときに同じサイズになります。同時に、制御要素(ボタン、ダイアログウィンドウなど)のサイズは、個人設定に対応します。


 
私はあいにく4Kモニターを持っていないので確認できない。同じ理由で、このような再計算はまだライブラリに入力していない。確認せずに適当にやるのは深刻ではない。
 
Artyom Trishkin #:
残念ながら、私は4Kモニターを持っていないので、確認することができません。同じ理由で、私はまだそのような再計算をライブラリに入力していません - 確認せずに、ランダムに行うことは深刻ではありません。
なるほど...。ありがとう!ゆっくり考えよう!
 
Artyom Trishkin #:
残念ながら、私は4Kモニターを持っていないので、確認することができません。同じ理由で、このような再計算はまだライブラリに入力していません - 確認せずにランダムに行うのは深刻ではありません。

Artemさん、こんにちは!dpiを考慮した構成はこちらです。しかし、実際には別の方法もあります。ヘッダーのサイズを設定し、ヘッダーのサイズに基づいてパネルのサイズ、行の高さ、テキストの高さを計算するとします。2つのパラメータを指定するとdpiを指定します。それとも何か問題があるのでしょうか?この解決策についてどう思われますか?

 
Igor Bakhrushen #:

Artemさん、こんにちは!dpiベースのビルドです。でも、基本的には別の方法もあります。ヘッダーのサイズを設定し、ヘッダーのサイズに基づいてパネルの行の高さとテキストの高さを計算します。2つのパラメータを指定する。とdpiを指定します。それとも何か問題があるのでしょうか?この解決策についてどう思われますか?

すべてテストする必要がある。モニターがないとできない。だから、残念ながら何も言うことはない。
 
このコードをありがとう。)
 

パネルについては良いアイデアだ。しかし、他のチャートからそのチャートに切り替えたとき、パネルが自然にチャートの一番下に落ちてしまうことに気づきました。例


 
Denis Kirichenko #:

パネルについては良いアイデアだ。しかし、他のチャートからそのチャートに切り替えたとき、パネルが自然にチャートの一番下に落ちてしまうことに気づきました。例

興味深い現象ですね。暇なときに調べてみよう。おそらく、非アクティブ・チャートのリサイズが原因だろう。

 
今のところ、これがCHARTEVENT_CHART_CHANGE(9)イベントの処理方法であることがわかりました。