|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Eingabefeld erstellen
Ich stehe mal wieder auf dem Schlauch und komme nicht weiter.
Ich wollte gerne ein Eingabefeld erstellen worüber ich Variablen ändern wollte. Dazu dachte ich wäre OBJ_Edit die richtige Wahl. Nur leider hänge ich da bei der Umsetzung fest. Ich kann noch nicht einmal sagen wo der Fehler, Denkfehler liegt, denn ich habe zwar beim kompilieren kein Fehlermeldung, jedoch beim Ausführen auch keine Reaktion. Zuerst einmal geht es mir um die Funktion. Code:
//+------------------------------------------------------------------+ //| Funktion zur Eingabe | //+------------------------------------------------------------------+ string CreateEdit(string name, int sub_window, int xdist, int ydist, int xsize, int ysize, string font, int font_size, color font_color, ENUM_ALIGN_MODE align, bool read_only, color background_color, color border_color) { string text; ObjectCreate (0, name, OBJ_EDIT, 0 ,0, 0); ObjectSetInteger (0, name, OBJPROP_XDISTANCE, xdist); ObjectSetInteger (0, name, OBJPROP_YDISTANCE, ydist); ObjectSetInteger (0, name, OBJPROP_XSIZE, xsize); ObjectSetInteger (0, name, OBJPROP_YSIZE, ysize); ObjectSetString (0, name, OBJPROP_TEXT, text); ObjectSetString (0, name, OBJPROP_FONT, font); ObjectSetInteger (0, name, OBJPROP_FONTSIZE, font_size); ObjectSetInteger (0, name, OBJPROP_COLOR, font_color); ObjectSetInteger (0, name, OBJPROP_ALIGN, align); ObjectSetInteger (0, name, OBJPROP_READONLY, read_only); ObjectSetInteger (0, name, OBJPROP_BGCOLOR, background_color); ObjectSetInteger (0, name, OBJPROP_BORDER_COLOR, border_color); return(text); } Wäre für jeden Tipp dankbar. |
|
|||
Ja, das ist in der Tat schwieriger, aber nachdem Du nun schon so gut mit Buttons umgehen kannst, sollte Dir die Adaption auf ein Editfeld nicht so schwer fallen.
Beim Button wurde als Ereignis CHARTEVENT_OBJECT_CLICK benutzt. Beim Edit wird stattdessen CHARTEVENT_OBJECT_ENDEDIT benutzt. Der Rest ist nahezu identisch zur Vorgehensweise bei Buttons. Nur dass dann wie beim Button kein Code zur Ausführung angesprungen wird, sondern beim Edit muß dann das Eingabefeld ausgelesen werden über ObjectGetString(). Evtl. hilfreich immer mal wieder ins MQL4-Forum zu gehen und die Suchfunktion benutzen, z.B. nach CHARTEVENT_OBJECT_ENDEDIT: https://www.mql5.com/en/articles/689 Nicht an dem MQL5 stören lassen! traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Vielen Dank! Denke jetzt werde ich es mit ein wenig ausprobieren hinbekommen. Hoffe nur ich kostruiere keine zu umständliche Lösung.
|
|
|||
Zu früh gefreut. Inzwischen bin ich zwar soweit, dass das Eingabefeld erstellt wird. Ich kann auch einen Wert eintragen, aber dann wird dieser nicht übernommen.
|
|
|||
Im Moment sieht es so aus. Ich habe eine Funktion zum erstellen eines Eingabefeldes.
Code:
void CreateEdit(string name, int xdist, int ydist, int xsize, int ysize, string text, string font, int font_size, color font_color, color background_color, color border_color) { ObjectCreate (0, name, OBJ_EDIT, 0 ,0, 0); ObjectSetInteger (0, name, OBJPROP_XDISTANCE, xdist); ObjectSetInteger (0, name, OBJPROP_YDISTANCE, ydist); ObjectSetInteger (0, name, OBJPROP_XSIZE, xsize); ObjectSetInteger (0, name, OBJPROP_YSIZE, ysize); ObjectSetString (0, name, OBJPROP_TEXT, text); ObjectSetString (0, name, OBJPROP_FONT, font); ObjectSetInteger (0, name, OBJPROP_FONTSIZE, font_size); ObjectSetInteger (0, name, OBJPROP_COLOR, font_color); ObjectSetInteger (0, name, OBJPROP_READONLY, false); ObjectSetInteger (0, name, OBJPROP_BGCOLOR, background_color); ObjectSetInteger (0, name, OBJPROP_BORDER_COLOR, border_color); ObjectSetInteger (0 ,name, OBJPROP_ALIGN, ALIGN_CENTER); } Code:
CreateEdit("InpLot", XButton14, YButton14, XSize14, YSize14, "Eingabe *klicken*", TextFont, FontSize, FontColor, SelectedColor, SelectedColor); if(id == CHARTEVENT_OBJECT_ENDEDIT) { string Input = ObjectGetString(0, "InpLot", OBJPROP_TEXT,0); Volumen = StrToDouble(Input); ObjectSetString(0, "Volumen", OBJPROP_TEXT, "Handelsvolumen: " +DoubleToString (Volumen,2)); ChartRedraw(); MenueReset(); } Ich dachte mit der Zeile "string Input....." würde ich den neu eingegebenen Wert abrufen. Im Anschluss zu einer double Variablen umwandeln und diese Variable dann noch ausgeben. Habe ich die Abfrage if(id == CHARTEVENT_OBJECT_ENDEDIT) an der falschen Stelle platziert? Oder brauche ich noch eine weitere Abfrage? |
|
|||
Code:
#property strict string text; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- ObjectCreate(0,"test",OBJ_EDIT,0,0,0); ObjectSetInteger(0,"test",OBJPROP_XDISTANCE,10); ObjectSetInteger(0,"test",OBJPROP_YDISTANCE,10); ObjectSetInteger(0,"test",OBJPROP_XSIZE,300); ObjectSetInteger(0,"test",OBJPROP_YSIZE,150); ObjectSetString(0,"test",OBJPROP_TEXT,"text"); ObjectSetString(0,"test",OBJPROP_FONT,"Arial"); ObjectSetInteger(0,"test",OBJPROP_FONTSIZE,20); ObjectSetInteger(0,"test",OBJPROP_ALIGN,ALIGN_CENTER); ObjectSetInteger(0,"test",OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetInteger(0,"test",OBJPROP_COLOR,clrRed); ObjectSetInteger(0,"test",OBJPROP_BGCOLOR,clrBlue); ObjectSetInteger(0,"test",OBJPROP_BORDER_COLOR,clrLime); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- ObjectDelete(0,"test"); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id==CHARTEVENT_OBJECT_ENDEDIT) { ObjectGetString(0,"test",OBJPROP_TEXT,0,text); MessageBox( text,"TextChange",0); } } //+------------------------------------------------------------------+ Geändert von pako (23.02.16 um 21:24 Uhr) |
|
|||
Hast du den "if(id = CHARTEVENT_..."-Block unter OnChartEvent(...) stehen ??
Dort werden sämtliche Events verarbeitet... |
|
|||
@GoS: Ja, das habe ich.
@Pako: Habe den Code mal ausprobiert und bei mir passiert da genauso wenig wie bei meinem eigenen. |
|
|||
Zitat:
Vor @pakos Code stand Deiner, in dem tatsächlich das if(id == CHARTEVENT_OBJECT_ENDEDIT) { an der falschen Stelle stand. Der Code von @pako funktioniert schon! traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
@Traderdoc: Ich sollte wirklich nicht zuviel parallel erledigen. Ich bin wohl nicht so Multitaskingfähig wie ich gerne hätte.
Die if(id == CHARTEVENT_OBJECT_ENDEDIT) Abfrage muss auf der selben Ebene wie die if(id == ChartEVENT_Object_Click) Abfrage, oder? Und dann kann ich wie Du es in dem Pulldown-Menü gemacht hast vorgehen. Als erstes eine string Variable erstellen und dort den Wert "sparam" speichern. Danach das gewünschte Eingabefeld auswählen und das Textfeld mit "ObjectGetString" auslesen. |
Lesezeichen |
Stichworte |
eingabe, eingabefeld, mql4, programmierung, programmierung metatrader |
|
|