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

 
Nikolai Semko #:

Anlıyorum, Peter.
Teşekkür ederim. 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.

Neden sakıncalı olsun ki? Deneyeceksiniz ve sonra sonuç çıkaracaksınız.))

1. Yapıcı tüm eleman işleyicilerini kendi başına yazdırır, sadece onları bağlayın.

2. Intellisense gerekli fonksiyonları sağlar, sadece seçin.)))

3. Tüm kurallar basit, hatırlaması zor değil.

Sadece görsel editör daha kolay olabilir, ama bu daha sonra.

Not: 4 yıllık bir aradan sonra görevinizi 10 dakikada tamamladım. Geri kalan zamanda fonksiyonunuzun neden çalışmadığını anlamaya çalışıyordum ve sonra gif'i çekiyordum. )))
 
Реter Konow #:
Neden rahatsız edici? Deneyeceksiniz ve sonra sonuç çıkaracaksınız.))

1. Tüm eleman işleyicileri kurucunun kendisi tarafından yazdırılır, sadece onları takın.

2. Intellisense gerekli işlevleri sağlar, sadece birini seçin))

3. Tüm kurallar basit ve ezberlemesi kolaydır.


Sadece görsel editör daha kolay olabilir, ancak bu daha sonra.

Not: 4 yıllık bir aradan sonra görevinizi 10 dakikada tamamladım. Geri kalan zamanda fonksiyonunuzun neden çalışmadığını anlamaya çalıştım ve sonra gif'i çektim. )))

Bir geliştiricinin yazmak zorunda kalacağı Internal_API.mqh dosyanızın oldukça büyük ve karmaşık olduğunu görüyorum.



Tek düğmeli böyle bir görevde kaç satır kod olacak? Bir geliştiricinin GUI'sini normal şekilde, bir nesne oluşturarak geliştirmesi önemlidir. Örneğin, aşağıdaki gibi bir görevim var:

#resource "//Images//eclipse-alt.png" as uchar eclipse_alt[] // загружаем в ресурс изображение иконки с файла png
#include  <My\IconsMenu.mqh>

//+------------------------------------------------------------------+
IconsMenu menu(5,15,1,ANCHOR_RIGHT_UPPER,true,27, CheckBox, 0x00EEEEEE); // создаем меню
//+------------------------------------------------------------------+
void TimerMenu() { // таймер необходим для всплывающей подсказки
   menu.Timer();
}
//+------------------------------------------------------------------+
int OnInit() {
   InitMenu();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   menu.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
void InitMenu() {
   menu.SetTimerFunction(TimerMenu); // установка функции таймера
   bool dark_mode = W.Color!=0;      // определяем текущую цветовую схему чарта
   menu.AddPng(eclipse_alt,"dark/light theme",ChangeColorScheme,dark_mode); // создаем элемент кнопки-иконки
   menu.Draw();
}
//+------------------------------------------------------------------+
void ChangeColorScheme (bool checked) {
   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}
   };
   int clr_scheme = checked?1:0;

   if (checked) {
      menu.clr_off = 0x00606060;
      menu.clr_hover = 0x30808080;
   } else {
      menu.clr_off = 0x00EEEEEE;
      menu.clr_hover = 0x30FFFFFF;
   }
   menu.ChangeColorAll();
   menu.Draw();

   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();
}

GUI'nin oluşturulması ve özelleştirilmesi ile ilgili her şey sarı renkle vurgulanmıştır.
Başka bir şey yapmanıza gerek yok. Her yeni GUI öğesi, bu öğeden bir satır kod + olay işleyici işlevidir.



Dosyalar:
 
Nikolai, ben zaten her şeyi açıkladım.

1. Oluşturulan GUI kaydedilirken dosya otomatik olarak yazdırılır.

2. Kimse bunu özel olarak yazmaz.

3. Dosyanın içinde, kullanıcının biçimlendirme dilinde bildirdiği kontrollerin hazır işleyicileri bulunur.

4.. İşleyiciler motordan arayüz olaylarını alır.

5. Kullanıcı sadece kendi kodunu işleyicilere ekler.

Hepsi bu kadar. Kendimi tekrar etmeyeceğim, üzgünüm.

 
Реter Konow kontrollerin hazır işleyicileri vardır.

4.. İşleyiciler motordan arayüz olayları alır.

5. Kullanıcı sadece kendi kodunu işleyicilere ekler.

Bu kadar. Kendimi tekrar etmeyeceğim, üzgünüm.



Tamam, bu dosyayı sağlamadınız, bu yüzden varsayımlarda bulundum. Tüm dosyaları içeren sürümü bekleyeceğiz, böylece canlı olarak test edebiliriz.

 
Kaç satır kod sorusu hakkında.

Sorununuzu çözerken, işleyiciye intellisense'den 2 satır ekledim. Resimde gösterilmiştir. Sadece parantez içinde renklerin adını yazdım. Ve iki satır fonksiyon (sizinki yerine). Başka bir şey yok.
 
Yayınlamadan önce kodu "temizliyorum", motoru "yeniden inşa ediyorum", gereksiz şeyleri kaldırıyorum (eğer bulabilirsem), aynı zamanda her şeyin nasıl çalıştığını hatırlıyorum.

Genel olarak, yakında yayınlayacağım.
 
Реter Konow # :
Yayınlamadan önce kodu "temizliyorum", motoru "yeniden inşa ediyorum", gereksiz şeyleri kaldırıyorum (eğer bulabilirsem), aynı zamanda her şeyin nasıl çalıştığını hatırlıyorum.

Genel olarak, yakında koyacağım.

Sürümünüzü dört gözle bekliyorum, kodlama fikirlerinizi anlamak istiyorum.

 
Nikolai Semko # :

Peter, seni anlamıyorum. Sorulara cevap vermedin.
Programcıların çalışırken GUI ile nasıl etkileşime geçeceklerini bilmeleri önemlidir.
İşte benim 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, bu kodu oluşturması gereken olaylarla etkileşime girmesi gerekir.

Sonuçta, GUI ayrı bağımsız bir program değildir. GUI, nihayetinde geliştiricinin ana programıyla etkileşime girmelidir. Bir gösterge veya EA olsun.

Resimlerinizde gösterdiğiniz GUI harika, bunu nasıl başardığınızı bize anlatabilir misiniz?

 
hini #:

Sürümünüzü dört gözle bekliyorum, kodlama fikirlerinizi anlamak istiyorum.

Tamam.

Sürüm hakkında küçük bir açıklama yapacağım. 4 yıllık bir aradan sonra motorun son sürümü kayboldu. Hemen fark edilmedi. Eski sürüm çalışıyor, ancak builder sürümüne yükseltme yapılması gerekiyor. Bunun için biraz unuttuğum kodun yeterince derinine inmem gerekiyor. Ancak, bu büyük bir sorun değil ve bitecek.

Motorla ilgili gecikme nedeniyle, sürümün 2 parçaya bölünmesine karar verdim. İlk olarak, yapıcıyı göstereceğim. İsteyenler işaretleme diline aşina olacak ve gerekli GUI'yi yazacak. Bir süre sonra halka güncellenmiş motoru vereceğim. Bundan sonra, oluşturulan GUI'yi bağlamaya yardımcı olacağım ve özel Uzman Danışmanlar veya göstergelerle birlikte çalışacak. Daha sonra herkes biçimlendirme dili ile çalışmanın basit ilkelerini ve arayüze uygulamalarına bağlanma yöntemlerini öğrenecek.

İki bölümlü bir sürüm yapmak daha kolay çünkü kurucu neredeyse piyasaya sürülmeye hazır ve motor biraz değişiklik gerektiriyor.

Elbette, işaretleme kodu örneklerini ve bunları yazmak için ek talimatları yapıcının yayınlanmasıyla birlikte sağlayacağım.

Hafta sonu için bekleyin).
 
Yukarıdakilere bir açıklama eklemek istiyorum: tasarımcının yayınlanmasından sonra, GUI'lerini doğrudan ME'den anında tasarlamak isteyenler.

1. Bunu yapmak için, sürüm yapısından "KIB-source.mqh" dahil etme dosyasını açacaklar.

2. Bunu göstergeler klasörüne kaydedecekler ve bundan sonra derleyecekler.

3. Sonuç olarak, MT5 navigatör şubelerinde "KIB-source.ex5" adlı yeni bir gösterge görecekler ve bunu ücretsiz bir grafiğe atacaklar.

4. Kullanıcı, MQL5 navigatöründe\include\... klasöründe işaretleme kodu içeren dosyalar için.

Örneğin, MQL5\include\My_GUI\Project_1\.....

Bu klasörde projelerinin arayüzü ile dosyaları saklayacaktır. Bunlarda ayrıca işaretleme kodu üzerine UI yazacak, düzenleyecek, deneyecek ve tasarlayacaktır.

5. UI oluştururken işaretleme dili ile çalışırken, sonucun MT5 grafiğinde görüntülendiğini belirtmek önemlidir; burada "KIB-source.ex5" göstergesi ve Uzman Danışman (kurucu) "KIB.ex5", ilk sürümde sağlayacağım. Her ikisi de aynı grafikte olmalıdır.

Ayrıca (çok önemli), ME'de paralel olarak açılan "KIB-source.mq5" dosyasının derlenmesi sırasında (özel GUI projesinin dosyalarıyla birlikte), tüm biçimlendirme kodu aynı grafikteki yapıcıya gönderilir ve GUI'yi tamamen yeniden oluşturur. Bu işlem, arayüzdeki pencere ve öğe sayısına bağlı olarak 200 ms ila 1000 ms arasında sürer. Ve kullanıcı yapılan değişikliklerin sonucunu hemen görür. Her şey çok hızlı ve neredeyse gerçek zamanlı olarak gerçekleşir - biçimlendirme kodunda değişiklikler yaparsınız, "KIB-source.mq5" dosyasını derlersiniz ve bir saniye içinde sonucu MT5 grafiğinde görürsünüz. Bu nedenle, iki monitörde çalışmak arzu edilir. Birinde MT5, diğerinde ME açıktır.

6. İşaretleme dilinin rahatlığı, basitliği ve pencereler veya projeler arasında kolayca kopyalanabilen öğe ve pencere şablonları oluşturma yeteneğidir.

7. Tasarımcının arşivde açık kaynak olduğunu da eklemek isterim. Bu nedenle, kullanıcı aşağıdaki görevleri yerine getirecektir:

1. Arşivi açın.
2. KIB klasörünü MQL5\include\ klasörüne yerleştirin.
3. CONNECTION.mqh dosyasını arşivden MQL5\inlude\ klasörüne yerleştirin (alt klasörlere koymayın).
4. KIB.mq5 dosyasını MQL5\Experts\ klasörüne koyun, ME'de açın, derleyin ve kaydedin, böylece KIB.ex5 Uzman Danışmanı MT5 navigatöründe görünür.
5. Bu Uzman Danışmanı KIB-source.mq5 göstergesi ile aynı grafiğe yükleyin.
6. Bundan sonra, ME'deki KIB.mq5 kurucu dosyası kapatılabilir. Artık gerekli olmayacaktır.


Her şey çalışmaya hazır.