Diskussion zum Artikel "Wie erstellt man ein grafisches Panel beliebiger Komplexität?" - Seite 8

 
Alexander:

Hallo!

Ich habe eine solche Frage - ich möchte mehrere Registerkarten auf dem Handelspanel erstellen, d.h. durch Drücken einer Schaltfläche erscheint ein Satz von Elementen, durch Drücken einer anderen Schaltfläche erscheint ein anderer Satz von Elementen. Um die Elemente einer Registerkarte auszublenden, habe ich die Eigenschaft Hide() für dieses Element im onClick-Ereignishandler der Registerkarten-Schaltfläche angewendet und das Element ist nicht mehr auf dem Panel sichtbar, aber es verliert nicht seine Eigenschaften und wenn Sie auf die Stelle klicken, wo dieses Element war, dann wird onEvent() des Panels dieses Ereignis akzeptieren. Frage - wie man das ausgeblendete Element auch nicht auf irgendwelche Aktionen des Benutzers zu reagieren. Ich habe versucht, die Eigenschaft Element.Disable() in der onClick-Methode der Registerkarte Button wieder zu aktivieren, aber nichts passiert, das Element reagiert auf den Button-Klick, also reagiert immer noch, obwohl unsichtbar. Wie kann ich es programmatisch ausschalten, indem ich auf eine Registerkarte klicke, und es dann programmatisch einschalten, indem ich auf eine andere Registerkarte klicke?

Versuchen Sie, die Steuerelementbibliothek zu patchen: Es fehlt eine Zeile am Anfang der OnMouseEvent-Methode in der Datei Wnd.mqh:

if(!IS_ENABLED || !IS_VISIBLE) return false;

Einzelheiten sind in dem Artikel beschrieben(Anwendung von OLAP im Handel (Teil 2) - der Artikel handelt von OLAP, aber es gibt einen Abschnitt über GUI, in dem das obige Problem angesprochen wird):

Im minimierten Zustand wird die Schaltfläche "Größe ändern" ausgeblendet und ist inaktiv. Das Problem liegt in der Methode CWnd::OnMouseEvent. Ihr fehlt eine solche Prüfung:

  // if(!IS_ENABLED || !IS_VISIBLE) return false; - diese Zeile ist nicht vorhanden

Infolgedessen fangen sogar deaktivierte und unsichtbare "Steuerelemente" Ereignisse ab. Offensichtlich könnte das Problem durch die Einstellung der entsprechenden Z-Reihenfolge der Steuerelemente gelöst werden. Aber auch hier haben wir einen Fehler gefunden - die Bibliothek berücksichtigt die Z-Reihenfolge der Elemente nicht. Wenn Sie sich die Methode CWndContainer::OnMouseEvent ansehen, werden Sie eine einfache Schleife in umgekehrter Reihenfolge durch alle untergeordneten Elemente sehen, ohne zu versuchen, ihre Priorität anhand der Z-Reihenfolge zu bestimmen.

Es ist also entweder ein weiterer "Patch" der Bibliothek oder ein "Trick" in einer abgeleiteten Klasse erforderlich.

Im Prinzip gibt es in der Standard-Kontrollbibliothek eine Menge, das behoben werden muss. Aus diesem Grund wurde eine alternative, bereits gepatchte Implementierung von ControlsPlus geschrieben - Sie können sie in ihrer Gesamtheit im Artikel MQL als Mittel zur Markierung der grafischen Oberfläche von MQL-Programmen erhalten . Teil 2 (bei Interesse gibt es die Teile 1 und 3).

Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:

Versuchen Sie, die Kontrollbibliothek zu patchen: In der Datei Wnd.mqh fehlt eine Zeile am Anfang der Methode OnMouseEvent:

Einzelheiten sind in dem Artikel beschrieben(Application of OLAP in Trading (Part 2) - der Artikel handelt von OLAP, aber es gibt einen Abschnitt über GUI, in dem das obige Problem angesprochen wird):

Im Grunde gibt es eine Menge Dinge in der Standard-Steuerungsbibliothek, die angepasst werden müssten. Deshalb wurde eine alternative, bereits gepatchte, ControlsPlus-Implementierung geschrieben - Sie können sie in ihrer Gesamtheit im Artikel MQL als Mittel zur Markierung der GUI von MQL-Programmen finden . Teil 2 (bei Interesse gibt es die Teile 1 und 3).

Vielen Dank, wir werden es versuchen.

 

Wie schreibt/übermittelt man Text an CLabel von OnTick ?

class CControlsDialog : public CAppDialog
{
private:
CLabel m_label;// CLabel-Objekt

.....

void OnTick()
{

m_label.Text(DoubleToString(Ask,4));

....

Ich erhalte einen Fehler

'm_label' - nicht deklarierter Bezeichner ...

was ist falsch?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
  • www.mql5.com
//|                                                ControlsLabel.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Renat Akhtyamov:

Wie schreibe/übertrage ich Text in CLabel von OnTick?

Ich erhalte den Fehler

'm_label' - nicht deklarierter Bezeichner ...

Was ist falsch?

Haben Sie die Bindung an das Diagramm, die Koordinaten usw. wie in der hier in der Hilfe gezeigten Funktion CreateLabel() vorgenommen?

 
Vasiliy Pushkaryov:

Und die Bindung an das Diagramm, die Koordinaten usw. wie in CreateLabel() ist hier in der Hilfe gezeigt, haben Sie es getan?

ja

Wenn Sie den Text genau dort in das Objekt schreiben, ist alles in Ordnung.

Aber wenn ich versuche, ihn in OnTick zu schreiben, schlägt es fehl.

Sie müssen das Objekt doch nicht bei jedem Tick neu erstellen, oder?
 
Renat Akhtyamov:

ja

Wenn Sie genau dort Text in das Objekt schreiben, ist alles in Ordnung.

Aber wenn ich versuche, ihn in OnTick zu schreiben, schlägt es fehl.

Sie müssen das Objekt doch nicht bei jedem Tick neu erstellen, oder?
Was passiert, wenn m_label in den öffentlichen Bereich verschoben wird?
 
Vasiliy Pushkaryov:
Was passiert, wenn m_label in den öffentlichen Bereich verschoben wird?

Das habe ich versucht, der gleiche Fehler.

Es ist nur so, dass ich es auf 4pc mache.

Ich denke, das ist das Problem.

Und das hier funktioniert nicht, obwohl es kompiliert.

m_scroll_v1. Disable(); (Ich versuche, Radio-Buttons zu wechseln, es ist interessant, die Schnittstelle zu ändern). Destroy() funktioniert, aber Disable will es nicht tun

 
Renat Akhtyamov:

versucht

Es ist nur so, dass ich es mit einem 4RK mache.

Ich glaube, das ist das Problem.

Und das hier funktioniert nicht, obwohl es kompiliert.

m_scroll_v1. Disable(); (Ich versuche, Radiobuttons umzuschalten, es ist interessant, die Schnittstelle zu ändern). Destroy() funktioniert, aber Disable will es nicht tun

Alles funktioniert in 4. Und das Objekt, das Sie definiert haben. Der Aufruf sollte wie Panel.m_label.Text( "Max.Margin") gemacht werden.
 
Vasiliy Pushkaryov:
Alles funktioniert in 4. Und das Objekt, das Sie definiert haben. Sie sollten einen Aufruf davon machen, wie Panel.m_label.Text( "Max.Margin").

Es funktioniert so.

Danke!

Ich habe zuerst das übergeordnete Objekt hinzugefügt und es dann in den öffentlichen Bereich verschoben und es funktioniert.

und dies ist m_scroll_v1. Disable(); funktioniert noch nicht

 
Renat Akhtyamov:

Das funktioniert so

Vielen Dank!

Zuerst das Elternteil hinzugefügt, dann auf öffentlich verschoben und es funktioniert

und dieses m_scroll_v1. Disable(); funktioniert noch nicht

Ich bin noch nicht darauf gestoßen. Ich weiß es nicht. Stanislav beantwortet eine der Fragen im 27. Beitrag dieses Threads, die Deaktivierung der Standardbibliothek wird dort auch angesprochen, schauen Sie mal rein.