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 MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Eingabefeld erstellen (http://www.expert-advisor.com/forum/showthread.php?t=4810)

Lena 22.02.16 22:08

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);   
}

Ich dachte es wird ähnlich wie bei einem Button oder Textelement ein Eingabefeld an den augewählten Koordinaten und in der angebenen Größe erstellt. Darin dachte ich dann blinkt ein Cursor, ich muss nur die Zahl eingeben und den Wert dann übergeben. Leider ist es aber wohl eine ganze Ecke komplizierter. Aus der MQL Hilfe werde ich leider nicht schlauer und im Internet finde ich dazu auch nichts weiterführendes.
Wäre für jeden Tipp dankbar.

traderdoc 22.02.16 23:12

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

Lena 23.02.16 08:14

Vielen Dank! Denke jetzt werde ich es mit ein wenig ausprobieren hinbekommen. Hoffe nur ich kostruiere keine zu umständliche Lösung.

Lena 23.02.16 18:43

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.

Lena 23.02.16 20:32

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);
}

Dann habe ich im Hauptprogramm die Stelle, wo das Eingabefeld erstellt werden soll und natürlich auch der neue Werte abgefragt. Und die Abfrage funktioniert leider nicht.

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();
            }

Im Moment passiert folgendes. Es wird ein Eingabefeld erstellt, mit dem Text "Eingabe *klicken*". So, wenn ich darauf klicke kann ich auch einen Wert oder was auch immer eingaben und mit Enter bestätigen. Aber dann passiert nichts.
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?

pako 23.02.16 21:06

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);
    }
  }
//+------------------------------------------------------------------+

it is easy

GoS 23.02.16 21:07

Hast du den "if(id = CHARTEVENT_..."-Block unter OnChartEvent(...) stehen ??
Dort werden sämtliche Events verarbeitet...

Lena 23.02.16 22:58

@GoS: Ja, das habe ich.
@Pako: Habe den Code mal ausprobiert und bei mir passiert da genauso wenig wie bei meinem eigenen.

traderdoc 23.02.16 23:04

Zitat:

Zitat von Lena (Beitrag 33446)
@GoS: Ja, das habe ich.
@Pako: Habe den Code mal ausprobiert und bei mir passiert da genauso wenig wie bei meinem eigenen.

Dann hast Du noch irgendwas falsch gemacht.
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

Lena 23.02.16 23:34

@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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:31 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