Diskussion zum Artikel "Graphisches Interface X: Textauswahl im mehrzeiligen Textfeld (build 13)" - Seite 7

 
Konstantin:

Die Methoden X(const int x) und Y(const int y) beeinflussen die Position der Tabelle im Formular in keiner Weise, sie befindet sich immer in der linken oberen Ecke.

Die relativen Koordinaten werden bei der Erstellung von Elementen in einer benutzerdefinierten Klasse festgelegt :

//--- Ein Steuerelement erstellen
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);

//---

Was ist die Aufgabe?

 
Anatoli Kazharski:

Relative Koordinaten werden festgelegt , wenn Elemente in einer benutzerdefinierten Klasse erstellt werden:

//---

Was ist die Aufgabe?

zwei Tabellen horizontal zu platzieren, x_gap,y_gap ändert die Position des horizontalen Scrollens und das war's ((.

PS. so, es scheint, verschoben haben, aber aus irgendeinem Grund zwei Tabellen verschoben werden ))

und in der Methode:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

wenn es zwei Tabellen gibt, ist der erste Parameter immer 0 oder ist es eine Seriennummer von identischen Objekten?

Aus irgendeinem Grund verschiebt sich die erste Tabelle hartnäckig unter die zweite Tabelle.

 
Konstantin:

...

PS. also, es scheint sich verschoben zu haben, aber aus irgendeinem Grund haben sich zwei Tabellen verschoben ))

und in der Methode:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

wenn es zwei Tabellen gibt, ist der erste Parameter immer 0 oder ist es eine Seriennummer von identischen Objekten?

Der erste Parameter ist die Nummer des Formulars, an das das Objekt angehängt ist. Vielleicht fügen Sie ein und dieselbe Tabelle in die gemeinsame Liste der Elemente ein.
 
Anatoli Kazharski:
Der erste Parameter ist die Nummer des Formulars, an das das Element angehängt ist. Vielleicht fügen Sie der gemeinsamen Liste der Elemente die gleiche Tabelle hinzu.


Was meinen Sie mit der gemeinsamen Liste? Wo ist sie getrennt?

Hier ist die Methode zur Erstellung in der Formularklasse:

/*!
 \brief Objekt erstellen
 \param const string a_name - Programmname
 \param const uint a_pause - Pause für die Aktualisierung der Statuszeile
 \return true bei Erfolg, sonst false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

GetTbl Methode gibt einen Zeiger auf CCanvasTable m_table zurück

 
Konstantin:

...

Ist das das von Ihnen gewünschte Ergebnis?

//---

Ich habe ein Beispiel im Archiv angehängt:

Dateien:
 
Konstantin:

Hier ist die create-Methode in der Formular-Klasse:

Die Methode GetTbl gibt einen Zeiger auf CCanvasTable m_table zurück .

//--- Ein Steuerelement erstellen
   if(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0,m_canvas_table2);
 
Anatoli Kazharski:

Wollen Sie ein solches Ergebnis?

//---

Im Archiv ist ein Beispiel beigefügt:


Ich habe es so gemacht:

/*!
 \brief Objekt erstellen
 \param const string a_name - Programmname
 \param const uint a_pause - Pause für die Aktualisierung der Statuszeile
 \return true bei Erfolg, sonst false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   //--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- Hinzufügen des Tabellenobjekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

und alles funktionierte, es stellt sich heraus, dass sofort nach dem Erstellen eines Objekts sollte es in einem Container platziert werden und erst dann ein anderes Objekt erstellen ))


 
Anatoli Kazharski:

Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende sind alle Elemente in der Hauptformularklasse als separate vorgefertigte Objekte zusammengefasst.
 
Konstantin:

Nein, ich habe Tabellen in anderen Klassen, ich verwende modulare Programmierung )), so dass es bequemer ist, die Funktionalität zu verwalten - Hauptformularklasse, Tabellenklasse 1, Tabellenklasse 2 usw. Am Ende werden alle Elemente in der Hauptformularklasse als separate fertige Objekte gesammelt.
Einverstanden. Viele Benutzer dieser Bibliothek tun dies, aber ich komme nicht an sie heran. )
 
Anatoli Kazharski:
Ich stimme zu. Viele Nutzer dieser Bibliothek tun das, aber ich komme einfach nicht an sie heran. )


Übrigens, es gibt ein Problem:

CWndEvents::CWndEvents(void) : m_chart_id(0),
                               m_subwin(0),
                               m_active_window_index(0),
                               m_indicator_shortname(""),
                               m_program_name(PROGRAM_NAME),
                               m_subwindow_handle(INVALID_HANDLE),
                               m_subwindow_shortname(""),
                               m_subwindows_total(1)

  {
//--- Starten Sie den Timer
   if(!::MQLInfoInteger(MQL_TESTER))
      ::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- Abrufen der ID des aktuellen Diagramms
   m_chart.Attach();
//--- Verfolgung von Mausereignissen einschalten
   m_chart.EventMouseMove(true);
//--- Befehlszeilenaufruf für Leertaste und Eingabetaste deaktivieren
   m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- Nummer des Teilfensters bestimmen
   DetermineSubwindow();
  }

Die ausgewählte Zeile erlaubt es nicht, im Tester zu arbeiten. Es ist besser, eine Auswahl wie diese zu treffen:

enum ENUM_GRAPHICS {
   GRAPHICS_NO    = 0,  // keine Notwendigkeit für Grafiken
   GRAPHICS_REAL  = 1,  // Charts für den realen Handel
   GRAPHICS_TEST  = 2   // Grafiken für Tests
};

/*!
 Gibt einen Hinweis auf das laufende Programm
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+
/*!
 Vorzeichen der Grafikanzeige
 \Rückgabe des Vorzeichens der Programmoperation aus der Aufzählung ENUM_GRAPHICS
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
   if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
      m_graphics = GRAPHICS_NO;
   else if(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_REAL;
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_TEST;
//---
   return m_graphics;
}

und im Programm eine Auswahl wie diese zu treffen:

   //--- Einstellung für OnTimer()
   uint _pause = 0;
   if(in_param.graphics == GRAPHICS_REAL)
      _pause = 500;                       // 500 ms
   else if(in_param.graphics == GRAPHICS_TEST)
      _pause = 60000;                     // 1 Minute

   if(!main_form.Create(name_mts, _pause)) {
      ::Print(__FUNCTION__," > Fehler bei der Erstellung einer GUI!");
      return INIT_FAILED;
   }

oder verwenden Sie einfach Flags, um eine Auswahl zu treffen