Profesyoneller ne diyecek: MQL'de fare kaydırma değerleri nasıl alınır? [beşinci forumdan yeniden yayınla] - sayfa 7

 
Artyom Trishkin :

Ona ne yardım edecek? Ödülün? Çözümü göstermedin. Kendini gösterdin. Ancak, bu çok, çok bekleniyor.

Niye ya? Biraz düşünme süreci ve herkes bir çözüm bulacaktır. Nerede aranacağına dair bir ipucu verdim. Keşfetmek için hangi yönü. Sonuçta, her şeyi gümüş tepside taşımak ilginç değil. )) Gerekirse, bir kişiye yardım edebilir ve onu bir karara getirebilirim. Ama sen sadece benimle tartışmak istiyor gibisin.)
 
Vitaly Muzichenko :

Bu bir şey mi?

Yanlış trende sahipsiniz. Önce bana bir şeyler bağırıyorsunuz ("kodunuz cüruftur", "necroposter" gibi) ve sonra sorunun çözümünü sorup tartışıyorsunuz. O yüzden kendin düşün.

Ya da hak edenlere yardım etmemi bekleyin.

 
Artyom Trishkin :

Ona ne yardım edecek? Ödülün? Çözümü göstermedin. Kendini gösterdin. Ancak, bu çok, çok bekleniyor.

Şaşırtıcı derecede dikkatsizsiniz.

Bakın, yanıtladığım gönderinin sonunda, bir kişi onu bir fikre "ittirmek" istiyor. Hazır bir çözüm istemiyor. İşte zorlamaya çalıştığım şey. Şimdi müdahalenizin ne kadar uygunsuz ve saçma olduğunu anlıyor musunuz? İşe yaramaz bir selden başka bir şey gerektirmez. Aslında iletişim kurmak daha iyi olurdu. Kendileri ve diğerleri için daha fazla fayda öğrendi.

 
Реter Konow :

Yanlış trende sahipsiniz. Önce bana bir şeyler bağırıyorsunuz ("kodunuz cüruftur", "necroposter" gibi) ve sonra sorunun çözümünü sorup tartışıyorsunuz. O yüzden kendin düşün.

Ya da hak edenlere yardım etmemi bekleyin.

Ben sormadım, bir gerçeği belirttim.

 
Vitaly Muzichenko :

Ben sormadım, bir gerçeği belirttim.

Ne gerçeği?
 

Burada birçok formun arkasında, içeriği görmüyor. Bir fikir ve onu uygulayabilme yeteneği yoksa, formdaki titizliklerinin kaliteli içerik oluşturmayacağını anlayamazlar.

Bir öz, enkarnasyonlarının birçok biçimine sahip olabilir ve yalnızca dar görüşlü bir kişi onu ifade diliyle yargılayabilir.

 
Vitaly Muzichenko :

Ben sormadım, bir gerçeği belirttim.

Ben de bir gerçeği belirtiyorum.

"ürünleriniz" vasat ve gülünç girişimlerdir.

Uzun zamandır böyle çöp görmemiştim!


Dürüst eleştiriyi ciddiye almayın. :)

 
Реter Konow :
Niye ya? Biraz düşünme süreci ve herkes bir çözüm bulacaktır. Nerede aranacağına dair bir ipucu verdim. Hangi yönü keşfetmek için. Sonuçta, her şeyi gümüş tepside taşımak ilginç değil. )) Gerekirse, bir kişiye yardım edebilir ve onu bir karara getirebilirim. Ama sen sadece benimle tartışmak istiyor gibisin.)

Hey Peter!
MQL kullanarak fare tekerleği ile kaydırma yapmak için gerçek bir pratik çözümünüz olduğunu söylemek ister misiniz? Ve klavye okları veya fare tuşlarıyla değil - bu keçinin anladığı bir şey. Elbette, CHARTEVENT_CHART_CHANGE olayını, hiçbir tuşa basılmadığında, ancak yalnızca olasılıksal olarak, grafiğin tekerleği kullanarak kaydırdığı gerçeğini belirlemek için kullanabilirsiniz. bu olay basitçe yeni bir çubuğun gelmesiyle veya dikey ölçekte bir değişikliğe yol açan keskin bir fiyat değişikliğiyle gerçekleşebilir . Ayrıca, bu yöntemle, örneğin grafik aşırı sol veya sağ konuma ulaştığında ve grafiğin kaymamasını nasıl sağlayacağınız gibi, tekerlek kaydırma olaylarını her zaman almak imkansızdır. Belki de grafiği geri taşımak için ChartNavigate işlevini kullanmayı kastediyorsunuz, ancak bu aynı zamanda çok çarpık bir uygulama olacaktır ve grafiği değiştirmek için fare tekerleğini kaydırmak dışında tüm diğer nedenleri doğru şekilde filtrelemek pek mümkün değildir. Aklımda, bu sadece MT'yi hackleyerek veya bazı belgelenmemiş komutları ve (veya) olayları bilerek yapılabilir. Genel olarak, böyle bir uygulama örneğiniz olduğuna inanmıyorum.

Bununla birlikte, garip bir ipucunuz var. Pratik olarak "Fare tekerleğinden kaydırma olayı nasıl alınır?" sorusuna " Kaydırma olayını ve grafiği hareket ettiren işlevi kullanın" cevabını veriyorsunuz.

Belki yanılıyorum ve gerçekten bir örneğiniz var. O zaman sen bir serserisin! )) O zaman, kodu değil, en azından ex4 (ex5) dosyasını bırakın.

 
Nikolai Semko :

Hey Peter!
MQL kullanarak fare tekerleği ile kaydırma yapmak için gerçek bir pratik çözümünüz olduğunu söylemek ister misiniz? Ve klavye okları veya fare tuşlarıyla değil - bu keçinin anladığı bir şey. Elbette, CHARTEVENT_CHART_CHANGE olayını, hiçbir tuşa basılmadığında, ancak yalnızca olasılıksal olarak, grafiğin tekerleği kullanarak kaydırdığı gerçeğini belirlemek için kullanabilirsiniz. bu olay basitçe yeni bir çubuğun gelmesiyle veya dikey ölçekte bir değişikliğe yol açan keskin bir fiyat değişikliğiyle gerçekleşebilir . Ayrıca, bu yöntemle, örneğin grafik aşırı sol veya sağ konuma ulaştığında ve grafiğin kaymamasını nasıl sağlayacağınız gibi, tekerlek kaydırma olaylarını her zaman almak imkansızdır. Belki de grafiği geri taşımak için ChartNavigate işlevini kullanmayı kastediyorsunuz, ancak bu aynı zamanda çok çarpık bir uygulama olacaktır ve grafiği değiştirmek için fare tekerleğini kaydırmak dışında tüm diğer nedenleri doğru şekilde filtrelemek pek mümkün değildir. Aklımda, bu sadece MT'yi hackleyerek veya bazı belgelenmemiş komutları ve (veya) olayları bilerek yapılabilir. Genel olarak, böyle bir uygulama örneğiniz olduğuna inanmıyorum.

Bununla birlikte, garip bir ipucunuz var. Pratik olarak "Fare tekerleğinden kaydırma olayı nasıl alınır?" sorusuna " Kaydırma olayını ve grafiği hareket ettiren işlevi kullanın" cevabını veriyorsunuz.

Belki yanılıyorum ve gerçekten bir örneğiniz var. O zaman sen bir serserisin! )) O zaman, kodu değil, en azından ex4 (ex5) dosyasını bırakın.

Merhaba Nikolay!

İster inanın ister inanmayın, çözüm çok basit. 15-20 satır kod alır. Doğru, bir nüans var - kaydırma mekanizmasının uygulanmasının özellikleri. Uygulamam standart olandan biraz farklı. Mekanizma nesneleri değil tuvali kaydırır. Anatoly'nin kitaplığında da benzer bir uygulama mevcuttur.

Gerçekten çarkla ilerliyorum ve grafiğin hareketine "yapışarak" enerjinin etkisini alıyorum. Grafik elbette seğirir, ancak her zaman orijinal konumuna geri döner. Grafik kaydırma işlevi bunun içindir. Ayrıca mql işlevinden grafik kaymasının yönünü alıyorum. Bu nedenle, herhangi bir şeyi hacklemeye gerek yoktur.) MQ, hemen hemen her görevin uygulanması için mümkün olan en geniş işlevselliği vermeye çalıştı. Hatta harika. Belki de geliştiricilere açılan tüm olasılıkları bilmiyorlardı.)

 
Nikolai Semko :

Genel olarak, böyle bir uygulama örneğiniz olduğuna inanmıyorum.

Bununla birlikte, garip bir ipucunuz var. Pratik olarak "Fare tekerleğinden kaydırma olayı nasıl alınır?" sorusuna " Kaydırma olayını ve grafiği hareket ettiren işlevi kullanın" cevabını veriyorsunuz.

Belki yanılıyorum ve gerçekten bir örneğiniz var. O zaman sen bir serserisin! )) O zaman, kodu değil, en azından ex4 (ex5) dosyasını bırakın.

İşte böyle bir durum. Cevap verdiğim kişi, kendisine bir tekerlek kaydırma mekanizmasının nasıl uygulanacağı konusunda bir fikir vermemi istedi. ona ima ettim. Yerel kötü niyetli kişiler hemen heyecanlandılar ve beni övünmek ve başka saçmalıklarla suçlamaya başladılar.

Onların bakış açısına göre, bir çözüm sunarsam ya ürünlerimin reklamını yaparım ya da sadece gösteriş yaparım, yapmazsam da herkesi aldatırım ve hiçbir şeyim olmaz.

Kodu düzenleyebilirim, ancak ilk olarak, kaydırma mekanizmasının uygulanmasından ve ikincisi Rusça olarak boşanacaktır. Ama belki onu kaydırma mekanizmanıza uyarlayabilirsiniz. Ex4 gönderemiyorum çünkü tek bir mekanizmayı çalıştığı tümleşik grafik ortamından "çıkaramıyorum".

En iyi seçenek, kararı size genel olarak iletmek olacaktır, ancak bir şeyi kanıtlamak amacıyla değil, dostluk temelinde.

Böyle:

CHARTEVENT_CHART_CHANGE olayı, diğer şeylerin yanı sıra, imleç grafiğin üzerindeyse fare tekerleği hareketi olayında oluşturulur. Grafik kaydırma seçeneği etkinleştirilmelidir. Böylece grafiği kaydırarak çarkı ne zaman çevirdiğimizi tam olarak bilebiliriz. Özel bir etkinlik oluşturabiliriz. Örneğin "SCROLLER_EVENT".

Ardından, görevimiz yer değiştirme yönünü belirlemektir. Bunun için ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR ) kullanıyoruz; Her "SCROLLER_EVENT" olayında, ilk görünen çubuğun numarasını alıyoruz ve kaydettiğimiz önceki çubuğun sayısından büyük veya küçük olup olmadığını belirliyoruz. Daha fazlaysa, bir yönde, daha azsa ters yönde kaydırın. Aynı zamanda, grafiğimiz de kayar ve en uçta durabilir. Bunun olmasını önlemek için, ChartNavigate işlevini kullanarak konumunu düzeltir ve grafiği orijinal konumuna ayarlarız. Bu çağrı ile CHARTEVENT_CHART_CHANGE olayını da oluşturur ve bu da kaydırmamızı bozacaktır. Bu nedenle, harita konumu düzeltmesi sırasında CHARTEVENT_CHART_CHANGE olayını atlamalı ve buna tepki vermemeliyiz. Bunu yapmak için bayrak sistemini kullanmanız gerekir.

İşte kodum neye benziyor:

 //=====================================================================================================================================    
 if (id == CHARTEVENT_CHART_CHANGE && !n)
   {
     if (СОБЫТИЕ_ИНТЕРФЕЙСА != _SCROLLER_EVENT)
      {
       СОБЫТИЕ_ИНТЕРФЕЙСА = _SCROLLER_EVENT; 
      } 
     //------------------------------------  
     if (!Номер_первого_бара){ ChartNavigate ( 0 , CHART_END ,- 100 ); Номер_первого_бара = ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );}
    //------------------------------------     
    Номер_этого_бара = ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
     //------------------------------------
     int Основание_выпадающего_списка = КАНВАС - 1 ;
     int Ползунок_                    = КАНВАС + 4 ;
     int Вертикальная_полоса          = КАНВАС + 2 ;
     //------------------------------------
     if (Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1 ;
       Прокрутка_вверх = 0 ;
       Сдвиг = 25 ;
       n = 1 ;
      }
     if (Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0 ;
       Прокрутка_вверх = 1 ;
       Сдвиг = - 25 ;
       n = 1 ;
      } //Alert(__FUNCTION__," Номер_первого_бара   ",Номер_первого_бара,"  Номер_этого_бара  ",Номер_этого_бара);  
     //------------------------------------
     if (КАТЕГОРИЯ_КАНВАСА_ОБЪЕКТА == _SCROLL_BAR_CANVAS && !G_CORE[ОКНО][Вертикальная_полоса][_OBJECT_HIDE])
      {
       int Поле_обзора = G_CORE[ОКНО][КАНВАС][_VIEW_SQUARE];
       //Элемент которому принадлежит сам канвас.
       int Элемент_прокручиваемого_канваса =  G_CORE[ОКНО][КАНВАС][_MAIN_ELEMENT];
       //Канвас элемента, которому принадлежит прокручиваемый канвас.
       int Канвас_того_элемента = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_DROWING_CANVAS];
       int Группа_элемента_прокручиваемого_канваса = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_OBJECT_GROUP];

       //------------------------------------
       G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
       //------------------------------------
       if (G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] > G_CORE[ОКНО][Поле_обзора][_Y])
        {          
         G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = G_CORE[ОКНО][Поле_обзора][_Y];
        } 
       if ((G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] + G_CORE[ОКНО][КАНВАС][_Y_SIZE]) < (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]))
         {
          G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]) - G_CORE[ОКНО][КАНВАС][_Y_SIZE];
         }
       //------------------------------------  
       G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[ОКНО][Поле_обзора][_Y] - G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y];  
       //------------------------------------
       ObjectSetInteger ( 0 ,G_CORE[ОКНО][КАНВАС][_NAME], OBJPROP_YOFFSET ,G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
       //------------------------------------ 
       G_CORE[ОКНО][Ползунок_][_Y] = G_CORE[ОКНО][Вертикальная_полоса][_Y] + (( double )G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] / (( double )G_CORE[ОКНО][Ползунок_][_V_SCROLL_BAR_HANDLE_STEP] / 10000 ));
       //------------------------------------ 
       if (Группа_элемента_прокручиваемого_канваса == VIEW_BOX)
         {
          Нарисовать_элемент(ОКНО,Канвас_того_элемента,Элемент_прокручиваемого_канваса);
         } 
       //------------------------------------
       if (Группа_элемента_прокручиваемого_канваса == DROP_LIST)
         {
          Нарисовать_элемент(ОКНО,Поле_обзора,Элемент_прокручиваемого_канваса);
         } 
      }    
  }
//------------------------------------------------------
if (qw){n = 0 ; qw = 0 ;} 
if (n == 1 ){ ChartNavigate ( 0 , CHART_END ,- 100 );  qw = 1 ;} 
//------------------------------------------------------
//Alert(__FUNCTION__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



Katma:

Program değişikliğinin diğer nedenlerine gelince, elbette sistemimize hatalar getirebilirler. Ancak, bu hatalar o kadar küçüktür ki, bunlara dikkat etmeye değmez. Pekala, yeni çubuk tuvalimizi birkaç piksel hareket ettirecek... Bu korkutucu değil. Ve sonra, şu anda yalnızca imleç kaydırma tuvalinin üzerindeyse.

Tabii ki, uygulama bir çıkmazdan çıkış yolu bulma girişimidir. Tekerlekle kaydırma olasılığının tamamen yokluğu ile bu, en basit ve en "yerel" çözümdür. Eksiksiz bir çözüm elde etmek için hizmet masasıyla zaten iletişime geçtim. Olup olmayacağı, geliştiricilere bağlı.
Neden: