Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Brett vorm Kopf - Graphics Panel programmierung (http://www.expert-advisor.com/forum/showthread.php?t=4897)

marquez 21.04.16 09:32

Brett vorm Kopf - Graphics Panel programmierung
 
Hallo Leute,

ich hänge seit einiger Zeit bei der programmierung eines Graphic Panels rum.

Ich habe mich an die Anleitung gehalten hier Artikel MQL5

Habe bei TestLibrary01 ein wenig programmiert, und wollte eigentlich "nur noch" per CLabel einen Label includieren und darstellen in dem Panel. Also nur einen ganz simplen Text, der angezeigt wird im Panel und beim verschieben vom Fenster mit wandert.

Meine Schnipsel sehen so aus (Program..mqh):
Code:

  //--- Split buttons
  CSplitButton      m_split_button1;
  CSplitButton      m_split_button2;
  CSplitButton      m_split_button3;
  CSplitButton      m_split_button4;
 
  CLabel            m_label_text1;

Code:

#define SPLITBUTTON4_GAP_X      (128)
#define SPLITBUTTON4_GAP_Y      (250)
  bool              CreateSplitButton4(const string text);
 
#define TEXTFIELD_GAP_X          (128)
#define TEXTFIELD_GAP_Y          (200) 
  bool              CreateText(const string text_field);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+

Code:

  m_split_button4.ButtonState(true);
//--- Add the element pointer to the base
  CWndContainer::AddToElementsArray(0,m_split_button4);
  return(true);
  }

//+------------------------------------------------------------------+
//| Create text                                                      |
//+------------------------------------------------------------------+
bool CProgram::CreateText(const string text_field)
{
  int x=m_window.X()+TEXTFIELD_GAP_X;
  int y=m_window.Y()+TEXTFIELD_GAP_Y;
  int x2=0;
  int y2=0;

  Variante a: 
  bool created_text = m_label_text1.Create(para1,para2,para3,para4,para5); <-- Akzeptiert nur 5 Parameter Werte exemplarisch !!
 
  Variante b:
  bool created_text = m_label_text1.Create(m_chart_id,text_field,m_subwin,x,y,0,0); <-- GEHT NICHT, DA NORMALERWEISE 7 PARAMETER ÜBERGEBEN WERDEN MÜSSTEN !
 
  if(!created_text ) return (false);
  m_label_text1.Text("TEXT"); <-- geht nicht aufrufen, weil .Text kein Member ist !

  return(true);
}
//+------------------------------------------------------------------+


Den zweizeiler mit dem Aufruf von CreateText im CProgram::CreateTradePanel spare ich mir hier wohl zu posten.


Und hier nun zu meiner Frage:

Kann mir jemand helfen das Problem genauer zu verstehen ? Ich bin zwar nicht so Fit in OOP programmierung, habe mir aber sagen lassen, dass die Einbindung von CLabel wie oben geschehen richtig sei, und man somit auf die Funktionen aus der "label.mqh" zugreifen können soll.

Da aber bereits bei m_label_text1.Create nur 5 Parameter zugelassen werden, scheint es mir, als würde das Create nicht auf die label.mqh zugreifen, sondern sich das .Create woanders her holen. Habe diesbezüglich in der Label.mqh nachgesehen, und dort werden 7 Parameter erwartet.


Versuche ich als Bsp. in der Program.mqh noch die "Label.mqh" zu includen, erhalte ich beim compilieren einen Fehler "CLabel struct or class already defined", Member function already defined usw.


Ich wäre also zu tiefst dankbar, wenn mir jemand einen für mich nachvollziehbaren Ansatz liefern könnte um das gelöst zu bekommen.

Wie gesagt, ich habe mich an dieser TestLibrary01 gehalten, und lediglich entsprechend obige Änderungen gemacht.

Tausend Dank im Voraus für Eure Hilfe.

marquez 22.04.16 07:55

Hab es jetzt selbst über umwege gelöst bekommen.



ALSO:

CLOSED

Finde hier leider keinen EDIT Button, oder keine andere Möglichkeit es als closed zu markieren.

traderdoc 22.04.16 10:59

Zitat:

Zitat von marquez (Beitrag 34255)
Hab es jetzt selbst über umwege gelöst bekommen.



ALSO:

CLOSED

Finde hier leider keinen EDIT Button, oder keine andere Möglichkeit es als closed zu markieren.

Wäre doch schön, wenn Du uns über die Umwege berichten würdest.

traderdoc

marquez 23.04.16 09:46

Guten morgen,

die / der Umweg(e) sah so aus, dass ich gezwungen war eine eigene Klasse zu erstellen. Als Basis habe ich die "IconButton.mqh" gewählt und angepasst.

Diese Klasse hat dann alles bekommen, was ich für mich gebraucht hatte. Dann noch einfach in die "WndContainer.mqh" includieren und vorarbeit war fertig.

Der Einfachheit halber habe ich meine Klasse "MyCLabel" genannt. Somit habe ich dann in dem Schnipsel #1 meines Postings nur noch die Zeile ändern müssen von:

CLabel m_label_text1;
in
MYCLabel m_label_text1;


P.S. aber ehrlich gesagt finde ich das schon komisch, wenn nicht sogar sch... , wenn die Beispiele von der MQL Seite bei den ganzen Code beispielen zwar gleiche Dateinamen (also Klassen) haben, die dann aber im Quellcode teilweise massiv differieren. Ich dachte eigentlich man nutzt Basisklassen und wenn was nicht reicht, dann erweitert man Klassen per Extend, oder schreibt eigene. Aber sowas ... nä nä nä ...

Sowas bin ich von anderen Sprachen ehrlich gesagt nicht gewohnt. Da sind die Basisklassen gleich. Egal ob man Bsp. 1 oder Bsp 99 anschaut. Es wird dort Lehrbuchmässig erweitert, und nicht sozusagen auf "Core" ebene rumgebastelt.

traderdoc 23.04.16 10:51

Das werden dann wohl eher Klassen sein, die vererbt wurden und dann auch beliebig andere Namen tragen können.

traderdoc

marquez 26.04.16 21:54

Hi,

das weiß ich nicht. Dafür bin ich nicht so der OOP Profi.

Ich möchte aber hier noch ganz kurz das Beispiel von der MQL Seite aufgreifen, jedoch kein Crosspost in MQL4 oder neuen Post dort machen.

Wenn ich das Teslibrary 1 compiliere und laufen lasse, führt dort jeder Klick zu einem Doppelten Aufruf, also der Print wird jedesmal doppelt aufgerufen aus der onevent funktion.
Gibts da evtl. ne quick´n´dirty solution für ? Bei MQL5 läuft das ja problemlos, und die Routinen scheinen identisch zu sein. Muss die Abfrage anders beim MT4 erfolgen ?

Thx nochmal an dieser Stelle.

P.S. die OnEvent Funktion sieht wie folgt aus, bei MQL4 & 5

Code:

void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Menu item click event
  if(id==CHARTEVENT_CUSTOM+ON_CLICK_CONTEXTMENU_ITEM)
    {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
    }
//--- Button click event
  if(id==CHARTEVENT_CUSTOM+ON_CLICK_BUTTON)
    {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      //---
      if(sparam==m_simple_button3.Text())
        {
        if(m_simple_button3.IsPressed())
            m_simple_button1.ButtonState(false);
        else
            m_simple_button1.ButtonState(true);
        }
      //---
      if(sparam==m_icon_button2.Text())
        {
        if(m_icon_button2.IsPressed())
          {
            m_icon_button1.ButtonState(true);
            m_icon_button4.ButtonState(true);
          }
        else
          {
            m_icon_button1.ButtonState(false);
            m_icon_button4.ButtonState(false);
          }
        }
    }
  }



Alle Zeitangaben in WEZ +2. Es ist jetzt 07:21 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum