MQL ile yazılmış kullanıcı arayüzleri galerisi - sayfa 15

 
Nikolai Semko #:

Pyotr, seni anlamıyorum.

Sorulara cevap vermediniz. Programcıların çalışırken GUI ile nasıl etkileşime gireceklerini bilmeleri önemlidir. İşte GUI'mden bir örnek. Açık/koyu tema kısayoluna tıkladım ve bu olay hemen arka plan renklerini ve çizgilerini değiştirme işlevini tetikledi. Bu etkileşimi nasıl yapıyorsunuz?



" Kullanıcı kodumla (hiç) etkileşime gir meyecek . " ne anlama geliyor? Programcının kodla değil, kodun oluşturması gereken olaylarla etkileşime girmesi gerekir.

Güzel. Anlaşılır olması için sadece resim kullanmaya çalışacağım.

1.





2.


3.


4.

Seçenekler sayfamız ve penceredeki onay kutusu ve Internal_API dosyası:




5. Kullanıcı kodundaki pencere ve öğeler üzerinde eylemler gerçekleştirme:




6.


INTELLISENSE BİZE HER ŞEYİ ANLATIR!!!


 
TAMAM.

Örnek olarak web geliştirmeyi kullanarak farklı bir soru sormaya çalışacağım. Çünkü GUI'niz oluşturduğunuz işaretleme dili kullanılarak yazılır.
Web geliştirmenin de kendi işaretleme dili (HTML) ve stil dili (CSS) vardır. Eğer sadece HTML ile bir web sitesi oluşturduysanız, kontrolleri saf html ile oluşturabilirsiniz.




Ancak bu durumda site ölü olacaktır, çünkü kontroller çalışırken hiçbir şey olmayacaktır. Bir şeylerin olmasını sağlamak için, JavaScript ve addEventListener işlevini kullanarak her olay için bir işleyici koymanız gerekir İşte böyle bir işleyiciörneği: https:/ /www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Ana sorum yeniden ifade edilebilir: Kullanıcı çalışırken GUI tarafından oluşturulan olay işleyicisini programcı için nasıl uygularsınız?
Yani addEventListener 'ın analogu nedir? Dediğim gibi, GUI programatik olarak oluşturulduğunda, her kontrolün birfonksiyona bir işaretçi kullanılarak kendi olay işleyici fonksiyonuna atanması gerçeğiyle uyguladım.
 
Bir elemandan değer alma resminde hangi değişkene yazıldığını yazmayı unutmuşum. Kusura bakmayın uzun zamandır programlama yapmadım.))))))
 
Nikolai Semko #:
TAMAM.

Örnek olarak web geliştirmeyi kullanarak farklı bir soru sormaya çalışacağım. Çünkü GUI'niz oluşturduğunuz işaretleme dili kullanılarak yazılır.
Web geliştirmenin de kendi işaretleme dili (HTML) ve stil dili (CSS) vardır. Eğer sadece HTML ile bir web sitesi oluşturduysanız, kontrolleri saf html ile oluşturabilirsiniz.




Ancak bu durumda site ölü olacaktır, çünkü kontroller çalışırken hiçbir şey olmayacaktır. Bir şeylerin olmasını sağlamak için, JavaScript ve addEventListener işlevini kullanarak her olay için bir işleyici koymanız gerekir İşte böyle bir işleyiciörneği: https:/ /www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 Ana sorum yeniden ifade edilebilir: Kullanıcı çalışırken GUI tarafından oluşturulan olay işleyicisini programcı için nasıl uygularsınız?
Yani addEventListener için analogunuz nedir? Dediğim gibi, GUI programlı olarak oluşturulduğunda, her kontrolünişleve bir işaretçi kullanılarak kendi olay işleyici işlevine atanması gerçeğiyle uyguladım.

Nicholas, her şey çalışıyor. Daha sonra kendiniz deneyeceksiniz. Her şey düşündüğünüzden çok daha basit. Bu teknolojiyi kullanarak birçok çalışan arayüz yaptım. Yani... Yakında göreceksin.

 
Реter Konow #:

Nikolai, çalışıyor. Sonra kendin denersin. Düşündüğünden çok daha basit. Bu teknolojiyi kullanarak birçok çalışan arayüz yaptım. Yani... Yakında göreceksin.

Tamam. Bekliyorum. Bekliyor olacağım.
Bununla birlikte, örnekle anlamayı kolaylaştırmak için, lütfen GUI'nizin ayrı bir düğme şeklinde bağlandığı basit bir boş gösterge (veya Uzman Danışman) oluşturun, bastığınızda pencerenin arka plan rengi siyahtan beyaza ve beyazdan siyaha değişir. Renk değişikliğinin bağlı dosyalardan birinde değil, yalnızca gösterge gövdesinde gerçekleşmesi arzu edilir.
Çünkü programcı gerçekten kodunuza girmemelidir. Yazım kolaylığı için burada, düğmeye basıldığında program gövdesinde çalıştırılması gereken işlevin kodu verilmiştir:

void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}
 
Nikolai Semko #:

Tamam. Bekleyeceğim. Bekleyeceğim.
Bununla birlikte, örnekle anlamayı kolaylaştırmak için, lütfen GUI'nizin ayrı bir düğme şeklinde bağlandığı basit bir boş gösterge (veya Uzman Danışman) oluşturun, bastığınızda pencerenin arka plan rengi siyahtan beyaza ve beyazdan siyaha değişir. Renk değişikliğinin bağlı dosyalardan birinde değil, yalnızca gösterge gövdesinde gerçekleşmesi arzu edilir.
Çünkü programcı gerçekten kodunuza girmemelidir. Yazım kolaylığı için burada, düğmeye basıldığında program gövdesinde çalıştırılması gereken işlevin kodu verilmiştir:

Tamam. Anlaşılması için mümkün olan en basit uygulamayı yapacağım. Fırfırlar yok).

  • Gösterge
  • Göstergenin içinde bir kullanıcı penceresi bulunur
  • Pencerede bir düğme vardır
  • Düğme işlevinizi çağırır.
  • Tüm eylemler göstergenin gövdesine yazılır.
 
Реter Konow #:

Tamam. Anlaşılması için mümkün olan en basit uygulamayı yapacağım. Gösterişsiz).

  • Gösterge
  • Göstergenin içinde bir kullanıcı penceresi bulunur
  • Pencerede bir düğme vardır
  • Düğme işlevinizi çağırır.
  • Tüm eylemler gösterge gövdesine yazılır.

Harika! Teşekkür ederim.

 

Nikolay, gösterge gövdesinin içine bir işlev çağrısı yazamıyorum, çünkü işleyicisi Internal_API.mqh dosyasının içinde.

Yani, bu dosyadaki işleyicisinden düğmeye basma olayında işlevinizi çağırabilirim. Bununla birlikte, örneğin zamanlayıcı olayında düğme durumlarını gösterge gövdesinden programlı olarak ayarlayabilirim. Ama o zaman butona basmama gerek kalmıyor. Kısacası, farklı unsurlar var. Bazıları gösterge gövdesi içinde ele alınabilir (çoğunlukla etkileşimli olmayan öğeler, örneğin ilerleme çubuğu gibi) ve Internal_API.mqh dosyasında bir işleyiciye sahip olan ve oradan çalışanlar vardır. Durumları EA/gösterge gövdesinden programlı olarak ayarlanabilmesine rağmen.

Göreviniz tamamlandı. (beyaz kare ise - tıklayın)


Kod:

//+------------------------------------------------------------------+
//|                                                 Indicators 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include<GUI_DRIVE_2.mqh>
#include<MyProject_1\CORES.mqh>
#include<MyProject_1\Internal_API.mqh> 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------
   D_OnInit();
   //-------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //УСТАНОВИТЬ ВЫЗОВ В САМОМ НИЗУ, ПОД ПОЛЬЗ.КОДОМ.------------------
   //---------------------------
   RMSG(1);
   //---------------------------
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //УСТАНОВИТЬ ВЫЗОВ НА САМОМ ВЕРХУ, НАД ПОЛЬЗ.КОДОМ.---------------
   //----------------------------------------------------------------
   D_OnChartEvent(id,lparam,dparam,sparam);
   //----------------------------------------------------------------
  }
//+------------------------------------------------------------------+

/*void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[13] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}*/


void ChangeColorScheme(uint _color)
{
 ChartSetInteger(0,CHART_COLOR_BACKGROUND,_color);
}

Derleyici küfrettiği için fonksiyonunuzu yorumladım. Daha basit hale getirdim.


İşte Internal_API.mqh dosyasındaki kod



 

Bu arada, eklemelisiniz:

Internal_API.mqh dosyası kontrol işleyicileri içerir ve ÖZEL olarak bunları bağlamak için tasarlanmıştır.

Bu dosya kullanıcı için tasarlanmıştır ve motorun veya diğer kodlarımın bir parçası değildir.

 
Реter Konow kontrollerin işleyicilerini içerir ve bunları bağlamak için ÖZEL olarak tasarlanmıştır.

Bu dosya kullanıcıya yöneliktir ve motorun ya da diğer kodlarımın bir parçası değildir.

Anlıyorum, Peter.
Teşekkürler. Elbette bir geliştirici için uygun değil.
Çok fazla gereksiz kod ve hareket var. Yine de, bir işleve işaretçi içeren varyant çok daha iyi.