MQL5 v1.49: Knoepfe auf 200 % + Spalten-Rueckfall
User: "die knoepfe sind viel zu klein, vergroessere um 200%". Breite 66->132, Hoehe 17->34, Schrift 8->16. FALLE 1 - die Aenderung waere auf jedem laufenden Chart NIE angekommen: XSIZE, YSIZE und FONTSIZE standen im if(ObjectFind<0)-Zweig, wurden also nur beim ERZEUGEN gesetzt. Die Knoepfe leben unter BPFX und ueberstehen Redraw() - ein bestehendes Objekt haette seine alte Groesse behalten. Exakt der v1.44-Fehler bei den Meldungs-Labels. Alle drei stehen jetzt im Redraw-Teil. Merksatz: bei einem Objekt, das den Redraw UEBERLEBT, gehoert jede einstellbare Eigenschaft in den Redraw-Teil, nicht in den Erzeugungs-Zweig. FALLE 2 - die Groesse haette eine Falle aufgemacht: 13 Knoepfe a 34 px sind ein 490 px hoher Stapel. Auf einem niedrigen Chartfenster liefen die obersten aus dem sichtbaren Bereich - und weil genau diese Knoepfe die einzige Moeglichkeit sind, eine Gruppe wieder einzublenden, waere das ein Zustand ohne Rueckweg. BtnDraw() misst jetzt CHART_HEIGHT_IN_PIXELS und bricht bei Bedarf in eine zweite Spalte um (400 px -> 10 je Spalte / 2 Spalten; ab ~600 px eine Spalte). Im Umbruch-Fall stimmt die Lesereihenfolge nicht mehr exakt - bewusst in Kauf genommen, erreichbar schlaegt schoen. 0 errors 0 warnings, .ex5 frisch, Spiegel bitgleich.
This commit is contained in:
@@ -9628,3 +9628,36 @@ nie auf das eingelesene Dokument.** Und: **eine Größenprüfung belegt nur, das
|
||||
nichts abgeschnitten wurde — nicht, dass der Inhalt stimmt** (dieselbe Klasse
|
||||
wie „eine LEERE Datei besteht `node --check`"). Wo es billig ist, gehört die
|
||||
erwartete Zunahme mitgeprüft, nicht nur ihr Vorzeichen.
|
||||
|
||||
### ⚠⚠ Knöpfe auf 200 % (2026-08-22, v1.49) — und zwei Fallen dabei
|
||||
|
||||
User: „die Knöpfe sind viel zu klein, vergrößere um 200 %".
|
||||
Breite **66 → 132**, Höhe **17 → 34**, Schrift **8 → 16**.
|
||||
|
||||
⚠⚠ **DIE ÄNDERUNG WÄRE AUF JEDEM LAUFENDEN CHART NIE ANGEKOMMEN.** `XSIZE`,
|
||||
`YSIZE` und `FONTSIZE` standen im `if(ObjectFind(...) < 0)`-Zweig, wurden also
|
||||
**nur beim Erzeugen** gesetzt. Die Knöpfe leben unter `BPFX` und überstehen
|
||||
`Redraw()` — ein bestehendes Objekt hätte seine alte Größe behalten. Das ist
|
||||
**exakt der v1.44-Fehler** bei den Meldungs-Labels („`OBJPROP_FONTSIZE` wurde
|
||||
nur beim Erzeugen gesetzt"), und ich hätte ihn beim Bauen von v1.48 schon
|
||||
vermeiden können. Alle drei stehen jetzt im Redraw-Teil.
|
||||
**➜ Merksatz: bei einem Objekt, das den Redraw ÜBERLEBT, gehört jede
|
||||
einstellbare Eigenschaft in den Redraw-Teil — nicht in den Erzeugungs-Zweig.**
|
||||
|
||||
⚠⚠ **SPALTEN-RÜCKFALL, weil die Größe eine Falle aufgemacht hätte.** 13 Knöpfe
|
||||
à 34 px sind ein **490 px** hoher Stapel. Auf einem niedrigen Chartfenster
|
||||
liefen die obersten aus dem sichtbaren Bereich — und weil **genau diese Knöpfe
|
||||
die einzige Möglichkeit sind, eine Gruppe wieder einzublenden**, wäre das ein
|
||||
Zustand ohne Rückweg: ausgeblendet und nicht mehr erreichbar. `BtnDraw()` misst
|
||||
jetzt `CHART_HEIGHT_IN_PIXELS` und bricht bei Bedarf in eine zweite Spalte um.
|
||||
| Chart-Höhe | je Spalte | Spalten |
|
||||
|---|---|---|
|
||||
| 400 px | 10 | **2** |
|
||||
| ab ~600 px | 13 | 1 |
|
||||
⚠ Im Umbruch-Fall stimmt die Lesereihenfolge nicht mehr exakt (bei
|
||||
`CORNER_LEFT_LOWER` wächst `YDISTANCE` nach oben) — bewusst in Kauf genommen:
|
||||
erreichbar schlägt schön, und der Normalfall ist eine Spalte.
|
||||
|
||||
✅ `0 errors, 0 warnings`, `.ex5` frisch, Spiegel bitgleich.
|
||||
⚠ Wer noch größer will, dreht `InpBtnBreite`/`InpBtnHoehe`/`InpBtnFont` weiter —
|
||||
der Spalten-Rückfall fängt zu hohe Stapel ab.
|
||||
|
||||
+24
-9
@@ -12,7 +12,7 @@
|
||||
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Oil Trading Bot"
|
||||
#property version "1.48"
|
||||
#property version "1.49"
|
||||
// v1.42 (2026-08-19): Y-Stapel oben rechts GEMESSEN statt geschaetzt. Der
|
||||
// Faktor 1,8 aus v1.41 war nur die naechste Schaetzung; jetzt liefert
|
||||
// TextGetSize die TATSAECHLICHE Pixelhoehe (LabelH). Ausserdem wird Y bei
|
||||
@@ -302,9 +302,12 @@ input bool InpShowButtons = true; // Schaltflaechen links einblende
|
||||
input bool InpBtnOben = false; // Knoepfe oben statt unten links
|
||||
input int InpBtnX = 4; // Abstand vom linken Rand (px)
|
||||
input int InpBtnY = 22; // Abstand vom Rand (px)
|
||||
input int InpBtnBreite = 66; // Knopfbreite (px)
|
||||
input int InpBtnHoehe = 17; // Knopfhoehe (px)
|
||||
input int InpBtnFont = 8; // Schriftgroesse
|
||||
// ⚠ Alle drei am 2026-08-22 auf 200 % (User: "viel zu klein").
|
||||
// Vorher 66/17/8. Wer noch groesser will, dreht hier weiter — der
|
||||
// Spalten-Rueckfall in BtnDraw() faengt zu hohe Stapel ab.
|
||||
input int InpBtnBreite = 132; // Knopfbreite (px)
|
||||
input int InpBtnHoehe = 34; // Knopfhoehe (px)
|
||||
input int InpBtnFont = 16; // Schriftgroesse
|
||||
input color InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
|
||||
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
|
||||
|
||||
@@ -375,6 +378,15 @@ void BtnDraw()
|
||||
{
|
||||
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
|
||||
int h = MathMax(10, InpBtnHoehe);
|
||||
// ⚠⚠ SPALTEN-RUECKFALL. Mit der 200-%-Groesse ist der Stapel 490 px hoch;
|
||||
// auf einem niedrigen Chartfenster liefen die obersten Knoepfe aus dem
|
||||
// sichtbaren Bereich — und weil GENAU DIESE Knoepfe die einzige
|
||||
// Moeglichkeit sind, eine Gruppe wieder einzublenden, waere das eine
|
||||
// Falle: ausgeblendet und nicht mehr erreichbar. Passt die Spalte nicht,
|
||||
// wird umgebrochen.
|
||||
int hoch = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
|
||||
int proSpalte = (hoch > 0) ? (hoch - InpBtnY - 8) / (h + 2) : BTN_N;
|
||||
proSpalte = MathMax(1, MathMin(proSpalte, BTN_N));
|
||||
for(int i = 0; i < BTN_N; i++)
|
||||
{
|
||||
string nm = BPFX + g_bkey[i];
|
||||
@@ -383,20 +395,23 @@ void BtnDraw()
|
||||
if(!ObjectCreate(0, nm, OBJ_BUTTON, 0, 0, 0)) continue;
|
||||
ObjectSetInteger(0, nm, OBJPROP_CORNER,
|
||||
InpBtnOben ? CORNER_LEFT_UPPER : CORNER_LEFT_LOWER);
|
||||
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
|
||||
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
|
||||
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, InpBtnFont);
|
||||
ObjectSetInteger(0, nm, OBJPROP_COLOR, clrWhite);
|
||||
ObjectSetInteger(0, nm, OBJPROP_BORDER_COLOR, C'90,90,96');
|
||||
ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
|
||||
ObjectSetInteger(0, nm, OBJPROP_ZORDER, 100);
|
||||
}
|
||||
ObjectSetInteger(0, nm, OBJPROP_XDISTANCE, InpBtnX);
|
||||
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
|
||||
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
|
||||
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, InpBtnFont);
|
||||
// Stapelrichtung so, dass der ERSTE Knopf immer OBEN steht — bei
|
||||
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
|
||||
// sonst verkehrt herum.
|
||||
int rang = InpBtnOben ? i : (BTN_N - 1 - i);
|
||||
ObjectSetInteger(0, nm, OBJPROP_YDISTANCE, InpBtnY + rang * (h + 2));
|
||||
int spalte = rang / proSpalte;
|
||||
int zeile = rang % proSpalte;
|
||||
ObjectSetInteger(0, nm, OBJPROP_XDISTANCE,
|
||||
InpBtnX + spalte * (InpBtnBreite + 3));
|
||||
ObjectSetInteger(0, nm, OBJPROP_YDISTANCE, InpBtnY + zeile * (h + 2));
|
||||
BtnPaint(i);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user