//+------------------------------------------------------------------+//| Язык разметки KIB |
//| |//| |//+------------------------------------------------------------------+//---------------------------------//УРОК 1. //---------------------------------//---------------------------------//СОДЕРЖАНИЕ://---------------------------------1. СОЗДАНИЕ ФОРМЫ ОКНА.
2. ПРАВИЛА СОЗДАНИЯ ГРУПП ЭЛЕМЕНТОВ.
3. ПРАВИЛА СОЗДАНИЯ ЭЛЕМЕНТОВ.
4. ТИПЫ ЭЛЕМЕНТОВ.
//---------------------------------//--------------------------------------------------------------------------------------------------+//1. СОЗДАНИЕ ФОРМЫ ОКНА: //--------------------------------------------------------------------------------------------------+
ПОСЛЕДОВАТЕЛЬНОСТЬ КОММАНД:
1. ОБЪЯВЛЯЕМ НОВОЕ ОКНО: NEW_WINDOW,
2. ИМЕНУЕМ ОКНО: W_NAME, "Window 1",
3. ВЫБИРАЕМ ИКОНКУ ОКНА ИЗ ОКНА ИКОНОК КОНСТРУКТОРА (ВЫЗЫВАЕТСЯ ДАБЛ-КЛИКОМ НА ГРАФИК) И ПРОПИСЫВАЕМ : W_LABEL, "::Images\\some_icon.bmp",
4. УСТАНАВЛИВАЕМ ТИП ОКНА - W_TYPE, SETTINGS, (ИЛИ DINAMIC, MENU, DIALOG).
//--------------------------------------------------------------------------------------------------+
NEW_WINDOW, W_NAME, "Window 1", W_LABEL, "::Images\\some_icon.bmp", W_TYPE, SETTINGS,
//--------------------------------------------------------------------------------------------------+5. ПОСЛЕ ОБЪЯВЛЕНИЯ ОКНА, ЗАВЕРШАЕМ ЕГО КОММАНДОЙ END_WINDOW,
//--------------------------------------------------------------------------------------------------+//---------------------------------------------------------------------------------------------------
ОБЪЯВЛЕНИЕ ГРУПП ЭЛЕМЕНТОВ:
//---------------------------------------------------------------------------------------------------1. ВСЕ ЭЛЕМЕНТЫ СУЩЕСТВУЮТ ТОЛЬКО В СВОИХ ГРУППАХ.
2. ВСЕ ГРУППЫ ОБЪЯВЛЯЮТСЯ КОММАНДОЙ GROUP И ОБЯЗАНЫ ИМЕТЬ ИМЯ. (ЕСЛИ ИМЯ НЕСУЩЕСТВЕННО, СТАВИТЬ А. без кавычек)
GROUP, "Main tabs", или GROUP, A,
3. ВСЕ ГРУППЫ ЗАВЕРШАЮТСЯ КОММАНДОЙ END_GROUP.
4. ПОСЛЕ END_GROUP ПИШЕТСЯ ПОЗИЦИЯ ГРУППЫ И СВОЙСТВА ЭЛЕМЕНТОВ.
5. ГРУППА ОБЯЗАНЫ БЫТЬ ПОЗИЦИОНИРОВАНА. ДЛЯ ЭТОГО ИСПОЛЬЗУЕТСЯ ПРОСТОЙ МЕТОД:
i,(символ группы), AT, (ПОЗИЦИЯ) _Х2 Х, (ТИП ПРИВЯЗКИ) "name", (ИМЯ ОБЪЕКТА ПРИВЯЗКИ) 0 (ПОПРАВКА) И ТОЖЕ САМОЕ ДЛЯ ОСИ Y.
//--------------------------------------------------------------------------------------------------+
i, AT, _X2X, "MF", 5, _Y2Y, "MF",5, ("MF" - ОЗНАЧАЕТ MAIN FRAME ОКНА, 5 - ПОПРАВКА)
//--------------------------------------------------------------------------------------------------+ //--------------------------------------------------------------------------------------------------+
ПРИНЦИПЫ ПОСТРОЕНИЯ ГРУПП:
1. ЖЕЛАТЕЛЬНО, СТРОИТЬ ТАБЛИЧНУЮ РАСКЛАДКУ ЭЛЕМЕНТОВ ВНУТРИ ГРУПП - СТАВИТЬ РАВНОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ В РЯДУ, - ОДНАКО, МОГУТ БЫТЬ ИСКЛЮЧЕНИЯ.
2. СТРОКА ОБЪЯВЛЕНИЙ ЭЛЕМЕНТОВ - ЭТО РЯД. (Ряд начинается со знака __,).
3. КАЖДЫЙ ЭЛЕМЕНТ ОБЯЗАН ИМЕТЬ ИМЯ. ЭТО МОЖЕТ БЫТЬ ИМЯ СОБСТВЕННОЕ ИЛИ АБСТРАКТНОЕ A. ИМЯ СОБСТВЕННОЕ СТАВИТСЯ В КАВЫЧКИ.
4. ВНУТРИ СТРОКИ ОБЪЯВЛЯЕНИЯ ЭЛЕМЕНТОВ, МОЖНО ПРОПИСЫВАТЬ УСТАНОВКИ ИХ ИНДИВИДУАЛЬНЫХ СВОЙСТВ.
5. ПРИ УСТАНОВКИ СВОЙСТВ ВНУТРИ СТРОКИ ЭЛЕМЕНТОВ, СВОЙСТВА ПЕРЕЧЕСЛЯЮТСЯ ЧЕРЕЗ ЗНАК _, КОТОРЫЙ ОТСЫЛАЕТ КОНСТРУКТОР К НУЖНОМУ ЭЛЕМЕНТУ.
__, M_ITEM, "M_ITEM 1", N_LABEL,"::Images\\some_icon.bmp", _,N_COLOR,(int)clrWhite,_,NB_COLOR,(int)clrWhite,_,AB_COLOR,(int)clrWhite, _,KC_TEXT,"Cntrl+Shift",
В ИТОГЕ ПОЛУЧАЕТСЯ ЦЕПОЧКА СВОЙСТВ. ЕЕ МОЖНО ПЕРЕНОСИТЬ МЕЖДУ ЭЛЕМЕНТАМИ ИЛИ КОПИРОВАТЬ.
6. ДЛЯ ЗАДАНИЯ ДИСТАНЦИИ МЕЖДУ ЭЛЕМЕНТАМИ В ГРУППЕ ИСПОЛЬЗУЙТЕ СЛОВА X_GAP, Y_GAP. СТАВЬТЕ ИХ ПОСЛЕ ЗАВЕРШЕНИЯ ГРУППЫ.
//-------------------
i, X_GAP, 5,
i, Y_GAP, 5,
//------------------- //--------------------------------------------------------------------------------------------------+
!!! КРАЙНЕ ВАЖНО: ЗАПРЕЩЕНО ДАВАТЬ ЭЛЕМЕНТАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА.
ЗАПРЕЩЕНО ДАВАТЬ ГРУППАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА.
ИСПОЛЬЗОВАНИЯ A ВМЕСТО ИМЕНИ НЕ ПРИВОДИТ К СОВПАДЕНИЮ ИМЕН.
//----------------------------------------------------------------
ПРИМЕР ПОСТРОЕНИЯ ГРУППЫ:
//--------------------------------------------------------------------------------------------------+
GROUP, A,
__, CHECKBOX, "Checkbox 1", CHECKBOX, "Checkbox 2",
__, CHECKBOX, "Checkbox 3", CHECKBOX, "Checkbox 4",
__, CHECKBOX, "Checkbox 5", CHECKBOX, "Checkbox 6",
__, CHECKBOX, "Checkbox 7", CHECKBOX, "Checkbox 8",
END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10,
i, X_GAP, 30,
i, Y_GAP, 20,
//--------------------------------------------------------------------------------------------------+
!!! НЕ ЗАБЫВАЙТЕ ЗАВЕРШАТЬ ОКНА КОММАНДОЙ END_WINDOW И ГРУППЫ END_GROUP.
//----------------------------------------------------------------------------------
NEW_WINDOW, //Объявление окна. (Писать ОБЯЗАТЕЛЬНО)
W_NAME, "Demo window 1", //Название окна. (Тоже ОБЯЗАТЕЛЬНО)
W_ICON, "::Images\\16x16\\Database.bmp", //Иконка окна. (Указывать необязательно)
W_TYPE, SETTINGS, //Тип окна.(ОБЯЗАТЕЛЬНО)
OOI, //Флаг открытия окна при инициализации.(Указывать необязательно)
MARGINS, 30,30, //Правый и нижний отступ рамки окна. (Указывать необязательно)//----------------------------------------------------------------------------------
GROUP, A, //Объявление группы элементов. Абстрактное имя (А). Писать обязательно.
__, CHECKBOX, "Some checkbox 1", D_LIST, "Some list 1", //Ряд 1
__, R_BUTTON, "Some radio button 1", R_BUTTON, "Some radio button 2", //Ряд 2
END_GROUP, //Завершение группы элементов. Ставить обязательно.
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10, //Позиция всех группы элементов в окне относительно левого верхнего края.
i, X_GAP, 30, //Промежутки между элементами по оси Х.
i, Y_GAP, 30, //Промежутки между элементами по оси Y. //----------------------------------------------------------------------------------
GROUP, A,
__,L_ITEM, "L_ITEM 1",
__,L_ITEM, "L_ITEM 2",
__,L_ITEM, "L_ITEM 3",
__,L_ITEM, "L_ITEM 4",
__,L_ITEM, "L_ITEM 5",
__,L_ITEM, "L_ITEM 6", ON, //Включаем один из элементов списка по умолчанию.
__,L_ITEM, "L_ITEM 7",
__,L_ITEM, "L_ITEM 8",
__,L_ITEM, "L_ITEM 9",
__,L_ITEM, "L_ITEM 10",
__,L_ITEM, "L_ITEM 11",
__,L_ITEM, "L_ITEM 12",
__,L_ITEM, "L_ITEM 13",
__,L_ITEM, "L_ITEM 14",
__,L_ITEM, "L_ITEM 15",
END_GROUP,
//-------------------------
i, IN,"Some list 1", //Указание в каком списке будут находиться элементы.
i, AT, LEFT_TOP, 0,0, //Флаг позиции элементов группы наканвасе(Писать ОБЯЗАТЕЛЬНО)
i, Y_GAP, 2, //Дистанция между пунктами списка. Есть значение по умолчанию. Можно явно задавать свое.//----------------------------------------------------------------------------------
END_WINDOW, //(Писать ОБЯЗАТЕЛЬНО)
簡単なコードの例:
一度始めたことは、最後までやり遂げなければならない。たとえ誰も必要としていなくても。それが原則だ。
それが原則だ。インターフェイスが描かれるだけでなく、使われるようになれば。私はそう願っている。
必要。インターフェイスが描かれるだけでなく、使われるようになれば。願わくば。
もちろんだ。それを目指しているんだ。
この分岐を複数の言語で複製することは、もちろん非ロシア語話者にとって厳しい試練です。 前置きが長くなりましたが、いくつか質問してもいいですか? あなたのGUIはクラスを使わずに作成されているため、いくつかの不確定要素が一度に生じます。 結局のところ、製品としてのGUIにまず要求されるべきことは何でしょうか? それは、GUIを作成する際の利便性と直感性、そして作業の過程で便利に使用できることです。 この点について:
質問1
プログラマがGUIの一部でイベント処理を行うには、どのような仕組みがあるのでしょうか? 例えば、私のGUIでは、コントロールを 作成するときに、そのコントロールに変更イベントが発生したときに、ハンドラ関数へのポインタを追加します。 コード例です:
質問2
プログラマーはどのように特定のGUI要素の状態にアクセスできますか? 例えば、私のGUIではチェックボックス(bool)の状態を次のように取得できます。
しかし、私はネストされたクラスを使っています。 どうやるのですか?
質問2
プログラマーはどのように特定のGUI要素の状態にアクセスできますか? 例えば、私のGUIではチェックボックス(bool)の状態を次のように取得できます:しかし、私はネストされたクラスを使っています。 どうやるのですか?
ニコラス
順番にお答えします:
1.ユーザーは私のコードと対話する必要はありません。 その必要はありません。 その理由は後でわかります。 ユーザーが必要なのはマークアップ言語だけです。.(このことは以前にも何度か強調したことがあるが、プログラマーからはいつも繰り返しこの質問を受ける。その理由は、ユーザーはコンストラクタ・コードのdefineで定義された言語キーワードを使って配列を「初期化」するだけだからです。インタープリター(インジケーター)は、マークアップ・コード(上で示したもの)を含む配列をコンストラクター(同じチャート上のEAです)に送り、コンストラクターは配列を読み取ってGUIを構築します。 マークアップ言語コードはコンストラクターに対する命令です。 コンストラクタはそれに従って構築(描画、要素パラメータの初期化、設定など)を行います。
2.仕組みは単純である。インターフェイスの編集が終わると、ユーザーは図表をダブルクリックしてコンストラクタのコンテキスト・メニューを呼び出し、保存オプションを選択します。コンストラクターはすべての情報を2つのファイルに出力する。これらのファイルはエンジンによって使用される。
詳しく説明しますと、ユーザーはコンストラクタとエンジン(私が提供します)から受け取った2つのファイルを自分のEAに接続します(EAのヘッダーに接続の例を示します)。次に、OnInit()、OnTimer()、OnChartEvent()、OnDeinit()の各関数で、いくつかのコールを記述します(例を示します)。次に、コンストラクタが出力する Internal_API というファイルに入る。このファイルには、GUIコントロールをExpert Advisor/ユーザー・インジケータに接続するために必要なものがすべて含まれています。つまり、要素の生成関数と詳細な指示です。後で接続例を示します。
繰り返しますが、複雑なことは何もありません。すべてが揃っています。例えば、上記のインターフェイスでどのように見えるかを示します:
1.ウィンドウを書く。
2.以下の指示に従う:
3.
4.InternalAPIファイルを開き、接続を開始します。ファイルにはすべてが含まれています。
ユーザーは、OnGuiEvent()関数の条件に自分の行動を書くだけでよい。 残りは触る必要は ない。
コントロールの状態を切り替えたり、値を取得/設定したりするには、コンストラクタで生成された関数を使用します。
上のファイルコードから、ユーザーはこの部分しか操作していない:
ニコラス、こんにちは!
順番に答えるよ:
1.ユーザーは私のコードと対話する必要はない。 その必要はない。 次にその理由を説明しよう。 ユーザーが必要なのはマークアップ言語だけだ.(このことは以前にも何度か強調したことがあるが、プログラマーからはいつも繰り返しこの質問を受ける。その理由は、ユーザーはコンストラクタ・コードのdefineで定義された言語キーワードを使って配列を「初期化」するだけだからだ。インタープリター(インジケーター)は、マークアップ・コード(上で示したもの)を含む配列をコンストラクター(同じチャート上のEAです)に送り、コンストラクターは配列を読み取ってGUIを構築します。 マークアップ言語コードはコンストラクターに対する命令です。 コンストラクタはそれに従って構築(描画、要素パラメータの初期化、設定など)を行います。
2.仕組みは簡単です。インターフェイスの編集を終えた後、ユーザーは図表をダブルクリックしてコンストラクタのコンテキスト・メニューを呼び出し、保存オプションを選択します。コンストラクターはすべての情報を2つのファイルに出力する。これらのファイルはエンジンによって使用される。
詳しく説明しますと、ユーザーはコンストラクタとエンジン(私が提供します)から受け取った2つのファイルを自分のEAに接続します(EAのヘッダーに接続の例を示します)。次に、OnInit()、OnTimer()、OnChartEvent()、OnDeinit()の各関数で、いくつかのコールを記述します(例を示します)。次に、コンストラクタが出力する Internal_API というファイルに入る。このファイルには、GUIコントロールをExpert Advisor/ユーザー・インジケータに接続するために必要なものがすべて含まれています。つまり、要素の生成関数と詳細な指示です。後で接続例を示します。
繰り返しますが、複雑なことは何もありません。すべてが揃っています。例えば、上のインターフェイスでどのように見えるかを示します:
1.ウィンドウを書きました。
2.以下の指示に従ってください:
3.
4. InternalAPI ファイルを開き、接続を開始します。ファイルにはすべてが含まれています。
ユーザはOnGuiEvent()関数の条件で自分のアクションを指定するだけでよい。 残りは触る必要は ない。
コントロールの状態を切り替えたり、値を取得したり設定したりするには、コンストラクタで生成された関数を使用する。
ピーター、私はあなたを理解していない。
プログラマーにとって、作業中にGUIとどのようにインタラクションするかを知ることは重要です。 ここに私のGUIの例を示します。私は明暗テーマのショートカットをクリックし、このイベントはすぐに背景色と線を変更する機能をトリガーしました。このインタラクションはどのように行うのですか?
ユーザーは私のコードと(まったく)インタラクションしない」とはどういう意味 でしょ うか? プログラマーはコードとではなく、コードを生成するイベントとインタラクションする必要があります。 結局のところ、GUIは独立したプログラムではありません。GUIは最終的に開発者のメインプログラムと相互作用しなければなりません。それがインジケーターであれEAであれ。