Diskussion zum Artikel "Grafische Interfaces VII: Das Tab-Control (Kapitel 2)" - Seite 2

 
Anatoli Kazharski:

Ja, natürlich. )

Das nächste Update für diese Klasse(CTabs) wird der "Multiline Tab Mode" sein.

Wie hier (mehrere Zeilen) :

Super. Schade, dass Tabellen und Listen vorerst nur Tabellen und Listen sind. Bis jetzt dienen sie praktisch nur zur Visualisierung von Daten ohne jegliche Interaktivität.

Ich würde natürlich gerne die notwendigen Spalten/Zeilen von Listen/Tabellen nehmen und auswählen, und einige Manipulationen mit ihnen durchführen - zum Beispiel: es gibt eine Liste, Checkboxen setzen, oder generell komplett die notwendigen Zeilen auswählen, und in einem separaten Fenster die allgemeinen Daten zu den ausgewählten Zeilen anzeigen .... So etwas wäre doch super :)

Aber um das zu können, muss man Methoden zur Manipulation dieser Daten hinzufügen. Vielleicht gibt es das schon, aber ich weiß es nicht?

 
Artyom Trishkin:

Großartig. Schade nur, dass Tabellen und Listen nur Tabellen und Listen sind. Bislang dienen sie praktisch nur der Visualisierung von Daten ohne jegliche Interaktivität.

...

Für die meisten der oben genannten Punkte ist alles da.

Das Auswählen eines Elements in Listen(CListView) erzeugt ein Ereignis, mit dem festgestellt werden kann, welches Element ausgewählt wurde und welcher aktuelle Wert ausgewählt wurde.

In Tabellen(CTable) ist es dasselbe. Bei der Auswahl einer Tabellenzeile wird ein Ereignis erzeugt, dessen Parameter den Zeilenindex (dparam-Parameter) enthalten, mit dem man dann die Werte in den Zellen dieser Zeile mit der Methode CTable::GetValue() abrufen kann:

//+------------------------------------------------------------------+
//| Gibt den Wert an den angegebenen Indizes zurück | 
//+------------------------------------------------------------------+
string CTable::GetValue(const int column_index,const int row_index)
  {
//--- Prüfung auf Verlassen des Spaltenbereichs
   int csize=::ArraySize(m_vcolumns);
   if(csize<1 || column_index<0 || column_index>=csize)
      return("");
//--- Prüfen auf Zeilenbereichsexit
   int rsize=::ArraySize(m_vcolumns[column_index].m_vrows);
   if(rsize<1 || row_index<0 || row_index>=rsize)
      return("");
//--- Rückgabewert
   return(m_vcolumns[column_index].m_vrows[row_index]);
  }

//---

Und im Modus des Editierens von Tabellenzellen wird ein Ereignis erzeugt, in dessen Parametern (Parameter sparam) man einen String mit Spaltennummer, mit Zeilennummer und aktuellem Wert in der bearbeiteten Zelle im Format "column_row_text" erhalten kann.

Artyom Trishkin:

Ich möchte, natürlich, zu nehmen und wählen Sie die notwendigen Spalten/Zeilen von Listen/Tabellen, und führen Sie einige Manipulationen mit ihnen - zum Beispiel: es gibt eine Liste, setzen Sie Kontrollkästchen, oder im Allgemeinen wählen Sie die notwendigen Zeilen, und zeigen Sie in einem separaten Fenster die allgemeinen Daten auf die ausgewählten Zeilen.... So etwas wäre super :)

Ich werde später separate Klassen für Listen mit Kontrollkästchen und Optionsfeldern erstellen.

 
Hallo. Ein wirklich schöner Artikel, aber im Moment habe ich einige Fragen:

1.)
Ich finde keine Informationen, wie ich einfache CLabel oder CEdit Steuerelemente zum Formular hinzufügen kann. (Aus objects.mqh)
Sie haben keine Funktion wie WindowPointer().
Ich kann diese Objekte erstellen, aber ich kann sie nicht an das Fenster anhängen.

Die
CWndContainer::AddToElementsArray(m_subwin, _MyEditBox);
funktioniert in diesem Fall nicht...

2.)
Ist die CComboBox ein statisches Objekt. Ist es möglich, die Liste der Elemente in der

ComboBox-Listview nach der Erstellung der ComboBox zu ändern?

Vielen Dank!

 

Tol, etwas, das ich nicht gewinnen kann... Es gibt zwei Fenster. Vom ersten - vom Hauptmenü aus - öffnen wir das zweite Fenster, das 4 Registerkarten mit Symbolen hat. Mit jeder Registerkarte ist eine eigene Tabelle verbunden.

Das Problem ist folgendes: Beim Öffnen des ersten Fensters ist immer die zuletzt erstellte Tabelle sichtbar, und es spielt keine Rolle, dass vor dem Öffnen des Fensters die Registerkarte programmatisch auf die erforderliche umgeschaltet wird - sie ist ausgewählt, wie sie sein sollte, aber die Tabelle auf ihr ist nicht die, die an sie gebunden ist, sondern die jüngste.

Ich habe ein Beispiel gemacht. Bild des sich öffnenden ersten Fensters:

Screenshots der MetaTrader-Handelsplattform

EURUSD, D1, 2016.11.03

MetaQuotes Software Corp. MetaTrader 5, Demo

EURUSD, D1, 2016.11.03, MetaQuotes Software Corp., MetaTrader 5, Demo


Wie Sie sehen können, ist die Registerkarte 1 hervorgehoben, aber die Tabelle ist sichtbar, die an die Registerkarte 4 gebunden ist - sie ist in der Tabelle selbst in den Spaltenüberschriften geschrieben.

Wenn Sie die Registerkarte wechseln, werden die Tabellen dort platziert, wo sie sein sollen. Ich habe die zweite Registerkarte mit der Maus markiert:

Bildschirmfotos der MetaTrader-Handelsplattform

EURUSD, D1, 2016.11.03

MetaQuotes Software Corp. MetaTrader 5, Demo

EURUSD, D1, 2016.11.03, MetaQuotes Software Corp., MetaTrader 5, Demo


Zurück zum ersten:

Screenshots der MetaTrader-Handelsplattform

EURUSD, D1, 2016.11.03

MetaQuotes Software Corp. MetaTrader 5, Demo

EURUSD, D1, 2016.11.03, MetaQuotes Software Corp., MetaTrader 5, Demo


Was mache ich falsch? Oder ist es ein Fehler?

Dateien im Trailer. Indikator.

Dateien:
 
Artyom Trishkin:

...

Was mache ich falsch? Oder ist es ein Fehler?

Mit CTabs-Registerkarten funktioniert es korrekt. Aber für CIconTabs-Registerkarten habe ich noch keine persönlichen Arrays in der Bibliotheks-Engine und keine automatische Anzeige des Inhalts der ausgewählten Registerkarte beim Öffnen eines Dialogfelds erstellt. Dies wird mit dem nächsten Update behoben werden.

Als vorübergehende Lösung können Sie jedoch bereits jetzt das Öffnen einer Dialogbox in einer benutzerdefinierten Klasse verfolgen und die Registerkarten aktualisieren, wie in der Auflistung unten gezeigt:

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CUSTOM+ON_OPEN_DIALOG_BOX)
     {
      if(lparam==m_window2.Id())
         m_icon_tabs.ShowTabElements();
     }
  }
 
Anatoli Kazharski:

Es funktioniert korrekt mit Registerkarten des Typs CTabs . Aber für CIconTabs-Registerkarten habe ich noch keine persönlichen Arrays in der Bibliotheks-Engine und automatische Anzeige des Inhalts der ausgewählten Registerkarte beim Öffnen eines Dialogfensters gemacht. Dies wird mit dem nächsten Update behoben werden.

Aber als vorübergehende Lösung können Sie jetzt schon das Öffnen eines Dialogfensters in einer benutzerdefinierten Klasse verfolgen und die Registerkarten wie in der Auflistung unten gezeigt aktualisieren:

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CUSTOM+ON_OPEN_DIALOG_BOX)
     {
      if(lparam==m_window2.Id())
         m_icon_tabs.ShowTabElements();
     }
  }
Danke! Das funktioniert so. Jetzt werde ich zwei sich überschneidende Tabellen in jede Registerkarte einfügen - mal sehen ;)
 
HI , wenn ich den Dialog aufrollen, und ändern Sie die period.the Dialog ist nicht ok.in MT4.
 
Beim Kompilieren entstehen Fehler wie:
'return' - cannot convert from const pointer to nonconst pointer        SplitButton.mqh 90      65
. Dies kann durch Löschen von Const in den entsprechenden Zeilen behoben werden.
 

Ich versuche, ein Eingabefeld zu einer Registerkarte hinzuzufügen, aber es funktioniert nicht.

input double whenToTrail=10.3;

class CProgram: public CWndEvents
{
protected:
   CSpinEdit         m_StartTS;
//Code
protected:
   bool              CreatetrailStop(const int x_gap, const int y_gap, const string text);
};


dann die Funktion.

bool CProgram::CreatetrailStop(const int x_gap, const int y_gap, string text)
  {
//--- Speichern des Zeigers auf das Hauptelement
   m_StartTS.WindowPointer(m_window);
//--- Koordinaten
   int x = m_window.X() + x_gap;
   int y = m_window.Y() + y_gap;
//--- Reserve für die Registerkarte
   m_tabs.AddToElementsArray(1, m_StartTS);
//--- Eigenschaften
   m_StartTS.XSize(95);
   m_StartTS.YSize(15);
   m_StartTS.EditXSize(40);
   m_StartTS.MinValue(0.01);
   m_StartTS.StepValue(0.01);
   m_StartTS.SetDigits(1);
   m_StartTS.SetValue(NormalizeDouble(whenToTrail,1));
   
   m_StartTS.ResetMode(true);
//--- Ein Steuerelement erstellen
   if(!m_StartTS.CreateSpinEdit(m_chart_id, m_subwin, text, x, y))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0, m_StartTS);
   return(true);
  }

Dieses Objekt ist nicht mit dem Panel verbunden, sondern befindet sich auf dem Diagramm.

und nach dem Löschen des Diagramms bleibt das Objekt
 
Hallo, dieser Artikel interessiert mich sehr, ich habe versucht, es zu installieren, aber wenn ich es kompiliere, gibt es mir diese Fehler:

Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ LeftTransp_black.bmp' nicht gefunden Calendar.mqh 443 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ LeftTransp_blue.bmp' nicht gefunden Calendar.mqh 444 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ calendar_today.bmp' nicht gefunden Calendar.mqh 738 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_on.bmp' nicht gefunden DropCalendar.mqh 435 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_off.bmp' nicht gefunden DropCalendar.mqh 436 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_locked.bmp' nicht gefunden DropCalendar.mqh 437 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ RightTransp_rotate_black.bmp' nicht gefunden TreeItem.mqh 247 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ RightTransp_rotate_white.bmp' nicht gefunden TreeItem.mqh 248 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Controls \ pointer_x_resize.bmp' nicht gefunden Pointer.mqh 8 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_x_resize_blue.bmp' nicht gefunden Pointer.mqh 9 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_y_resize.bmp' nicht gefunden Pointer.mqh 10 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_y_resize_blue.bmp' nicht gefunden Pointer.mqh 11 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_xy1_resize.bmp' nicht gefunden Pointer.mqh 12 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_xy1_resize_blue.bmp' nicht gefunden Pointer.mqh 13 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_xy2_resize.bmp' nicht gefunden Pointer.mqh 14 11
Ressourcendatei '\ Bilder \ EasyAndFastGUI \ Steuerelemente \ pointer_xy2_resize_blue.bmp' nicht gefunden Pointer.mqh 15 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Icons \ bmp16 \ folder.bmp' nicht gefunden FileNavigator.mqh 284 11
Ressourcendatei '\ Images \ EasyAndFastGUI \ Icons \ bmp16 \ text_file.bmp' nicht gefunden FileNavigator.mqh 285 11

Ich habe in der MQL5-Zip-Datei nachgeschaut, aber die Dateien sind nicht da, gibt es eine Möglichkeit, sie zu bekommen?
Vielen Dank für Ihre Hilfe.