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

 
hini #:

Evet, önce tam bir program yayınlamak önemlidir.

Yapacağım.
 
Motor ve kurucunun tamamen işlevsel bir temel sürümü geçerli ve ulaşılabilir bir hedeftir. Net bir plan ve önceliklendirme gerektirir. Bu da planlara büyük görevler eklemenin sona ermesi ve acil sorunların çözülmeye başlaması anlamına gelir.

Yüksek katlı bir bina inşaatı ile bir benzetme yapmama izin verin. Ustabaşının tam olarak kaç kat inşa edilmesi gerektiğini bilmediği bir proje hayal edelim. Kendisine bilgi verilmediğini varsayalım. Ama o özünde bir yaratıcıdır - yaratıcı bir kişi. Umurunda değil. Ne kadar büyük olursa o kadar iyi. Yüksek evleri ve gökdelenleri seviyor. O çalışırken inşaat devam ediyor, katlar ekleniyor ve bina gökyüzüne doğru büyüyor. Ama daireler kiracılara teslim edilemiyor, çünkü iskeleler kaldırılmamış ve yaşam alanı temizlenmemiş. Kapılar bile takılmamıştır. Ev bitmemiş durumda. Ama ustabaşı için bunlar önemsiz şeyler. Yukarı bakıyor. Gökyüzüne. Ve kiracılar sabırsızlıkla bekliyor, dairelere ihtiyaçları var.

Genel olarak, ustabaşının "aygıt yazılımını değiştirmesinin" ve zihinsel olarak yeniden organize olmasının zamanı gelmiştir. Katları inşa etmeyi bırakın ve açıklıklara kapılar koymaya başlayın. Ve nihayet alanı temizlemeye, duvarları sıvamaya, parke döşemeye ve avizeler takmaya başlayın ....

Şöyle söyleyeyim: şimdilik zeminler inşa edilmeyecek. Bunun yerine, halihazırda inşa edilmiş olan zeminler bitirilecek. Çalışmalar, evin mümkün olan en kısa sürede kiracılara teslim edilmesini sağlayacak şekilde planlanacaktır.

Ne de olsa ev onlar için inşa edildi....


 

Herkese merhaba,

Son tartışmalar ışığında, Peter Konow'un projesinin sonuçlarını ve ilerlemesini forum yerine "Codebase "de belgelemeyi önermek istiyorum. Forum, tartışmalar ve anında geri bildirim için mükemmeldir, ancak projenin genel resmini ve tutarlı politikalarını sunmak için gereken yapı ve tutarlılıktan yoksundur.

Codebase'i kullanarak, ilgili tüm bilgilerin organize edilmesini, kolayca erişilebilir olmasını ve projenin durumuna ilişkin net bir genel bakış sunmasını sağlayabiliriz. Bu sadece netliğin korunmasına yardımcı olmakla kalmayacak, aynı zamanda tüm ekip üyeleri ve paydaşlar arasında daha iyi işbirliği ve anlayışı kolaylaştıracaktır.

Bu önerimi dikkate alırsanız çok memnun olurum.

 
Yutaka Okamoto projesinin sonuçlarının ve ilerlemesinin forum yerine Codebase'de belgelenmesini önermek istiyorum. Forum tartışma ve anında geri bildirim için harika, ancak büyük resmi ve projenin tutarlı politikalarını sunmak için gereken yapı ve tutarlılıktan yoksun.

Bir 'Kod Tabanı' kullanarak ilgili tüm bilgilerin organize edilmesini, kolayca erişilebilir olmasını ve projenin durumunun net bir resmini sunmasını sağlayabiliriz. Bu sadece netliğin korunmasına yardımcı olmakla kalmayacak, aynı zamanda tüm ekip üyeleri ve paydaşlar arasında daha iyi işbirliği ve anlayışı da teşvik edecektir.

Bu öneriyi dikkate alırsanız çok müteşekkir olurum.

Çok mantıklı bir öneri, teşekkür ederim. Kuşkusuz, kod tabanı güncellemeleri yayınlamak ve kullanıcılarla iletişim kurmak için uygundur. Projenin gelişimi için harika bir katkı. Geçmişte kod tabanını neredeyse hiç kullanmamış olmama rağmen, şimdi şartları ve koşulları keşfetmenin ve gereksinimlere uyum sağlamanın pratik anlamını görüyorum. Bu platformun olanakları ve sınırlamaları hakkında bir fikir edinmek için, topluluğun tanınmış üyelerinin projelerine bakacağım. Onları örnek alarak, projeyi kod tabanında bilgilendirici ve yetkin bir şekilde yürütebileceğim.

 

Bugün için planlanmış bir sürümüm var.

Ancak, bir forum üyesinin yararlı tavsiyesine uymaya ve yeni sürümü kod tabanında yayınlamaya karar verdim. Bunu doğru yapmak için, benzer yayınların örneklerini incelemek, projeyi forumda ve orada paralel olarak yürütmek için bir plan yapmak için birkaç güne ihtiyacım olacak. Ve ayrıca moderasyondan geçmek için.

Bu sürüm hakkında birkaç söz:

1. Bir kullanıcı programı ile grafik arayüzü arasında programatik etkileşim sistemi kavramsallaştırıldı ve uygulandı.

Daha fazla detay:

  • Teknik testler yapıldıktan ve sonuçlar analiz edildikten sonra, soyut global özellikler yerine eleman sarmalayıcı fonksiyonların kullanılmasına karar verildi. Anlaşıldığı üzere bu, algoritmaların grafik ortamla program bağlantısının en etkili ve basit çeşididir.
  • UIDATA.mqh ve API.mqh dosyalarının proje kaydetme ve yazdırma işlevlerine eklemeler yapıldı, böylece arayüzün her etkileşimli öğesi, proje kaydedildiğinde otomatik olarak bir sarmalayıcı işlevi alır.
  • Aynı zamanda, eleman sarmalayıcı fonksiyonları çok küçük bir gövdeye sahiptir ve ana görevleri üç ana parametreyi ( eleman numarası, değer ve özellik değeri) geçerek merkezi fonksiyonu çağırmaktır.
  • Fonksiyonların harici basitliği, uygulamalarının çok yönlülüğünü engellemez :

1. Boş parantezlerle çağrıldıklarında, fonksiyonlar eleman parametresinin değerini üç türden biriyle döndürür: int, double, string öğenin türüne bağlı olarak.

     int i    = w6_i_CHECKBOX_Some_checkbox(); //Элемент чекбокс. Буква i  после префикса означает что тип возвращаемого/устанавливаемого значения int.
     
     double d = w6_d_S_EDIT_Spin_the_value();  //Элемент поле ввода с кнопками. Буква d после префикса означает что тип возвращаемого/устанавливаемого значения double.

     string s = w7_s_EDIT_Comment_1();         //Элемент текстовое поле ввода. Буква s означает что тип возвращаемого/устанавливаемого значения string.

2. Parantez içinde bir değerle çağrıldığında, fonksiyonlar aktarılan değeri eleman parametresine ayarlar ve ardından yeniden çizer (değer, eleman türüne bağlı olarak int, double veya string olarak ayarlanır).

     int i    = w6_i_CHECKBOX_Some_checkbox(0/1/2/3); //Элемент чекбокс. Передача нуля,единицы, двойки или тройки для смены между нейтральным, активированным, нетр.блокир. и актив. блокир. состояниями элемента. 
                                                      //Тот же метод работает для всех кнопок.
     
     double d = w6_d_S_EDIT_Spin_the_value(653.89);   //Элемент поле ввода с кнопками. Передача значения параметра в функцию для установки его в элемент.

     string s = w7_s_EDIT_Comment_1("Any text");      //Элемент текстовое поле ввода. Передача текста для установки в поле ввода.   


3. İlk parametrenin varsayılan değeri ve bir özellik numarası (mevcut özelliklerden) ile çağrıldığında, fonksiyonlar elemanın bu özelliğinin değerini döndürür (tüm özellik numaraları int türündedir, özellik parametresinde geçirilir).

      int i = w6_i_BUTTON_Start(get_i,_A_COLOR); //Элемент Кнопка. Возврат значения цвета из свойства _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                  //Однако, данных тип функции принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).
                                                                  //Значение первого параметра get_i говорит функции что не нужно принимать значение первого параметра в расчет, а лишь вернуть значение свойства _A_COLOR.


4 .Parantez içinde değer ve özellik değeriile çağrıldığında,fonksiyonlar aktarılan değerleri elemanın mevcut özelliklerine ayarlar. Özelliknumarası özellik parametresinde, özellik değeri isedeğer parametresinde geçirilir.

     int i = w6_i_BUTTON_Start(C'255,0,0',_A_COLOR); //Элемент Кнопка. Передача и установка польз. значения цвета в свойство _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                      //Однако, тип функции этого элемента принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).


Fonksiyon-sarmalayıcı isimlerinin yapısı: w6_i_BUTTON_Start();

1. w tüm sarmalayıcı fonksiyonların baş harfidir. Pencerenin kısaltmasıdır.

2. 6 (veya başka bir sayı) - öğeyi içeren pencerenin sıra numarası.

3. i (d ya da s) - elemanın parametresinin döndürülen/ayarlanan değerinin türü anlamına gelir.

  • İnt olabilir: düğmeler, onay kutuları, kaydırıcılar, düğmeli/düğmesiz giriş alanları, ilerleme çubukları, grafik çubukları, radyo düğmeleri için.
  • Çift olabilir : kaydırıcılar, düğmeli/düğmesiz giriş alanları için.
  • Dize olabilir : metin giriş alanları için, DEĞER öğeleri için, tablo hücreleri için, açılır listeler için.


4. BUTON - sarmalayıcı fonksiyonun ait olduğu eleman tipinin adı. Başka herhangi bir öğe olabilir.

5. BAŞLAT - belirli bir öğenin adı .


  • Tüm sarmalayıcı fonksiyonlar aynı isim yapısına sahiptir.
  • Tekrar ediyorum: tüm fonksiyonlar otomatik olarak yazdırılır.

//----------------------------------------------------------------------------------------------------

Intellisense sisteminin akıllı uygulaması:

Pencerelerin ve öğelerin gerekli işlevlerini-kaplayıcılarını hızlı bir şekilde aramaya ve bulmaya yardımcı olan özel bir önek sistemi kullanılmasına karar verildi. İşte bir örnek:

Tüm pencere ve öğe sarmalayıcı işlevlerinin başında w harfi vardır. Ancak, w: _ harfinden sonra küçük bir çizgi koyarsanız, tüm UI pencere işlevlerinin adlarının bir listesini içeren bir intellisense pencer esi açılır. Daha sonra, listede aradığınız ada sahip pencereyi bulmanız, numarasına bakmanız (işlev adında basılıdır) ve tire işaretini silmeniz ve bu numarayı w'den sonra koymanız gerekir. Pencerede bulunan öğelerin işlevlerinin adlarını içeren intellisense listesi bir kerede görünecektir. İşte nasıl yapıldığı:

Bu, eleman sarmalayıcı fonksiyonlar listesinde hızlıca gezinmenin basit bir yoludur. Bunları yazdırmanıza bile gerek yok.

//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------

Ayrıca API dosyasında değişiklikler ve eklemeler yapıldı. Artık eleman ve pencere hakkında daha fazla bilgi kullanıcıya sunuluyor:

 switch(Element)
   {
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      BUTTON
//NAME:         Start
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_BUTTON_Start(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Start:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:  Alert("BUTTON Start pressed!");   break;
  
                case released:  Alert("BUTTON Start released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set an option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_an_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_an_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_an_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_an_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set another option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_another_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_another_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_another_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_another_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      D_LIST
//NAME:         D_LIST 1
//PARAMETER:    string
//INIT OPTION:  L_ITEM  1
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   string w6_s_D_LIST_D_LIST_1(string value = get_s, int Property = 0)      | PFX: w6
//=====================================================================================================================
 
Bu özellikleri yakında denemeyi umuyorum.
 
hini #:
Bu özellikleri yakında denemeyi umuyorum.
Yeni sürümü yarın akşam codobase'e yükleyeceğim.
 
Gece geç saatlerde.
 

Motorun GUI ile programatik olarak etkileşime giren bir versiyonunu sunuyorum.

Çok şey yaptım. Anlatacak ve gösterecek bir şeyler var.

Herkese açık testlerden sonra kod tabanına yükleyeceğim.

İlginç bir şey ortaya çıktı...

Daha fazla ayrıntı yarın.

Dosyalar:
4uh38_06.08.24.zip  1712 kb
 

Zamanın biraz ilerisinde, kullanıcılar için çok uygun bir çözüm bulduğumu söyleyebilirim. Kodlarının içinde pencereler, öğeler ve özellikler arasında kolayca gezinebiliyorlar. Çözüm, öğelerin veya özelliklerin adlarını hatırlamalarına değil, kolayca bulmalarına ve bunlarla çalışmalarına olanak tanıyor. Aynı zamanda, her öğenin yalnızca kendisi ve "ilgili" öğeler için kullanılabilen bir get/set özellikleri listesi vardır. Önek, öğenin işlev adına gömüldüğünde, kullanıcı onu çağırır ve asla öğenin sahip olmadığı bir özelliği döndürmeye veya ayarlamaya çalışmak gibi bir hata yapmaz.

Sarmalayıcı fonksiyonların o kadar çok yönlü ve kullanımı kolay olduğu ortaya çıktı ki ben bile şaşırdım. Parantezler boş olduğunda bir parametrenin değerini döndürür, değer bir olduğunda ayarlar, ilk parametre boş olduğunda ve özellik indeksi ikincide olduğunda bir listeden bir özelliğin değerini döndürür. İlk parametrede bir değer ve ikincide bir özellik indeksi olduğunda bir özelliğe değer ayarlarlar. Ayrıca başarı durumunda 1, hata durumunda (geçersiz değer veya özellik) -1 şeklinde bir sonuç bildirimi döndürürler. Fonksiyonlar öğeleri kendileri yeniden çizer. Bununla ilgilenmenize gerek yoktur.

Sarmalayıcı fonksiyonlar ile yapabilecekleriniz:

1. Eleman parametresinin değerini alın.

2. Bir eleman parametresinin değerini ayarlayın.

3. Eleman türüne ait özelliklerin ayrı listesinden eleman özelliklerinin değerlerini alır (fonksiyon adında yazılı önek ile çağrılır).

4. Aynı listeden eleman özelliklerinin değerlerini ayarlayın.

5. Elemanın durumunu ayarlayın: nötr, etkin, (açık/kapalı), bloke nötr, bloke etkin.

6. Elemanın geçerli durumunu döndürür.


İlk durumda fonksiyon parametrenin değerini döndürür.

İkinci durumda sonucu döndürür: başarılı veya hata. Hata, günlüğe çıktı olarak verilir.

Üçüncü durumda, özelliğin değerini döndürür.

Dördüncü durumda sonuç: özelliği ayarlama başarısı veya hatası.

Beşinci durumda, 1 veya -1 döndürür.

Altıncıda - öğenin durum indeksini döndürür (ayrıntılar aşağıda).


Her şey otomatik olarak yazdırılan bir sarmalayıcı işlev tarafından yapılır. Bunu bulmak için w_ yazın, intellisense listesi açılacaktır, pencerelerin adlarını içerir. Bunlardan birinde aradığınız öğe vardır. Kabaca hangi pencerede olduğunu hatırlamanız gerekir. Sonra, şeytanı silin ve pencere numarasını yazın ve öğeler listesinden ihtiyacınız olanı seçin. Ezberleme yok.

Öğelerin özelliklerini de hatırlamanıza gerek yok. Özellik adına bakın, tek tek özelliklerin bir listesini açmak için öneki görün. Yazın, açın, özelliği seçin. Hiçbir şey hatırlamanıza gerek yok. Yazmak da yok. Intellisense her şeyi yapar.

Windows'un da kendi sarmalayıcıları vardır. Onları açabilir ve kapatabilirler. Geri kalan özellikler henüz uygulanmadı.


API dosyasında büyük bir yükseltme yapıldı. Artık eleman hakkında BÜYÜK miktarda daha yararlı bilgiye sahip. Yani: önekler, bireysel özellikler, eleman sarıcı fonksiyonun ve penceresinin prototipleri, elemanın tam konumu (varsa elemanın ait olduğu tablo, tuval ve sekme), parametresinin türü (int, double, string...), parametresinin özellikleri (min.değer, max.değer, adım, ondalık noktadan sonraki basamak sayısı) yazdırılır. İlk değer veya seçilen seçenek (öğeye bağlı olarak). Her şey oldukça okunabilir ve anlaşılabilir şekilde tasarlanmıştır.

Yeni işlevselliği kısmen test ettim ve bundan memnunum. Her şey amaçlandığı gibi çalışıyor.

Yarın bunu pratikte göstereceğim.