Funktionen mit Referenzen und Objekten

 

Hallo,

ich versuche gerade verzweifelt bei einem Chart-Event anhand des Parameters sParam den Button als Referenz zurückzugeben, damit ich die Farbe etc. des Buttons in einer anderen Methode bearbeiten kann.

Mit dem Befehl 

CButton *mButton = (CButton*)objClient;

Kann ich innerhalb der Methode die Farbe und Co. ändern .... außerhalb der Methode ist es dann leider nicht mehr möglich.

Anbei der Code:

void CTimeManagerGUI::GetButtonByName(string sParam, CButton &mButton) {

//Client beschaffen und über jedes Objekt gehen
 int total=AppWindow.ControlsTotal();

 for(int i=0; i<total; i++) {
  CWnd*obj=AppWindow.Control(i);
  string name=obj.Name();

  //--- Client-Suche
  if(StringFind(name,"Client")>0) {
   CWndClient *client=(CWndClient*)obj;
   int totalClient=client.ControlsTotal();

   //Jedes Objekt nun anschauen
   for(int j=0; j<totalClient; j++) {
    CWnd*objClient=client.Control(j);
    name=objClient.Name();

    //Button-Functions
    if(StringFind(name,sParam)>=0) {
     CButton *mButton = (CButton*)objClient;
     //mButton = (CButton*)objClient;
     //&mButton = (CButton*)objClient;
     
     //mButton.ColorBackground(clrYellow);
     return;
    }
   }
  }
 }
}

Wenn ich das auch so kompeliere .... bekomme ich auch eine Warnung die mir schon verrät, dass ich wohl keine Referenz auf den Button außerhalb der Methode mehr habe.


Aber wie gebe ich jetzt genau diesen Button der gefunden wurde zurück, damit ich woanders weitere Dinge mit dem Button anstellen kann? :-( 

 

In der MQL-Referenz (über Editor =>Hilfe) such mal nach "Zugangsmodifikatoren  public, protected und private" und informiere Dich, welche Klassenvariable und -methoden wann und wie und wo sichtbar und zugreifbar sind.

Lies mal den ganzen Abschnitt über Klassen.

 

Aber ich befinde mich ja innerhalb der selben Klasse.... also der Chart, das Event und an der Stelle wo ich den Button modifizieren möchte ist die selbe Klasse? Da wäre ja private okay, selbst wenn ich die Methode auf public switche, kommt die Warnung.

Hier mal die aufrufende Methode, ... nach dem Aufruf GetButtonByName(), hätte ich erwatet, dass in l_Button der Button vorhanden ist und ich bspw. dann in der nächsten Zeile die Farbe ändern kann (natürlich wird das später woanders gemacht, aber ich versuche gerade herauszufinden warum ich den Button da nicht zurück bekomme)

//+------------------------------------------------------------------+
//| Ereignishandler                                                       |
//+------------------------------------------------------------------+
void CTimeManagerGUI::onChartEvent(const int iId,         // Ereignis ID
                                   const long& lParam,   // Ereignisparameter vom Typ long
                                   const double& dParam, // Ereignisparameter vom Typ double
                                   const string& sParam) {

 CButton l_Button;

//On Object Click
 if(iId==CHARTEVENT_OBJECT_CLICK) {

  if(StringFind(sParam,"Buttonstate",0)>=0) {
   GetButtonByName(sParam,l_Button);
   l_Button.ColorBackground(clrOrange);
   HandleButtonState(l_Button);
  }

 AppWindow.ChartEvent(iId,lParam,dParam,sParam);

}
 

Schau dir diese Seite an mit den Links oben zu Artikel.


Einzeln durcharbeiten. Das Thema ist komplex und MQL5 hat Unterschiede zu C/C++

Im Übrigen ist das zu wenig Code um da eine Einschätzung abzugeben, woran es hakt.

Sinnvoller ist kompletter Code. Geht oft schneller.

https://www.mql5.com/de/docs/standardlibrary/controls

Dokumentation zu MQL5: Standardbibliothek / Panels und Dialoge
Dokumentation zu MQL5: Standardbibliothek / Panels und Dialoge
  • www.mql5.com
Standardbibliothek / Panels und Dialoge - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

Okay, danke für eure Antworten.... werde ich mich da doch nochmal komplett durchackern müssen :-) 

Habe es mittlerweile auch mit ObjectGetString()/Integer und Co. gelöst, was sicherlich auch schöner ist, .... aber warum das Beispiel oben nicht funktioniert hat, würde mich dennoch interessieren :-) 

Danke euch and have a nice Weekend!

 
Phoenix-Trinity:

Okay, danke für eure Antworten.... werde ich mich da doch nochmal komplett durchackern müssen :-) 

Habe es mittlerweile auch mit ObjectGetString()/Integer und Co. gelöst, was sicherlich auch schöner ist, .... aber warum das Beispiel oben nicht funktioniert hat, würde mich dennoch interessieren :-) 

Danke euch and have a nice Weekend!

Ich arbeite bei den buttons. Icht mehr mit der ctrade class, viel zu aufwändig. Mit button create und objectset... bin ich schneller und klarer

Grund der Beschwerde: