MQL4の新しい構文 - ページ 6

 
SDC:

terminal_data_directoryにアイコンのパスを入れると、バーチャルストアのフォルダを指定していないのに、コンパイラが cannot open file in a virtual store folder というエラーになります。terminal_data_directoryにフォルダを指定しているのですが。

ソースコードと同じフォルダにファイルを置き、パスを一切指定せず、#property icon"MyIcon.ico "のみで動作させる方法しかありませんでした。


Hi just in case anyone has problem with#property icon "\MyIcon.ico", you should consider the size of the icon 96x96 px or higher.私もこのエラーを経験しましたが、現在は動作しています。
 

コンパイラが予想外のキャスティングを行うことに気づきました。

次のようなコードです。

ここで、キー オブジェクトのクラスはMT4String ですが、関数 getKey() はより一般的なクラスを返します。ボタン・ オブジェクトも同様です。明示的なキャストは省略されています。

元のコードはこのような感じです。

JAVAでは明示的なキャスティングが必要ですが、MQL4コンパイラはこの構文でもきちんと動作します。

この暗黙のキャストは、C++でも有効な機能なのでしょうか?それともバグでしょうか?

 

私はC++の専門家ではありませんが、基底クラスから子クラスへの移動はダウンキャスティングと呼ばれ、このページに よると、C++でもダウンキャスティングは明示的でなければならないようです。(Javaのように)?

MQL4では暗黙のダウンキャスティングが可能なので、これは「機能」なのか「バグ」なのかのどちらかです :)

もし「機能」だとすると、コンパイラは潜在的なエラーをコーダーに警告することができないので、あまり良い機能とは言えないでしょう。C++もJavaも明示的なダウンキャスティングを要求するのには理由があるのでしょうか?

さらに、MQL4では、オブジェクトのクラスをチェックする方法(例:instanceOfなど)が組み込まれていないため、独自の「タイプ」チェックを実装しない限り、ランタイムエラーは回避できないことになります...


Animal a;

Dog d;

...

if (a  instanceOf Dog) { // no built in check like this - we all have to roll our own??

 d = a;

}
 
ydrol:

私はC++の専門家ではありませんが、基底クラスから子クラスへの移動はダウンキャスティングと呼ばれ、このページに よると、C++でもダウンキャスティングは明示的でなければならないようです。(Javaのように)?

MQL4では暗黙のダウンキャスティングが可能なので、これは「機能」なのか「バグ」なのかのどちらかです :)

もし「機能」だとすると、コンパイラは潜在的なエラーをコーダーに警告することができないので、あまり良い機能ではないでしょう。C++もJavaも明示的なダウンキャスティングを要求するのには理由があるのでしょうか?

さらに、MQL4では、オブジェクトのクラスをチェックする方法(例:instanceOfなど)が組み込まれていないため、独自の「タイプ」チェックを実装しない限り、ランタイムエラーは回避できないことになります...




そうそう、instanceofや ".class " もありがたいのですが、私が気づいた限りでは、C++でも使えませんね。MQL4のデバッガでさえ、ウォッチしているオブジェクトの型はわかりません。MQL4のOOP機能は驚くほどよく実装されているので、これが唯一のバグであれば万々歳なのですが、あまり気になりません。ただ、既存のパターンに従っているのかどうかが気になったのですが、むしろバグだったようです。

 

ワンクリックトレード

昔のMT4では、ワンクリックでEAを作成するためのDLLファイルを使っていました。

パラメータを入力 することができます...LOT、TP、SLを直接白いテキストボックスに入力することができます。

購入または売却をクリックすると、私のEAはボックス内の入力テキストを読み取ります。

新しいMT4では、ボタン機能は あるが、そのようなテキストボックスを作成し、読み取る機能が見つからない。

 
WDholic:

昔のMT4では、ワンクリックでEAを作成するためのDLLファイルを使っていました。

パラメータを入力 することができます...LOT、TP、SLを直接白いテキストボックスに入力することができます。

購入または売却をクリックすると、私のEAはボックス内の入力テキストを読み取ります。

新しいMT4では、ボタン機能はありますが、そのようなテキストボックスを作成し、読み取る機能が見当たりません。

キーボード入力には、OBJ_EDITという オブジェクトタイプがあります。Enterキーを押すと、CHARTEVENT_OBJECT_ENDEDIT イベントが発生します。しかし、編集を終了するにはEnterキーしかないようです。例えば、オブジェクト境界の外側でマウスをクリックしても、編集は終了しません。そのため、ユーザーフレンドリーでないオブジェクトとしてデプロイすることができません。

さらに、初期値として空の文字列が与えられると、代わりに「編集」という自動テキストが表示され(しかもこの単語は編集可能)、実に紛らわしい。

 
void OnChartEvent(const int id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam){

   if(id==CHARTEVENT_OBJECT_ENDEDIT ){
   
      if(sparam=="pulsanteEdit") Print("The text in the Edit field of the object with name ",sparam," has been changed");
     } 
}
void creaPulsanteEdit(const string objNameIns,const string objText,int xDistance,int yDistance,int xSize,int ySize,color clrIns,color clrTextIns){
   
   if(!ObjectCreate(0,objNameIns,OBJ_EDIT,0,0,0)){ 
      stampaErrore("Errore creazione pulsante edit");
      return;
   }
   
   ObjectSetInteger(0,objNameIns,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_XDISTANCE,xDistance); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YDISTANCE,yDistance); 

   ObjectSetInteger(0,objNameIns,OBJPROP_XSIZE,xSize); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YSIZE,ySize);
   
//--- set the text 
   ObjectSetString(0,objNameIns,OBJPROP_TEXT,objText);
   ObjectSetString(0,objNameIns,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,objNameIns,OBJPROP_FONTSIZE,10);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_READONLY,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BGCOLOR,clrIns);
   ObjectSetInteger(0,objNameIns,OBJPROP_COLOR,clrTextIns);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BORDER_COLOR,LightSeaGreen);
   
//--- display in the foreground (false) or background (true) 
   ObjectSetInteger(0,objNameIns,OBJPROP_BACK,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_HIDDEN,false);
}

void OnTick(){

  creaPulsanteEdit("pulsanteEdit", string1, 10, 275,60,30,Black,LightSeaGreen);

  Print("string1: "+string1);
}

このボタンを作成して、その中のテキストを編集し、テキスト文字列を読み込んでdoubleまたはint変数に変換したいのですが、うまくいかず、"The text in the Edit field of the object with name" has been changed "が表示されません

と表示されます。