Hi Angel,
also - falls Dich das motiviert - "durchbeißen" lohnt sich nach meiner Erfahrung auf jeden Fall.
Hier mal meine Gedanken zu Deinem Problem:
1. Ich würde Dir empfehlen, das Zeichnen von Chart-Objekten zumindest in eine Include-Datei auszulagern und in den Pre-Compiler-Zeilen Deines EAs auf diese Datei zu referenzieren, z.B. über:
#include <Z_MyIncludes\GUI\IN_AH_ChartObjects.mqh>
Die .mph-Datei muss natürlich im include-Verzeichnis oder in einem entsprechenden Unterverzeichnis wie im obigen Beispiel abgespeichert sein. Alternativ könnte man auch eine Klasse CRechteck definieren, aber das muss nicht unbedingt sein.
2. Wenn Du in der Include-Datei eine Funktion schreibst, die ein Standard-Rechteck malt, dann hast Du die Funktion einmal definiert und kannst sie von jedem beliebigen EA mit den ensprechenden Parametern aufrufen, ohne jedesmal den Code für das Zeichnen neu in jedem EA zu schreiben. Macht den Code in der EA-Datei einfacher und vermeidet, dass Dir die Code-Versionen bei Änderungen "auseinanderlaufen".
3. Hier mal ein Beispiel-Code für einen Button mit allen möglichen Parametern, die auch "disabled" werden können, wenn man sie nicht benötigt. Kann natürlich auch eine horizontale Linie, ein Label oder eben ein Rechteck sein.
Code:
void ButtonCreate (long ButtonChart_ID, // Button Chart ID
string ButtonName, // Button Name
int ButtonSubWindow, // Button Subwindow Index
int ButtonX, // Button X-Coordinate
int ButtonY, // Button Y-Coordinate
int ButtonWidth, // Button Width
int ButtonHeight, // Button Height
//int ButtonCorner, // Button Anchoring Chart Corner
string ButtonText, // Button Text
string ButtonFont, // Button Font
int ButtonFontSize, // Button Font Size
color ButtonTextColor, // Button Text Color
color ButtonBackgroundColor, // Button Background Color
color ButtonBorderColor) // Button Border Color
//bool ButtonState, // Button State pressed/released
//bool ButtonBack, // Button in the Background
//bool ButtonSelectable, // Button highlight to move
//bool ButtonSelected, // Button highlight to move
//bool ButtonHidden, // Button hidden in the Object List
//long ButtonZ_Order) // Button Priority for Mouse Click
{
if(ObjectFind(ButtonName)==-1)
{
ObjectCreate(ButtonChart_ID,ButtonName,OBJ_BUTTON,ButtonSubWindow,0,0);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_XDISTANCE,ButtonX);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_YDISTANCE,ButtonY);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_XSIZE,ButtonWidth);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_YSIZE,ButtonHeight);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetString(ButtonChart_ID,ButtonName,OBJPROP_TEXT,ButtonText);
ObjectSetString(ButtonChart_ID,ButtonName,OBJPROP_FONT,ButtonFont);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_FONTSIZE,ButtonFontSize);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_COLOR,ButtonTextColor);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BGCOLOR,ButtonBackgroundColor);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BORDER_COLOR,ButtonBorderColor);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_STATE,false);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BACK,false);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_SELECTABLE,false);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_SELECTED,false);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_HIDDEN,true);
ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_ZORDER,0);
}
ObjectSetText(ButtonName,ButtonText,ButtonFontSize,ButtonFont,ButtonTextColor);
return; }
4. Aufruf der ObjectCreate()-Funktion dann im EA selbst mit den ensprechenden Parametern. Hier im Beispiel:
Code:
ButtonCreate(0,"B_CloseAll",0,50,33,45,20,"C-ALL",ft,fs,clrNeutral,clrClose,clrClose);
5. In der OnTick()-Funktion musst Du das creierte Objekt zunächst mal löschen mit ObjectDelete(0,"ObjectName"), dann mit der ausgelagerten ObjectCreate-Funktion neu zeichnen. Auf diese Weise aktualisiert sich das Objekt bei jedem Tick mit den ensprechenden Parameter. Löschen in der OnDeinit() empfiehlt sich natürlich auch.
Hier im Beispiel:
Code:
OnTick() {
ObjectDelete(0,"B_CloseAll");
if(MySignal) {
ButtonCreate(0,"B_CloseAll",0,50,33,45,20,"C-ALL",ft,fs,clrNeutral,clrClose,clrClose);
}
}
6. Nur so am Rande: In einer Deiner Code-Zeilen ist ein Leerzeichen (COLOR,LimeG reen)
Just my 2 cents.
Cheers, mocwoc