Diskussion zum Artikel "Grafische Interfaces VIII: Das Datei-Navigator Control (Kapitel 3)" - Seite 2

 

Anatoly, das ist meiner Meinung nach die beste Implementierung der gui Bibliothek in mql, die ich hier gesehen habe.

Ich bin jetzt auf der Suche, wie man "Bolzen" es zu meinem EA. Alles ist ausreichend, bis auf zwei Dinge:

1) es gibt keine Tabelle mit Steuerelementen innerhalb einzelner Zellen (Kontrollkästchen, Schaltflächen, ...).

2) Ich kann nicht "aufholen", wie man ein Fenster mit dynamischem Inhalt zu machen.

Für 1)-th ist es im Prinzip klar, dass man eine neue Klasse als Erweiterung von CTable machen muss. Aber bei 2) ist es ein Rätsel. Nehmen wir an, dass zu verschiedenen Zeitpunkten der Arbeit des Expert Advisors ein Dialogfenster geöffnet wird, in dem sich je nach den aktuellen Bedingungen eine unterschiedliche Anzahl von Checkboxen befinden kann. Wenn sich die Anzahl der Kontrollkästchen beim nächsten Öffnen des Fensters erhöht, ist klar, wie das geschieht. Aber wenn die Anzahl der Kontrollkästchen abnimmt - wie geht das? Wenn ich es richtig verstehe, ist es notwendig, einige der Steuerelemente, die dieses Fenster "abonniert" haben, zu "töten", aber in CWndContainer gibt es keine Methoden zum Zerstören von Elementen, nur Methoden zum Hinzufügen. Können Sie mir sagen, wie man das macht, wenn es in dieser Version der Bibliothek möglich ist?

 
akskarabey:

Anatoly, das ist meiner Meinung nach die beste Implementierung der gui Bibliothek in mql, die ich hier gesehen habe.

Ich bin jetzt auf der Suche, wie man "Bolzen" es zu meinem EA. Alles ist ausreichend, bis auf zwei Dinge:

1) es gibt keine Tabelle mit Steuerelementen innerhalb einzelner Zellen (Kontrollkästchen, Schaltflächen, ...).

2) Ich kann nicht "aufholen", wie man ein Fenster mit dynamischem Inhalt zu machen.

Für 1)-th ist es im Prinzip klar, dass man eine neue Klasse als Erweiterung von CTable machen muss. Aber bei 2) ist es ein Rätsel. Nehmen wir an, dass zu verschiedenen Zeitpunkten der Arbeit des Expert Advisors ein Dialogfenster geöffnet wird, in dem sich je nach den aktuellen Bedingungen eine unterschiedliche Anzahl von Checkboxen befinden kann. Wenn sich die Anzahl der Kontrollkästchen beim nächsten Öffnen des Fensters erhöht, ist klar, wie das geschieht. Aber wenn die Anzahl der Kontrollkästchen abnimmt - wie geht das? Wenn ich es richtig verstehe, ist es notwendig, einige der Steuerelemente, die dieses Fenster "abonniert" haben, zu "töten", aber in CWndContainer gibt es keine Methoden zum Zerstören von Elementen, nur Methoden zum Hinzufügen. Können Sie mir sagen, wie man das macht, wenn es in dieser Version der Bibliothek möglich ist?

Vielen Dank für Ihre interessanten Vorschläge.

Ja, es gibt in dieser Version noch keine fertigen Lösungen. Ich sehe den Bedarf für solche Funktionen, also habe ich sie in den Plan für die Implementierung aufgenommen.

Zum zweiten Punkt. Wenn Sie eine dynamische Liste von Kontrollkästchen benötigen, ist es einfacher, eine weitere Klasse eines Elements wie CCheckboxList mit Methoden zum Hinzufügen und Entfernen von Elementen des Arrays (Liste) zu erstellen, nachdem das Element erstellt wurde. Übrigens planen wir auch, diese Funktion zu allen Arten von Listen und Tabellen hinzuzufügen.

 
Anatoli Kazharski:

Zum zweiten Punkt. Wenn Sie eine dynamische Liste von Kontrollkästchen benötigen, besteht eine einfachere Möglichkeit darin, eine weitere Klasse eines Elements vom Typ CCheckboxList mit Methoden zum Hinzufügen und Entfernen von Elementen des Arrays (der Liste) zu erstellen, nachdem das Element erstellt wurde. Es ist übrigens auch geplant, diese Funktion zu allen Arten von Listen und Tabellen hinzuzufügen.

Ist es möglich, mehrere Registerkarten mit verschiedenen Gruppen von Kontrollkästchen zu erstellen und die erforderliche anzuzeigen?
 
Andrey Khatimlianskii:
Können wir mehrere Registerkarten mit verschiedenen Gruppen von Kontrollkästchen erstellen und die gewünschte Gruppe anzeigen?

Wenn die Gruppen vordefiniert sind, dann ist diese Option in Ordnung.

Es ist bereits möglich, Registerkarten zu erstellen: GUIs VII: Elemente "Registerkarten" (Kapitel 2) >>>

 
Anatoli Kazharski:

Wenn die Sets von Anfang an vordefiniert sind, ist diese Option in Ordnung.

Es ist bereits möglich, Tabs zu erstellen: GUIs VII: Tab-Elemente (Kapitel 2) >>>.

Das war ein Hinweis an den Fragesteller )

Nun, und eine kleine Frage - ist es möglich, eine Registerkarte programmatisch zu aktivieren.

 
Andrey Khatimlianskii:

...

Nun, und eine kleine Frage - ist es möglich, die Registerkarte programmgesteuert zu aktivieren.

In einer benutzerdefinierten Klasse bei der Erstellung einer Schnittstelle vor der Erstellung eines Elements:

//+------------------------------------------------------------------+
//| Erzeugt einen Tabulatorbereich|
//+------------------------------------------------------------------+
bool CProgram::CreateTabs(void)
  {
#define  TABS1_TOTAL 4
//--- Übergabe des Panel-Objekts
   m_tabs.WindowPointer(m_window1);
//--- Koordinaten
   int x=m_window1.X()+TABS1_GAP_X;
   int y=m_window1.Y()+TABS1_GAP_Y;
//--- Arrays mit Text und Breite für Registerkarten
   string tabs_text[]={"Tab 1","Tab 2","Tab 3","Tab 4"};
   int tabs_width[]={90,90,90,90};
//--- Eigenschaften vor der Erstellung festlegen
   m_tabs.XSize(596);
   m_tabs.YSize(243);
   m_tabs.TabYSize(TabsHeight);
   m_tabs.PositionMode(TabsPosition);
   m_tabs.SelectedTab((m_tabs.SelectedTab()==WRONG_VALUE) ? 1 : m_tabs.SelectedTab());
//--- Hinzufügen von Registerkarten mit den angegebenen Eigenschaften
   for(int i=0; i<TABS1_TOTAL; i++)
      m_tabs.AddTab(tabs_text[i],tabs_width[i]);
//--- Ein Steuerelement erstellen
   if(!m_tabs.CreateTabs(m_chart_id,m_subwin,x,y))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0,m_tabs);
   return(true);
  }

//---

Ist das ausreichend? Oder ist es notwendig, in der Lage sein, Registerkarten programmatisch zu wechseln, nachdem das Element in den Prozess der Arbeit erstellt wird?

 

Es wäre wünschenswert, eine solche Funktion hinzuzufügen...

so etwas wie:

m_tabs.SelectTab(...)
 
Ruslan Khasanov:
Andrey Khatimlianskii:

Ich werde es möglich machen, eine Registerkarte zu aktivieren, indem man ihren Index angibt, nachdem sie erstellt worden ist.

Es gibt in der Tat Fälle, in denen dies notwendig sein kann. Ich habe eine Reihe von Ideen, wie die Aktivierung einer Registerkarte automatisch erfolgen könnte. )

 

Wie lässt sich die Größe des Navigators an die Größe des Fensters anpassen, in dem der Navigator angezeigt wird?

Beispiel: Das Fenster ist 450 groß. Wie kann ich den Navigator so in das Fenster einpassen, dass rechts und links ein Einzug von 2 Pixeln entsteht?

 
Artyom Trishkin:

Wie lässt sich die Größe des Navigators an die Größe des Fensters anpassen, in dem der Navigator angezeigt wird?

Beispiel: Das Fenster ist 450 groß. Wie kann ich den Navigator so in das Fenster einpassen, dass er rechts und links jeweils um 2 Pixel eingerückt ist?

Sie müssen die Methoden CFileNavigator::TreeViewAreaWidth() und CFileNavigator::ContentAreaWidth() verwenden, die die Breite für den Baumlistenbereich und den Inhaltsbereich angeben. Wenn Sie die Breite des Inhaltsbereichs nicht festlegen, wird der rechte Rand des Navigators automatisch am rechten Rand des Fensters ausgerichtet.