Diskussion zum Artikel "Verwendung von Layouts und Containern für GUI Controls: Die CBox Klasse" - Seite 2

 

Dieser Code lässt sich nicht kompilieren. Build 1702.

'pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

m_client_area' - privater Member Zugriffsfehler PipValueCalculator.mqh 118 60

m_client_area' - Fehler beim Zugriff auf ein privates Mitglied PipValueCalculator.mqh 118 91

m_client_area' - Fehler beim Zugriff auf ein privates Mitglied PipValueCalculator.mqh 129 72

m_client_area' - Fehler beim Zugriff auf ein privates Mitglied PipValueCalculator.mqh 148 75

m_client_area' - Fehler beim Zugriff auf ein privates Mitglied PipValueCalculator.mqh 168 77

m_client_area' - Fehler beim Zugriff auf ein privates Mitglied PipValueCalculator.mqh 187 72

6 Fehler, 0 Warnung(en) 7 1

Nebenbei bemerkt, wenn ich es nicht übersehen habe, sollten Sie angeben, wo die Dateien abgelegt werden sollen. Wir müssen uns den Code ansehen, um zu wissen, dass wir einen Ordner "Layouts" in Include erstellen und die Datei Box.mqh darin ablegen müssen.


 

Ich verwende den Build 1755.

Jetzt ist der Member m_client_area der Klasse CDialog in Controls\Dialog.mqh privat und es wurden neue Methoden erstellt, um die Eigenschaften Width und Height zu erhalten.

Bei mir funktioniert es nach den folgenden Änderungen.
a) ersetzt CDialog::m_client_area.Width() durch CDialog::ClientAreaWidth()
b) CDialog::m_client_area.Height() durch CDialog::ClientAreaHeight() ersetzt
 
Alain Verleyen :

Kode ini tidak dikompilasi Bangun 1702

pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 118 60

m_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 118 91

m_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 129 72

m_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 148 75

m_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 168 77

m_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 187 72

6 Fehler (s), 0 Warnung (s) 7 1

Jadi catatan, kecuali jika saya melewatkannya, anda harus menentukan di mana tempat file-file tersebut. Sebagai catatan, kecuali jika saya melewatkannya, Anda harus menentukan di mana menempatkan file-file tersebut. Kita perlu mencoba dan melihat kode untuk mengetahui bahwa kita perlu membuat folder "Layouts" di Include dan menempatkan file Box.mqh di dalamnya.Kita perlu mencoba dan melihat kode untuk mengetahui bahwa kita perlu membuat folder "Layouts" di Include dan menempatkan file Box.mqh di dalamnya.


 

Ich bin auf ein Problem mit diesem nützlichen Add-on gestoßen.

Ich bitte diejenigen um Rat, die sich mit Standard-Steuerelementen auskennen.

Da dieses Add-In mit Panels die Standardklassen CWnd und CWndClient verwendet, gehe ich davon aus, dass die Kenntnis ihrer internen Struktur ausreicht, um zu verstehen, wo der "Hund im Pfeffer liegt".

Die Essenz des Problems. Wir nehmen das Programm Controls2.mq5 aus dem Artikel (zum Kompilieren benötigen wir auch ControlsDialog2.mqh und Box.mqh), kompilieren es und führen es aus.

Fast alles funktioniert gut, bis auf den "Datapicker". Er öffnet und schließt sich nur, aber im geöffneten Zustand reagiert er nicht auf Klicks und überspringt Ereignisse an die darunter liegenden Steuerelemente.

Die ursprüngliche ähnliche Demo von MQ (Experts/Examples/Controls.mq5) funktioniert mit "datapicker" normal.

 
Stanislav Korotky:

Fast alles funktioniert gut, außer dem "Datapicker". Es öffnet und schließt nur, aber im offenen Zustand reagiert es nicht auf Drücke und überspringt Ereignisse zu den darunter liegenden Steuerelementen.

Die ursprüngliche ähnliche Demo von MQ (Experts/Examples/Controls.mq5) funktioniert mit "datapicker" normal.

Die Frage wird entfernt. In CDatePicker gibt es keinen BringToTop-Aufruf, wenn das Dropdown aufgeklappt wird, wie es z.B. in CComboBox der Fall ist. Im Standardbeispiel funktioniert der CDatePicker aufgrund der Tatsache, dass seine Initialisierung (absichtlich oder versehentlich) nach der Erstellung der "Leafbox" verschoben wurde, die topologisch unter ihm liegt. Und die Steuerelemente in CWndContainer::OnMouseEvent werden vom letzten zum ersten hinzugefügten umgangen.

Um dies normal zu beheben, müsste CDatePicker::ListShow überschrieben werden, aber das ist nicht virtuell. Wir müssen CDatePicker::OnClickButton umdefinieren und dort BringToTop hinzufügen. Allerdings können wir das nicht so gut machen wie mit jeder virtuellen Methode in der Standardbibliothek, da alle Mitgliedsvariablen als privat deklariert sind. Insbesondere ist es unmöglich, zu schreiben:

bool MyDatePicker::OnClickButton(void) // override
{
    return ((m_drop.Pressed()) ? BringToTop() && ListShow() : ListHide());
}

denn m_drop ist nicht verfügbar. Wir müssen BringToTop sowohl beim Öffnen als auch beim Zusammenklappen aufrufen.

#include <Controls/DatePicker.mqh>

class CDatePickerFixed: public CDatePicker
{
  protected:
    virtual bool OnClickButton() override
    {
      BringToTop();
      return CDatePicker::OnClickButton();
    }
};
 

und es gibt ein paar Fehler:


 
Danke für den Austausch