【MQL4定数】テキスト整列の定数(ENUM_ALIGN_MODE)

【辞書】MQLリファレンス

テキスト整列の定数

テキスト整列の定数は、テキストの整列を設定するときに使われます。

主に、ObjectSetInteger関数です。

簡単に関数の説明です。

  • ObjectSetInteger関数:オブジェクトの状態を設定する

 

それぞれ、OBJPROP_ALIGNの設定値として、テキスト整列の定数が使われます。

 

テキスト整列の定数(ENUM_ALIGN_MODE)

定数説明
ALIGN_LEFT左揃え
ALIGN_CENTER中央揃え
ALIGN_RIGHT右揃え

 

テキスト整列の定数の使い方

主に、ObjectSetInteger関数で使用されます。

それぞれ、OBJPROP_ALIGNの設定値として、テキスト整列の定数が使われます。

上記の定数を入力しましょう。

すると、その定数に対応した整列方法になります。

例えば、以下のように使用します。

  //ObjectSetInteger関数
  //テキストを左揃えに設定
   bool objectSetInteger = ObjectSetInteger(ChartID(), "自動売買を作ろう!", OBJPROP_ALIGN, ALIGN_LEFT);

 

返り値はbool型です。

成功すればture、失敗すればfalseが返ってきます。

 

実用的なプログラム例

ここからは、テキスト整列の定数を使った実用的なプログラム例を紹介します。

例1:エディットボックスを作成して整列を設定する

OBJ_EDITオブジェクト(テキスト入力欄)を作成し、テキストの整列方法を中央揃えに設定する例です。チャート上に入力欄を表示する場面で活用できます。

//+------------------------------------------------------------------+
//| エディットボックスを作成し、中央揃えに設定するサンプル           |
//+------------------------------------------------------------------+
void OnStart()
  {
   // オブジェクト名を定義
   string objName = "MyEditBox";

   // 既に同名オブジェクトがあれば削除
   if(ObjectFind(0, objName) >= 0)
      ObjectDelete(0, objName);

   // OBJ_EDIT(テキスト入力欄)をチャート上に作成
   // 座標はピクセル指定(左上からX:50, Y:50の位置)
   bool created = ObjectCreate(0, objName, OBJ_EDIT, 0, 0, 0);

   if(created)
     {
      // X座標(ピクセル)を設定
      ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 50);
      // Y座標(ピクセル)を設定
      ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 50);
      // 幅を200ピクセルに設定
      ObjectSetInteger(0, objName, OBJPROP_XSIZE, 200);
      // 高さを30ピクセルに設定
      ObjectSetInteger(0, objName, OBJPROP_YSIZE, 30);
      // フォントサイズを設定
      ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 12);

      // ★テキスト整列を中央揃えに設定★
      ObjectSetInteger(0, objName, OBJPROP_ALIGN, ALIGN_CENTER);

      // テキストの初期値を設定
      ObjectSetString(0, objName, OBJPROP_TEXT, "中央揃えテキスト");

      // チャートを再描画して反映
      ChartRedraw(0);

      Print("エディットボックスを中央揃えで作成しました");
     }
   else
     {
      Print("オブジェクトの作成に失敗しました");
     }
  }

 

例2:3種類の整列方法を比較表示するスクリプト

左揃え・中央揃え・右揃えの3つのエディットボックスを並べて作成し、整列の違いを視覚的に確認できるスクリプトです。

//+------------------------------------------------------------------+
//| 3種類のテキスト整列を比較表示するスクリプト                      |
//+------------------------------------------------------------------+
void OnStart()
  {
   // オブジェクト名の配列
   string objNames[]  = {"Edit_Left", "Edit_Center", "Edit_Right"};
   // 対応する整列定数の配列
   ENUM_ALIGN_MODE alignModes[] = {ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT};
   // 表示テキストの配列
   string texts[]     = {"左揃え(ALIGN_LEFT)", "中央揃え(ALIGN_CENTER)", "右揃え(ALIGN_RIGHT)"};

   // 3つのエディットボックスを縦に並べて作成
   for(int i = 0; i < 3; i++)
     {
      // 既存のオブジェクトがあれば削除
      if(ObjectFind(0, objNames[i]) >= 0)
         ObjectDelete(0, objNames[i]);

      // OBJ_EDITオブジェクトを作成
      bool created = ObjectCreate(0, objNames[i], OBJ_EDIT, 0, 0, 0);

      if(created)
        {
         // X座標を設定
         ObjectSetInteger(0, objNames[i], OBJPROP_XDISTANCE, 30);
         // Y座標を設定(40ピクセルずつ下にずらす)
         ObjectSetInteger(0, objNames[i], OBJPROP_YDISTANCE, 30 + i * 40);
         // 幅を300ピクセルに設定
         ObjectSetInteger(0, objNames[i], OBJPROP_XSIZE, 300);
         // 高さを30ピクセルに設定
         ObjectSetInteger(0, objNames[i], OBJPROP_YSIZE, 30);
         // フォントサイズを設定
         ObjectSetInteger(0, objNames[i], OBJPROP_FONTSIZE, 10);
         // 背景色を設定(見やすくするため)
         ObjectSetInteger(0, objNames[i], OBJPROP_BGCOLOR, clrWhite);

         // ★テキスト整列の定数を使って整列方法を設定★
         ObjectSetInteger(0, objNames[i], OBJPROP_ALIGN, alignModes[i]);

         // テキストを設定
         ObjectSetString(0, objNames[i], OBJPROP_TEXT, texts[i]);
        }
     }

   // チャートを再描画
   ChartRedraw(0);
   Print("3つの整列方法を比較表示しました");
  }

 

例3:口座情報パネルをインジケーターで表示する

チャート上に口座残高・有効証拠金・スプレッドなどの情報を右揃えで見やすく表示するインジケーターの例です。数値を右揃えにすることで、桁を揃えた見やすい表示になります。

//+------------------------------------------------------------------+
//| 口座情報パネルを表示するインジケーター                           |
//+------------------------------------------------------------------+
#property indicator_chart_window

// パネルに表示する項目数
#define PANEL_ROWS 4

// オブジェクト名のプレフィックス
string prefix = "InfoPanel_";

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
  {
   // ラベル(項目名)とエディットボックス(値)を作成
   string labels[]  = {"残高:", "有効証拠金:", "スプレッド:", "現在時刻:"};

   for(int i = 0; i < PANEL_ROWS; i++)
     {
      // --- 項目名用のラベル(左揃え)を作成 ---
      string labelName = prefix + "Label_" + IntegerToString(i);
      if(ObjectFind(0, labelName) >= 0) ObjectDelete(0, labelName);
      ObjectCreate(0, labelName, OBJ_EDIT, 0, 0, 0);
      ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 10);
      ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, 20 + i * 28);
      ObjectSetInteger(0, labelName, OBJPROP_XSIZE, 120);
      ObjectSetInteger(0, labelName, OBJPROP_YSIZE, 24);
      ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10);
      ObjectSetInteger(0, labelName, OBJPROP_BGCOLOR, clrDarkSlateGray);
      ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrWhite);
      ObjectSetInteger(0, labelName, OBJPROP_READONLY, true);
      // ★項目名は左揃え★
      ObjectSetInteger(0, labelName, OBJPROP_ALIGN, ALIGN_LEFT);
      ObjectSetString(0, labelName, OBJPROP_TEXT, labels[i]);

      // --- 値用のエディットボックス(右揃え)を作成 ---
      string valueName = prefix + "Value_" + IntegerToString(i);
      if(ObjectFind(0, valueName) >= 0) ObjectDelete(0, valueName);
      ObjectCreate(0, valueName, OBJ_EDIT, 0, 0, 0);
      ObjectSetInteger(0, valueName, OBJPROP_XDISTANCE, 130);
      ObjectSetInteger(0, valueName, OBJPROP_YDISTANCE, 20 + i * 28);
      ObjectSetInteger(0, valueName, OBJPROP_XSIZE, 150);
      ObjectSetInteger(0, valueName, OBJPROP_YSIZE, 24);
      ObjectSetInteger(0, valueName, OBJPROP_FONTSIZE, 10);
      ObjectSetInteger(0, valueName, OBJPROP_BGCOLOR, clrBlack);
      ObjectSetInteger(0, valueName, OBJPROP_COLOR, clrLime);
      ObjectSetInteger(0, valueName, OBJPROP_READONLY, true);
      // ★数値は右揃えで桁を揃える★
      ObjectSetInteger(0, valueName, OBJPROP_ALIGN, ALIGN_RIGHT);
      ObjectSetString(0, valueName, OBJPROP_TEXT, "---");
     }

   // タイマーを1秒間隔で設定(値の更新用)
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| タイマーイベントで値を更新                                        |
//+------------------------------------------------------------------+
void OnTimer()
  {
   // 各項目の値を更新
   ObjectSetString(0, prefix + "Value_0", OBJPROP_TEXT,
                   DoubleToString(AccountBalance(), 2));
   ObjectSetString(0, prefix + "Value_1", OBJPROP_TEXT,
                   DoubleToString(AccountEquity(), 2));
   ObjectSetString(0, prefix + "Value_2", OBJPROP_TEXT,
                   IntegerToString(MarketInfo(Symbol(), MODE_SPREAD)));
   ObjectSetString(0, prefix + "Value_3", OBJPROP_TEXT,
                   TimeToString(TimeCurrent(), TIME_SECONDS));

   // チャートを再描画
   ChartRedraw(0);
  }

//+------------------------------------------------------------------+
//| 終了処理                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // タイマーを停止
   EventKillTimer();

   // 作成したオブジェクトをすべて削除
   for(int i = 0; i < PANEL_ROWS; i++)
     {
      ObjectDelete(0, prefix + "Label_" + IntegerToString(i));
      ObjectDelete(0, prefix + "Value_" + IntegerToString(i));
     }
  }

//+------------------------------------------------------------------+
//| メイン処理(インジケーターとして必要)                            |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }

 

例4:EAのトレード状況ダッシュボードを表示する

EA(エキスパートアドバイザー)内でトレード状況をリアルタイムに表示するダッシュボードの例です。項目名を左揃え、数値を右揃えにすることで、情報を見やすく整理しています。

//+------------------------------------------------------------------+
//| EAのトレード状況ダッシュボード                                    |
//+------------------------------------------------------------------+

// ダッシュボードのオブジェクト名プレフィックス
string dashPrefix = "Dash_";

//+------------------------------------------------------------------+
//| ダッシュボード用のエディットボックスを1つ作成する関数             |
//| name : オブジェクト名                                             |
//| x, y : 表示位置(ピクセル)                                      |
//| width : 横幅(ピクセル)                                         |
//| text : 表示テキスト                                              |
//| align : テキスト整列方法                                         |
//| bgColor : 背景色                                                 |
//| textColor : 文字色                                               |
//+------------------------------------------------------------------+
void CreateDashEdit(string name, int x, int y, int width,
                    string text, ENUM_ALIGN_MODE align,
                    color bgColor, color textColor)
  {
   // 既存オブジェクトがあれば削除
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // OBJ_EDIT(テキスト入力欄)を作成
   ObjectCreate(0, name, OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, width);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, 22);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 9);
   ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bgColor);
   ObjectSetInteger(0, name, OBJPROP_COLOR, textColor);
   // 読み取り専用に設定(ユーザーが編集できないようにする)
   ObjectSetInteger(0, name, OBJPROP_READONLY, true);
   ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, clrGray);

   // ★テキスト整列の定数を適用★
   ObjectSetInteger(0, name, OBJPROP_ALIGN, align);

   // テキストを設定
   ObjectSetString(0, name, OBJPROP_TEXT, text);
  }

//+------------------------------------------------------------------+
//| ダッシュボードを初期化して表示する関数                            |
//+------------------------------------------------------------------+
void InitDashboard()
  {
   int startX = 10;   // ダッシュボード左端のX座標
   int startY = 15;   // ダッシュボード上端のY座標
   int rowH   = 26;   // 行の高さ(ピクセル)

   // タイトル行を中央揃えで作成
   CreateDashEdit(dashPrefix + "Title", startX, startY, 280,
                  "== トレード状況 ==", ALIGN_CENTER,
                  clrNavy, clrWhite);

   // 各行の項目名(左揃え)と値(右揃え)を作成
   string items[] = {"通貨ペア", "現在価格", "保有ポジション数",
                     "合計損益", "スプレッド"};

   for(int i = 0; i < 5; i++)
     {
      int y = startY + (i + 1) * rowH;

      // 項目名:左揃えで表示
      CreateDashEdit(dashPrefix + "L" + IntegerToString(i),
                     startX, y, 140,
                     items[i], ALIGN_LEFT,
                     clrDarkSlateGray, clrWhite);

      // 値:右揃えで表示(初期値は「---」)
      CreateDashEdit(dashPrefix + "V" + IntegerToString(i),
                     startX + 140, y, 140,
                     "---", ALIGN_RIGHT,
                     clrBlack, clrAqua);
     }
  }

//+------------------------------------------------------------------+
//| ダッシュボードの値を最新情報に更新する関数                        |
//+------------------------------------------------------------------+
void UpdateDashboard()
  {
   // 保有ポジション数と合計損益を計算
   int posCount = 0;
   double totalProfit = 0.0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         // 現在の通貨ペアのポジションのみカウント
         if(OrderSymbol() == Symbol())
           {
            posCount++;
            totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
           }
        }
     }

   // 損益に応じて文字色を変更(プラスは緑、マイナスは赤)
   color profitColor = (totalProfit >= 0) ? clrLime : clrRed;

   // 各値を更新
   ObjectSetString(0, dashPrefix + "V0", OBJPROP_TEXT, Symbol());
   ObjectSetString(0, dashPrefix + "V1", OBJPROP_TEXT,
                   DoubleToString(Bid, (int)MarketInfo(Symbol(), MODE_DIGITS)));
   ObjectSetString(0, dashPrefix + "V2", OBJPROP_TEXT,
                   IntegerToString(posCount) + " 件");
   ObjectSetString(0, dashPrefix + "V3", OBJPROP_TEXT,
                   DoubleToString(totalProfit, 2) + " " + AccountCurrency());
   // 損益の文字色を動的に変更
   ObjectSetInteger(0, dashPrefix + "V3", OBJPROP_COLOR, profitColor);
   ObjectSetString(0, dashPrefix + "V4", OBJPROP_TEXT,
                   IntegerToString((int)MarketInfo(Symbol(), MODE_SPREAD)) + " pt");

   // チャートを再描画して反映
   ChartRedraw(0);
  }

//+------------------------------------------------------------------+
//| ダッシュボードのオブジェクトをすべて削除する関数                  |
//+------------------------------------------------------------------+
void RemoveDashboard()
  {
   // プレフィックスが一致するオブジェクトをすべて削除
   int total = ObjectsTotal(0);
   for(int i = total - 1; i >= 0; i--)
     {
      string name = ObjectName(0, i);
      if(StringFind(name, dashPrefix) == 0)
         ObjectDelete(0, name);
     }
  }

 

例5:ボタンクリックでテキスト整列を切り替えるインジケーター

チャート上にボタンとテキスト表示欄を設置し、ボタンをクリックするたびにテキストの整列方法を左揃え→中央揃え→右揃えの順に切り替えるインジケーターです。OnChartEvent関数を使ったイベント処理の参考にもなります。

//+------------------------------------------------------------------+
//| ボタンクリックでテキスト整列を切り替えるインジケーター           |
//+------------------------------------------------------------------+
#property indicator_chart_window

// オブジェクト名の定数
#define BTN_NAME   "AlignSwitchBtn"    // ボタンのオブジェクト名
#define EDIT_NAME  "AlignSwitchEdit"   // テキスト表示欄のオブジェクト名
#define INFO_NAME  "AlignSwitchInfo"   // 現在の整列情報を表示するオブジェクト名

// 現在の整列モードを保持する変数(0=左, 1=中央, 2=右)
int currentAlignIndex = 0;

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
  {
   // --- 切り替えボタンを作成 ---
   if(ObjectFind(0, BTN_NAME) >= 0)
      ObjectDelete(0, BTN_NAME);
   ObjectCreate(0, BTN_NAME, OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_XDISTANCE, 30);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_YDISTANCE, 30);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_XSIZE, 140);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_YSIZE, 30);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_FONTSIZE, 10);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_BGCOLOR, clrSteelBlue);
   ObjectSetInteger(0, BTN_NAME, OBJPROP_COLOR, clrWhite);
   ObjectSetString(0, BTN_NAME, OBJPROP_TEXT, "整列を切り替え");

   // --- テキスト表示欄を作成(初期は左揃え) ---
   if(ObjectFind(0, EDIT_NAME) >= 0)
      ObjectDelete(0, EDIT_NAME);
   ObjectCreate(0, EDIT_NAME, OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_XDISTANCE, 30);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_YDISTANCE, 70);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_XSIZE, 300);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_YSIZE, 30);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_FONTSIZE, 11);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_BGCOLOR, clrWhite);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_COLOR, clrBlack);
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_READONLY, true);
   // ★初期値は左揃え★
   ObjectSetInteger(0, EDIT_NAME, OBJPROP_ALIGN, ALIGN_LEFT);
   ObjectSetString(0, EDIT_NAME, OBJPROP_TEXT, "サンプルテキスト ABC123");

   // --- 現在の整列状態を表示するラベルを作成 ---
   if(ObjectFind(0, INFO_NAME) >= 0)
      ObjectDelete(0, INFO_NAME);
   ObjectCreate(0, INFO_NAME, OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_XDISTANCE, 30);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_YDISTANCE, 108);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_XSIZE, 300);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_YSIZE, 24);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_FONTSIZE, 9);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_BGCOLOR, clrDarkSlateGray);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_COLOR, clrYellow);
   ObjectSetInteger(0, INFO_NAME, OBJPROP_READONLY, true);
   // ★情報ラベルは中央揃え★
   ObjectSetInteger(0, INFO_NAME, OBJPROP_ALIGN, ALIGN_CENTER);
   ObjectSetString(0, INFO_NAME, OBJPROP_TEXT,
                   "現在の整列: ALIGN_LEFT(左揃え)");

   ChartRedraw(0);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| チャートイベント処理(ボタンクリックを検出)                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   // オブジェクトクリックイベントかどうかを判定
   if(id == CHARTEVENT_OBJECT_CLICK)
     {
      // クリックされたのが切り替えボタンかどうかを確認
      if(sparam == BTN_NAME)
        {
         // 整列インデックスを次に進める(0→1→2→0のループ)
         currentAlignIndex = (currentAlignIndex + 1) % 3;

         // インデックスに応じた整列定数と表示名を決定
         ENUM_ALIGN_MODE newAlign;
         string alignText;

         switch(currentAlignIndex)
           {
            case 0:
               newAlign  = ALIGN_LEFT;
               alignText = "ALIGN_LEFT(左揃え)";
               break;
            case 1:
               newAlign  = ALIGN_CENTER;
               alignText = "ALIGN_CENTER(中央揃え)";
               break;
            case 2:
               newAlign  = ALIGN_RIGHT;
               alignText = "ALIGN_RIGHT(右揃え)";
               break;
            default:
               newAlign  = ALIGN_LEFT;
               alignText = "ALIGN_LEFT(左揃え)";
               break;
           }

         // ★テキスト表示欄の整列方法を変更★
         ObjectSetInteger(0, EDIT_NAME, OBJPROP_ALIGN, newAlign);

         // 情報ラベルに現在の整列方法を表示
         ObjectSetString(0, INFO_NAME, OBJPROP_TEXT,
                         "現在の整列: " + alignText);

         // ボタンの押下状態を解除
         ObjectSetInteger(0, BTN_NAME, OBJPROP_STATE, false);

         // チャートを再描画して反映
         ChartRedraw(0);

         Print("テキスト整列を変更しました: ", alignText);
        }
     }
  }

//+------------------------------------------------------------------+
//| 終了処理                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // 作成したオブジェクトを削除
   ObjectDelete(0, BTN_NAME);
   ObjectDelete(0, EDIT_NAME);
   ObjectDelete(0, INFO_NAME);
  }

//+------------------------------------------------------------------+
//| メイン処理(インジケーターとして必要)                            |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }