【MQL5】ResourceFree関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. ResourceFree関数の働き・役割
  2. ResourceFree関数の引数について
    1. 第1引数: resource_name
  3. ResourceFree関数の戻り値について
  4. ResourceFree関数を使う際の注意点
  5. ResourceFree関数を使ったサンプルコード
  6. サンプルコード解説1:OnStart関数部分その1
    1. グラフィックリソースの名前、幅、高さ、ピクセルデータ配列の設定
    2. エラーコードのリセット
  7. サンプルコード解説2:OnStart関数部分その2
    1. ピクセル配列のリサイズ
    2. リサイズ失敗時のエラーハンドリング
  8. サンプルコード解説3:OnStart関数部分その3
    1. ピクセル配列の初期化
    2. グラフィックリソースの作成
    3. リソースのサイズ確認
  9. サンプルコード解説4:OnStart関数部分その4
    1. ティック情報の取得
    2. ビットマップオブジェクトの作成
  10. サンプルコード解説5:OnStart関数部分その5
    1. ビットマップオブジェクトのサイズとアンカーの設定
    2. ビットマップオブジェクトにグラフィックリソースを関連付け
  11. サンプルコード解説6:OnStart関数部分その6
    1. 透明度200のDodgerBlue色の設定
    2. 色変更の待機と新しい色の設定
  12. サンプルコード解説7:OnStart関数部分その7
    1. グラフィックリソースの解放
    2. リソース解放後に色を変更してみる
    3. ビットマップオブジェクトの削除
  13. サンプルコード解説8:Update関数(オリジナル関数)
    1. 引数について
    2. 幅または高さが0の場合の終了処理
    3. リソースデータの更新と再描画
    4. この関数の役割

ResourceFree関数の働き・役割

ResourceFree関数は、動的に作成されたリソースをメモリから削除するために使用されます。具体的には、ResourceFree関数などによって作成されたリソースのメモリを解放し、リソースの削除を行います。

この関数を使うことで、MQL5アプリケーションのメモリ消費量を管理し、不要なメモリの解放が可能になります。リソースを削除した後も、削除前に表示されていたグラフィカルオブジェクトは残りますが、削除されたリソースを再利用することはできません。特に、OBJ_BITMAPやOBJ_BITMAP_LABELなどのグラフィカルオブジェクトは、削除されたリソースにアクセスできなくなるため、新しく作成する際には注意が必要です。

ResourceFree関数の引数について

bool  ResourceFree(
  const string  resource_name      // リソース名
  );

ResourceFree関数には、1つの引数が存在します。

第1引数: resource_name

  • 種類: 文字列
  • 説明: 解放するリソースの名前を指定します。このリソース名は「::」で始める必要があります。リソース名は、ResourceCreate関数などで動的に作成されたリソースを特定するために使用されます。

ResourceFree関数の戻り値について

ResourceFree関数は、リソースの削除が成功したかどうかを示す真偽値を返します。

  • 戻り値がtrueの場合: 指定されたリソースが正常に削除され、メモリが解放されたことを意味します。
  • 戻り値がfalseの場合: リソースの削除に失敗したことを意味し、エラーが発生したことを示します。エラーの詳細は、GetLastError関数を使用して取得することができます。

この戻り値を確認することで、リソース削除が正しく行われたかどうかを判断することが可能です。

ResourceFree関数を使う際の注意点

リソース名は、必ず「::」で始める必要があります。これを守らないと、リソースは正しく解放されず、エラーが発生します。

動的に作成されたリソースのみが削除されます。システムによって提供されるリソースや、他のプログラムによって作成されたリソースは削除できません。

グラフィカルオブジェクトがリソースに結びついている場合、リソースを削除してもグラフィカルオブジェクト自体は画面に表示されたままになります。しかし、削除されたリソースを基に新しいOBJ_BITMAPやOBJ_BITMAP_LABELなどを作成しようとすると失敗します。削除されたリソースを再利用できない点には特に注意が必要です。

ResourceFree関数を使ったサンプルコード

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- グラフィックリソースの名前、幅、高さを設定
  string rc_name="Resource";      // リソースの名前
  uint   rc_width=100;            // リソースの幅(ピクセル)
  uint   rc_height=100;           // リソースの高さ(ピクセル)
  uint   rc_data[];               // ピクセルデータを格納する配列
  uint   rc_size=rc_width*rc_height; // 配列のサイズを計算(幅×高さ)
 
  ResetLastError();  // エラーコードをリセット
  
  //--- ピクセル配列のサイズを設定
  if(ArrayResize(rc_data,rc_size)!=rc_size)
    {
    // 配列のリサイズが失敗した場合、エラーコードを表示
    Print("ArrayResize() failed. Error code: ",GetLastError());
    }
    
  //--- ピクセル配列を透明色(白色)で塗りつぶし、グラフィックリソースを作成
  ArrayInitialize(rc_data,0x00FFFFFF);  // 全ピクセルを透明色で初期化
  if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    // リソース作成が失敗した場合、エラーコードを表示
    Print("ResourceCreate() failed. Error code: ",GetLastError());
    }
  
  // 作成したリソースのサイズを確認
  Print("Size of created recource array: ",rc_data.Size());
 
  //--- 現在のティック情報を取得し、ビットマップオブジェクトを作成
  MqlTick tick={};  // ティック情報を格納する構造体
  if(!SymbolInfoTick(Symbol(),tick))
    {
    // ティック情報の取得に失敗した場合、エラーコードを表示
    Print("SymbolInfoTick() failed. Error code: ",GetLastError());
    }
  
  //--- ビットマップオブジェクトの作成
  string obj_name="Bitmap";  // オブジェクトの名前
  if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
    {
    // オブジェクト作成が失敗した場合、エラーコードを表示
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    }
  
  //--- ビットマップオブジェクトのサイズとアンカーを設定
  ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);     // 幅を設定
  ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);    // 高さを設定
  ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);  // アンカーを中央に設定
  
  //--- ビットマップオブジェクトにグラフィックリソースを関連付け
  ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);  // リソース名を指定

  //--- 透明度200のDodgerBlue色を設定
  uint clr=ColorToARGB(clrDodgerBlue,200);  // 色をARGB形式で設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を指定された色で塗りつぶす
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新

  //--- 3秒待って画像の色を変更
  Print("Wait 3 seconds before changing color");
  Sleep(3000);  // 3秒待機
  
  //--- 透明度200のOrangeRed色に変更
  Print("Change color");
  clr=ColorToARGB(clrOrangeRed,200);  // 新しい色を設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を新しい色で塗りつぶす
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新
  
  //--- 3秒待ってグラフィックリソースを解放
  Print("Wait 3 seconds before ResourceFree()");
  Sleep(3000);  // 3秒待機
  bool res=ResourceFree("::"+rc_name);  // リソースを解放
  Print("ResourceFree: ",res);  // 解放結果を表示
  
  //--- リソース解放後に色を変更してみる
  Print("Trying to change color to GreenYellow after ResourceFree()");
  clr=ColorToARGB(clrGreenYellow,200);  // 新しい色を設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を設定
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新
  Print("The color has not changed because the resource has been released");  // 色が変更されないことを確認
  
  //--- 3秒待ってビットマップオブジェクトを削除
  Print("Wait 3 seconds before deleting the Bitmap object");
  Sleep(3000);  // 3秒待機
  Print("Delete Bitmap object");
  ObjectDelete(0,obj_name);  // ビットマップオブジェクトを削除
 }
 
//+------------------------------------------------------------------+
//| グラフィックリソースデータを更新する関数                            |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
 {
  //--- 幅または高さが0の場合は処理を終了
  if(width==0 || height==0)
    return;
  
  //--- リソースデータを更新し、再描画
  if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
    ChartRedraw();  // チャートを再描画
 }

サンプルコード解説1:OnStart関数部分その1

void OnStart()
 {
  //--- グラフィックリソースの名前、幅、高さを設定
  string rc_name="Resource";      // リソースの名前
  uint   rc_width=100;            // リソースの幅(ピクセル)
  uint   rc_height=100;           // リソースの高さ(ピクセル)
  uint   rc_data[];               // ピクセルデータを格納する配列
  uint   rc_size=rc_width*rc_height; // 配列のサイズを計算(幅×高さ)
 
  ResetLastError();  // エラーコードをリセット

この部分のコードは、グラフィックリソースの初期設定を行うための処理です。グラフィックリソースとは、MQL5の環境でチャート上に表示する画像やグラフィックオブジェクトを扱うためのリソースです。

グラフィックリソースの名前、幅、高さ、ピクセルデータ配列の設定

まず、リソースの基本的なパラメータが宣言されます。

rc_nameはリソース名を設定しています。この名前はリソースを識別するために使用されます。例えば、リソースを後で参照したり削除したりする際に使用します。

rc_widthはリソースの幅をピクセル(デジタル画像を構成する最小の単位)で設定しています。この例では幅が100ピクセルです。

rc_heightはリソースの高さをピクセル単位で設定しています。幅と同様に、100ピクセルの高さを指定しています。

rc_dataは、リソースのピクセルデータを格納するための配列です。リソース内の各ピクセルの色や透明度を表すデータがこの配列に格納されます。

rc_sizeは、配列のサイズを計算しています。リソースの幅と高さを掛け算することで、ピクセルデータの総数を求めています。この場合、100×100なので、合計10,000ピクセル分のデータが必要になります。

エラーコードのリセット

ResetLastError関数では、前回のエラー情報をリセットしています。これにより、以降の処理でエラーが発生した場合、最新のエラー情報が正確に取得できるようになります。特に、エラーの発生を検知しやすくするための準備として重要です。

これらのステップにより、グラフィックリソースの基礎情報が整い、後続の処理で実際にリソースを作成する準備が整います。

サンプルコード解説2:OnStart関数部分その2

  //--- ピクセル配列のサイズを設定
  if(ArrayResize(rc_data,rc_size)!=rc_size)
    {
    // 配列のリサイズが失敗した場合、エラーコードを表示
    Print("ArrayResize() failed. Error code: ",GetLastError());
    }

この部分のコードは、ピクセルデータを格納する配列を適切なサイズにリサイズする処理と、その結果を確認するエラーハンドリングを行っています。

ピクセル配列のリサイズ

最初に、rc_dataという配列をrc_sizeの大きさにリサイズします。この配列は、グラフィックリソース内の各ピクセルの情報を格納するために使用されます。

ArrayResize関数は、指定された配列のサイズを変更する関数です。この場合、rc_data配列のサイズをリソースの幅と高さの掛け算結果であるrc_sizeに変更しようとしています。リサイズに成功した場合、配列要素数が新しいサイズに変更されます。

リサイズ失敗時のエラーハンドリング

ArrayResize関数が失敗した場合、その戻り値はrc_sizeと一致しません。そこで、条件式では、リサイズに失敗したかどうかを確認し、失敗した場合にはエラーメッセージを表示します。

Print関数を使って、「ArrayResize() failed.」というメッセージと共に、GetLastError関数によって取得されたエラーコードを表示しています。GetLastError関数は、最後に発生したエラーの詳細な情報を返すため、デバッグ時にエラーの原因を特定するのに役立ちます。

この部分のコードは、配列のリサイズ処理が成功したかどうかを確認し、失敗した場合にはエラーメッセージを表示する重要なチェック機能を果たしています。これにより、リソース作成時にピクセルデータの配列が適切に確保されることが保証されます。

サンプルコード解説3:OnStart関数部分その3

  //--- ピクセル配列を透明色(白色)で塗りつぶし、グラフィックリソースを作成
  ArrayInitialize(rc_data,0x00FFFFFF);  // 全ピクセルを透明色で初期化
  if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
    {
    // リソース作成が失敗した場合、エラーコードを表示
    Print("ResourceCreate() failed. Error code: ",GetLastError());
    }
  
  // 作成したリソースのサイズを確認
  Print("Size of created recource array: ",rc_data.Size());

この部分のコードは、ピクセル配列を初期化し、それを基にグラフィックリソースを作成する処理を行っています。

ピクセル配列の初期化

まず、ArrayInitialize関数を使用して、rc_data配列の全ての要素を透明色である白色(ARGB値が0x00FFFFFF)で初期化しています。ここでの透明色は、最初の2桁がアルファ値(透明度)を示しており、「00」で完全に透明な状態を表しています。残りの「FFFFFF」は白色を示しています。この処理により、全てのピクセルが透明な白色で塗りつぶされた状態で初期化されます。

グラフィックリソースの作成

次に、ResourceCreate関数を使用して、初期化したピクセルデータを基にグラフィックリソースを作成します。関数には以下のパラメータが渡されています。

  • rc_nameはリソース名です。この名前を使ってリソースを識別します。
  • rc_dataはピクセルデータを格納した配列です。
  • rc_widthとrc_heightは、それぞれリソースの幅と高さです。
  • 後続のパラメータはリソースの位置やフォーマットに関するものです。ここでは、位置パラメータがゼロで指定され、カラーフォーマットにはCOLOR_FORMAT_ARGB_NORMALIZEが使われています。このフォーマットは、ARGB値を正規化してグラフィックデータを作成することを意味します。

もしリソースの作成に失敗した場合、Print関数を使用してエラーメッセージと、GetLastError関数によって取得されたエラーコードを出力します。これにより、リソースの作成時に問題が発生した場合、その原因を特定するのに役立ちます。

リソースのサイズ確認

最後に、作成したリソースのサイズをPrint関数で表示します。rc_data配列のサイズを確認し、適切にリソースが作成されたことを出力します。これにより、リソースの作成が成功したことと、その大きさをデバッグとして確認できます。

サンプルコード解説4:OnStart関数部分その4

  //--- 現在のティック情報を取得し、ビットマップオブジェクトを作成
  MqlTick tick={};  // ティック情報を格納する構造体
  if(!SymbolInfoTick(Symbol(),tick))
    {
    // ティック情報の取得に失敗した場合、エラーコードを表示
    Print("SymbolInfoTick() failed. Error code: ",GetLastError());
    }
  
  //--- ビットマップオブジェクトの作成
  string obj_name="Bitmap";  // オブジェクトの名前
  if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
    {
    // オブジェクト作成が失敗した場合、エラーコードを表示
    Print("ObjectCreate() failed. Error code: ",GetLastError());
    }

この部分のコードは、現在のティック情報を取得し、そのデータを基にビットマップオブジェクトを作成する処理を行っています。

ティック情報の取得

MqlTick構造体という構造体を使用して、ティック情報(シンボルの最新の価格や時刻)を格納します。ティック情報には、通貨ペアや商品の現在の価格(Bid価格、Ask価格など)や、その価格が記録された時刻が含まれています。

SymbolInfoTick関数は、指定されたシンボルの最新ティックデータを取得するために使用されます。ここでは、Symbol関数を使って現在のシンボルを指定し、tickという構造体にデータを格納しています。

もしティック情報の取得が失敗した場合、Print関数を使用して「SymbolInfoTick() failed.」というメッセージと、GetLastError関数で取得されたエラーコードを表示します。これにより、ティックデータ取得に失敗した場合の問題を確認できます。

ビットマップオブジェクトの作成

次に、取得したティックデータを基にビットマップオブジェクトを作成します。ObjectCreate関数を使用し、ビットマップオブジェクトをチャートに配置します。

ObjectCreate関数は、以下のパラメータを使用してビットマップオブジェクトを作成します。

  • チャートの識別子には「0」が指定されています。これは、現在のチャートを意味します。
  • obj_nameには「Bitmap」という名前が設定されています。これはビットマップオブジェクトの一意(1つしか存在しない)な名前です。
  • OBJ_BITMAPは、作成するオブジェクトの種類を示しており、この場合ビットマップオブジェクトを意味します。
  • tick.timeとtick.bidは、オブジェクトを配置する際の座標(時間軸と価格軸)を示しています。取得したティックデータの時刻とBid価格を使ってオブジェクトを配置しています。

もしビットマップオブジェクトの作成に失敗した場合、Print関数を使用して「ObjectCreate() failed.」というメッセージと、エラーコードを表示します。これにより、オブジェクト作成時に何が問題であるかを特定することができます。

このコードは、チャートにビットマップオブジェクトを配置するための基本的な処理を行い、ティック情報を基に正確な位置に配置する役割を果たしています。

サンプルコード解説5:OnStart関数部分その5

  //--- ビットマップオブジェクトのサイズとアンカーを設定
  ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);     // 幅を設定
  ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);    // 高さを設定
  ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);  // アンカーを中央に設定
  
  //--- ビットマップオブジェクトにグラフィックリソースを関連付け
  ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);  // リソース名を指定

この部分のコードは、作成されたビットマップオブジェクトに対してサイズや位置の設定を行い、グラフィックリソースを関連付ける処理を行っています。

ビットマップオブジェクトのサイズとアンカーの設定

まず、ObjectSetInteger関数を使用して、ビットマップオブジェクトの幅と高さを設定します。この関数は、オブジェクトに整数型のプロパティを設定するために使用されます。

1つ目のObjectSetInteger関数では、OBJPROP_XSIZEというプロパティを指定し、ビットマップオブジェクトの横幅をrc_widthで設定しています。この幅は、先に設定したリソースの幅に一致します。

2つ目のObjectSetInteger関数では、OBJPROP_YSIZEというプロパティを指定し、ビットマップオブジェクトの高さをrc_heightで設定しています。これもリソースの高さに一致しています。

次に、ビットマップオブジェクトのアンカーを設定します。アンカーとは、オブジェクトをどの位置に基づいて配置するかを決定するもので、ここではOBJPROP_ANCHORプロパティにANCHOR_CENTERを指定することで、オブジェクトの中央を基準に配置されるように設定しています。これにより、ビットマップオブジェクトが正確に中央に位置するようになります。

ビットマップオブジェクトにグラフィックリソースを関連付け

最後に、ObjectSetString関数を使用して、ビットマップオブジェクトにグラフィックリソースを関連付けます。

OBJPROP_BMPFILEというプロパティに、リソース名を指定します。リソース名には、リソースを示すために「::」を付けたrc_nameを指定しています。これにより、ビットマップオブジェクトに対して、先に作成したグラフィックリソースが正しく関連付けられます。

このコードにより、ビットマップオブジェクトが指定したサイズで正しい位置に配置され、関連付けられたリソースの内容がビットマップとしてチャート上に表示されます。

サンプルコード解説6:OnStart関数部分その6

 //--- 透明度200のDodgerBlue色を設定
  uint clr=ColorToARGB(clrDodgerBlue,200);  // 色をARGB形式で設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を指定された色で塗りつぶす
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新

  //--- 3秒待って画像の色を変更
  Print("Wait 3 seconds before changing color");
  Sleep(3000);  // 3秒待機
  
  //--- 透明度200のOrangeRed色に変更
  Print("Change color");
  clr=ColorToARGB(clrOrangeRed,200);  // 新しい色を設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を新しい色で塗りつぶす
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新

この部分のコードでは、ビットマップオブジェクトの色を変更し、リソースデータを更新する処理が行われています。特定の色を指定し、その色でピクセルデータを塗りつぶすことで、ビットマップの表示内容が変更されます。

透明度200のDodgerBlue色の設定

最初に、ColorToARGB関数を使用して、透明度200でDodgerBlue色を設定します。この関数は、色をARGB形式に変換するために使用され、ARGBは透明度を含む色情報を示します。ここで設定された透明度200は、完全に不透明ではなく、少し透けて見える状態を表しています。

次に、ArrayInitialize関数を使用して、ピクセルデータの配列rc_dataを指定された色で塗りつぶします。この時点で、ピクセルデータがすべてDodgerBlue色に変更されます。

その後、Update関数が呼び出され、rc_nameというリソース名で指定されたグラフィックリソースが、塗りつぶしたピクセルデータで更新されます。trueが指定されているため、更新が完了するとチャートが再描画され、色が反映されます。

色変更の待機と新しい色の設定

Print関数で「Wait 3 seconds before changing color」と出力し、Sleep関数で3秒間待機します。この間、ユーザーがビットマップの色を観察できるように時間を空けています。

次に、透明度200でOrangeRed色に変更します。再びColorToARGB関数を使い、今度はOrangeRed色をARGB形式に変換します。同じくArrayInitialize関数を使用して、ピクセルデータの配列rc_dataを新しいOrangeRed色で塗りつぶします。

最後に、再度Update関数を呼び出し、リソースデータを更新します。これにより、ビットマップオブジェクトが新しい色に変更され、チャート上に反映されます。

この一連の処理によって、ビットマップの色が時間とともに変更される様子が観察できます。

サンプルコード解説7:OnStart関数部分その7

 //--- 3秒待ってグラフィックリソースを解放
  Print("Wait 3 seconds before ResourceFree()");
  Sleep(3000);  // 3秒待機
  bool res=ResourceFree("::"+rc_name);  // リソースを解放
  Print("ResourceFree: ",res);  // 解放結果を表示
  
  //--- リソース解放後に色を変更してみる
  Print("Trying to change color to GreenYellow after ResourceFree()");
  clr=ColorToARGB(clrGreenYellow,200);  // 新しい色を設定
  ArrayInitialize(rc_data,clr);  // ピクセル配列を設定
  Update(rc_name,rc_data,rc_width,rc_height,true);  // リソースデータを更新
  Print("The color has not changed because the resource has been released");  // 色が変更されないことを確認
  
  //--- 3秒待ってビットマップオブジェクトを削除
  Print("Wait 3 seconds before deleting the Bitmap object");
  Sleep(3000);  // 3秒待機
  Print("Delete Bitmap object");
  ObjectDelete(0,obj_name);  // ビットマップオブジェクトを削除
 }
 

この部分のコードでは、作成されたグラフィックリソースを解放し、その後の動作を確認する処理が行われています。さらに、ビットマップオブジェクトの削除も行われます。

グラフィックリソースの解放

Print関数を使用して、「Wait 3 seconds before ResourceFree()」というメッセージを表示し、Sleep関数で3秒待機します。これにより、ユーザーはビットマップがリソースから解放される前にその状態を観察する時間が確保されます。

その後、ResourceFree関数を使用して、リソース名rc_nameに対応するグラフィックリソースを解放します。このリソース名には、「::」をプレフィックスとして付ける必要があります。ResourceFree関数が成功した場合にはtrueが返され、Print関数で「ResourceFree: true」というように、リソースが正常に解放されたことが表示されます。失敗した場合はfalseが返され、エラー情報が表示されます。

リソース解放後に色を変更してみる

リソースが解放された後、Print関数で「Trying to change color to GreenYellow after ResourceFree()」というメッセージを出力し、透明度200のGreenYellow色に変更しようとします。

再びColorToARGB関数を使い、GreenYellow色をARGB形式に変換します。そして、ArrayInitialize関数を使用して、ピクセル配列rc_dataを新しい色で塗りつぶします。しかし、既にリソースが解放されているため、このリソースに対する更新は効果がありません。

最後に、Print関数で「The color has not changed because the resource has been released」と表示し、色が変更されないことを確認しています。リソースが解放された後は、リソースに対する操作が無効になることがこのコードで示されています。

ビットマップオブジェクトの削除

さらに3秒待機した後、「Wait 3 seconds before deleting the Bitmap object」というメッセージを出力し、Sleep関数で再び3秒待機します。最後にObjectDelete関数を使用して、ビットマップオブジェクトを削除します。Print関数で「Delete Bitmap object」と表示することで、ビットマップオブジェクトの削除が確認されます。

この一連の処理により、グラフィックリソースを解放した後の動作確認ができ、リソースが解放された後に色を変更しようとしても無効であること、そしてビットマップオブジェクトの削除が行われることがわかります。

サンプルコード解説8:Update関数(オリジナル関数)

//+------------------------------------------------------------------+
//| グラフィックリソースデータを更新する関数                            |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
 {
  //--- 幅または高さが0の場合は処理を終了
  if(width==0 || height==0)
    return;
  
  //--- リソースデータを更新し、再描画
  if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
    ChartRedraw();  // チャートを再描画
 }

このUpdate関数は、指定されたグラフィックリソースデータを更新し、必要に応じてチャートを再描画するための関数です。ここでは、リソースの更新と再描画に関する重要な処理が行われています。

引数について

Update関数には4つの引数があります。各引数の詳細は以下の通りです。

  • res_name(リソース名)
  • 種類: 文字列
  • 説明: 更新対象のグラフィックリソースの名前を指定します。この名前は、ResourceCreate関数で指定されたリソース名と一致する必要があります。リソース名には「::」が付く場合があります。
  • pixel_data[](ピクセルデータの配列
  • 種類: 配列型(参照渡し
  • 説明: グラフィックリソースを更新するために使用されるピクセルデータを格納した配列です。配列内には、各ピクセルの色情報が含まれており、ARGBフォーマット(透明度を含む色)で表されます。この配列の内容に基づいて、リソースの表示内容が更新されます。
  • width(幅)
  • 種類: 符号なし整数型
  • 説明: グラフィックリソースの横幅をピクセル(デジタル画像を構成する最小の単位)単位で指定します。ピクセルデータの幅と一致する必要があります。この値が0の場合、リソースの更新は行われません。
  • height(高さ)
  • 種類: 符号なし整数型
  • 説明: グラフィックリソースの高さをピクセル単位で指定します。幅と同様に、ピクセルデータの高さと一致する必要があります。この値が0の場合、処理は終了します。
  • redraw(再描画のフラグ)
  • 種類: 真偽値型
  • 説明: この引数がtrueの場合、リソースデータを更新した後にチャートの再描画を行います。再描画を行うことで、リソースの更新が即座に画面上に反映されます。falseを指定した場合、再描画は行われません。

幅または高さが0の場合の終了処理

最初に、渡された幅(width)または高さ(height)が0の場合、リソースデータの更新を行わずに関数を終了しています。これは、無効なサイズでの処理を防ぐための安全対策です。もし、幅や高さが0であれば、リソースは更新されず、それ以上の処理は行われません。

リソースデータの更新と再描画

次に、ResourceCreate関数を使用して、指定されたリソース名(res_name)とピクセルデータ(pixel_data[])、幅、高さを基にグラフィックリソースを更新します。この関数は、リソースが正常に作成または更新された場合にtrueを返し、そうでない場合はfalseを返します。

ピクセルデータには、以前に設定した色や透明度が含まれており、それを基にリソースデータが更新されます。この処理により、グラフィックリソースがチャート上に正しく反映されることが期待されます。

関数引数として渡されるredrawフラグがtrueの場合、リソースの更新後にChartRedraw関数が呼び出され、チャート全体が再描画されます。再描画により、更新されたリソースが即座にチャート上に反映されるため、ユーザーが視覚的に変化を確認できるようになります。

この関数の役割

Update関数は、リソースデータの更新とチャートの再描画を簡潔に行うための関数として機能します。リソース名、ピクセルデータ、幅、高さを引数として受け取り、それに基づいてリソースを更新し、必要に応じて再描画を行うため、柔軟かつ効率的なグラフィック操作を実現しています。

タイトルとURLをコピーしました