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

 
Konstantin:

Übrigens, es gibt ein Problem:

Die hervorgehobene Zeile erlaubt es nicht, im Testprogramm zu arbeiten.

Ich habe noch gar nicht im Tester getestet, da es dort bisher viele Einschränkungen gab. Also vorläufig so weit.

Haben Sie schon versucht, die GUI im Tester zu testen? Was ist das Ergebnis? Funktionieren die Ereignisse? Werden alle grafischen Objekte angezeigt?

 
Anatoli Kazharski:

Ich habe es noch nicht im Tester getestet, da es dort vorher eine Menge Einschränkungen gab. Deshalb ist es jetzt erst einmal so.

Haben Sie schon versucht, die GUI im Tester zu testen? Was ist das Ergebnis? Funktionieren die Ereignisse? Werden alle grafischen Objekte angezeigt?


Ja, alle Objekte werden angezeigt, Mausereignisse auf Diagrammen funktionieren im Tester nicht, aber die gesamte Oberfläche ist lebendig, und das war auch schon vorher so.

Generell werde ich den eingebauten Timer wohl erst einmal aufgeben, um die Bibliothek nicht zu bearbeiten ))

 

Ich kann nicht herausfinden, wie man das Formular wurde eine bestimmte Größe auf X erstellt und wurde an den rechten Rand des Diagramms gebunden, dh, wenn Sie die Größe des Diagramms auf X ändern, würde das Formular nicht die Größe ändern würde nach rechts / links, ohne seine Größe zu bewegen.

Als eine Möglichkeit, die ChartEventChartChange-Methode in der CWndEvents-Klasse zu überschreiben, ist diese Methode in den privaten Abschnitt, vielleicht ist es sinnvoll, die Methoden zu verschieben:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

In den geschützten Bereich verschieben, aber auch dort werden Methoden aus dem privaten Bereich verwendet? Falls jemand auf ein solches Problem gestoßen ist, bitte ich um einen Lösungsvorschlag

 
Konstantin:

Ich kann nicht herausfinden, wie man das Formular wurde eine bestimmte Größe auf X erstellt und wurde an den rechten Rand des Diagramms gebunden, dh, wenn Sie die Größe des Diagramms auf X ändern, würde das Formular nicht die Größe ändern würde nach rechts / links, ohne seine Größe zu bewegen.

Als eine Möglichkeit, die ChartEventChartChange-Methode in der CWndEvents-Klasse zu überschreiben, ist diese Methode in den privaten Abschnitt, vielleicht ist es sinnvoll, die Methoden zu verschieben:

In den geschützten Bereich verschieben, aber auch dort werden Methoden aus dem privaten Bereich verwendet? Generell, wenn jemand auf ein solches Problem gestoßen ist, bitte einen Lösungsvorschlag machen

Ungefähr so:

//+------------------------------------------------------------------+
//|| Erzeugt ein Formular für die Steuerelemente.
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Hinzufügen des Fensterzeigers zum Fenster-Array
   CWndContainer::AddWindow(m_window);
//--- Abmessungen
   int x_size =200;
   int y_size =200;
//--- Koordinaten
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- Eigenschaften
...
//--- Formularerstellung
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

Im Eventhandler der Benutzerklasse der MQL-Anwendung bei der Verarbeitung des Ereignisses CHARTEVENT_CHART_CHANGE:

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

Ergebnis:

//---

Sie können auch eine Prüfung hinzufügen, ob sich die Größe (Breite) des Diagrammfensters geändert hat, denn das Ereignis CHARTEVENT_CHART_CHANGE wird in verschiedenen Fällen erzeugt. Zum Beispiel, wenn das Diagramm gescrollt wird.

 
Anatoli Kazharski:

Sie lautet in etwa so:

//---

Im Eventhandler einer benutzerdefinierten MQL-Anwendungsklasse bei der Verarbeitung eines CHARTEVENT_CHART_CHANGE-Ereignisses:

//---

Ergebnis:

//---

Sie können auch eine Prüfung hinzufügen, ob sich die Größe (Breite) des Diagrammfensters geändert hat, da das Ereignis CHARTEVENT_CHART_CHANGE in verschiedenen Fällen erzeugt wird. Zum Beispiel, wenn das Diagramm gescrollt wird.


oops, es hat funktioniert ))
 

Wie erhält man in der Tabelle den Index der Zeile, auf die die linke Maustaste geklickt wurde, wenn SelectableRow(false) beim Erstellen der Tabelle gesetzt wurde? Das Parsen des Parameters sparam in OnEvent sieht nicht elegant aus. Natürlich ist es möglich, SelectableRow(true) zu verwenden und SelectedItem() zu benutzen, aber die Aufgabe ist, ohne Zeilen in der Tabelle auszuwählen.

 
Konstantin:

Wie erhält man in der Tabelle den Index der Zeile, auf die die linke Maustaste geklickt wurde, wenn SelectableRow(false) beim Erstellen der Tabelle gesetzt wurde? Das Parsen des Parameters sparam in OnEvent sieht nicht gerade elegant aus. Natürlich können wir SelectableRow(true) und SelectedItem() verwenden, aber die Aufgabe ist ohne Auswahl von Zeilen in der Tabelle.

Bis jetzt nur so, aber ich werde diese Funktion hinzufügen.
 
Wie kann man zwischen dem Ereignis der Auswahl einer Zeile in einer Tabelle und der Auswahl eines Elements in einem Kombinationsfeld unterscheiden? Aus dem Code kann ich sehen, dass sie das gleiche Ereignis ON_CLICK_LIST_ITEM verwenden.
 
Konstantin:
Wie kann man zwischen dem Ereignis der Auswahl einer Zeile in einer Tabelle und der Auswahl eines Elements in einem Kombinationsfeld unterscheiden? Aus dem Code geht klar hervor, dass beide das gleiche Ereignis ON_CLICK_LIST_ITEM verwenden.
Und warum? Was genau hindert Sie daran, dies zu tun?
 

Ich zeige eine Tabelle in einem Formular an, wähle eine Zeile darin aus, wähle einen Wert in einer Combobox aus und die Daten aus der Tabellenzeile und der Wert aus der Combobox sollen in eine separate Entität geschrieben werden. Nun sind die Ereignisse nicht voneinander abgegrenzt und es ist notwendig, Krücken zu bauen, die die Aufgabe erfüllen:


Vielleicht können Sie einen anderen Mechanismus vorschlagen?

Im Grunde ist die Tabelle ein Array von Ticker-Paaren, die Combo-Box enthält Signaltypen, eine separate Entität sind die Objekte des Arrays von Signalen. Bei den Objekten selbst handelt es sich nicht um ein einzelnes Feld, sondern um komplexe benutzerdefinierte Datentypen, in denen ein Paar von Tickern aus der Tabelle und ein Signaltyp gespeichert werden, und dann wird eine weitere Verarbeitung vorgenommen.