Diskussion zum Artikel "Graphische Interfaces VI: Das Checkbox Control, Das Edit Control und deren gemischte Typen (Kapitel 1)" - Seite 2

 
Thomas Schwabhäuser:

...

Danke für den Hinweis!

Ich werde diese Funktion hinzufügen. Achten Sie auf Updates für zukünftige Artikel in dieser Serie.

 

in Ihren Beispielen werden immer id, lparam, dparam, sparam ausgegeben.

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)

     {

      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

      //Print(m_spin_edit1.GetValue());

     }

erhalten wir folgendes

TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:

id - Element-Bezeichner

lparam - ?

dparam - ?

sparam - Name des Elements

wir betrachten ein Eingabefeld - natürlich ist es interessant, den eingegebenen Wert zu erhalten, wie kann man das so schnell wie möglich machen?

 
Pavel Kolchin:

in Ihren Beispielen werden immer id, lparam, dparam, sparam ausgegeben.

...

id - Element-Bezeichner

lparam - ?

dparam - ?

sparam - Elementname

Steuerelemente erzeugen Nachrichten und Parameter bedeuten in den meisten Fällen Folgendes:

  • id - Bezeichner des Ereignisses.
  • lparam - Bezeichner des Elements.
  • dparam - Element-Index.
  • sparam - angezeigter Text, der vom Benutzer der Bibliothek angegeben wird (Elementname).

Ich werde später eine Tabelle vorbereiten, die den Satz von Ereignisparametern von jedem Element zeigt.

Pavel Kolchin:

...

wir betrachten ein Eingabefeld - natürlich ist es interessant, den eingegebenen Wert zu erhalten, wie kann man das so schnell wie möglich tun?

Mit der Methode CSpinEdit::GetValue() können Sie den aktuellen Wert im Eingabefeld abrufen.

Beispiel:

//--- Ein Ereignis aus dem Eingabefeld ist eingetroffen
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- Wenn die Artikel-ID aus dem ersten Eingabefeld stammt
      if(lparam==m_spin_edit1.Id())
        {
         //--- Ausgabe des Wertes
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
 
Und wenn wir den Namen nicht kennen oder wir haben hundert Felder, vielleicht gibt es eine Methode nach Id, um zu sehen, was es gibt oder etwas wie this.GetValue()
 
Pavel Kolchin:
Und wenn wir den Namen nicht kennen oder hundert Felder haben, gibt es vielleicht eine Methode nach id, um zu sehen, was da ist, oder etwas wie this.GetValue().
So hat jedes Element seine eigene eindeutige Element-ID.
 
Anatoli Kazharski:
So hat jedes Element seinen eigenen eindeutigen Elementbezeichner.


if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   if(lparam==m_spin_edit1.Id()){Print(m_spin_edit1.GetValue());}

   if(lparam==m_spin_edit2.Id()){Print(m_spin_edit2.GetValue());}

   if(lparam==m_spin_edit3.Id()){Print(m_spin_edit3.GetValue());}

   if(lparam==m_spin_edit4.Id()){Print(m_spin_edit4.GetValue());}

   if(lparam==m_spin_edit5.Id()){Print(m_spin_edit5.GetValue());}

   if(lparam==m_spin_edit6.Id()){Print(m_spin_edit6.GetValue());}

   if(lparam==m_spin_edit7.Id()){Print(m_spin_edit7.GetValue());}

   if(lparam==m_spin_edit8.Id()){Print(m_spin_edit8.GetValue());}

   if(lparam==m_spin_edit9.Id()){Print(m_spin_edit9.GetValue());}

   ...

}

Ich wollte keinen solchen Code schreiben, vielleicht ist es sinnvoll, es zu tun.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

aber ich habe nicht viele Felder, die erste Option ist für mich in Ordnung.

 

Pavel Kolchin:

...

Ich wollte nicht so einen Code schreiben, vielleicht ist es sinnvoll, es zu tun.

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

Ich habe noch keine Lösung, wie man das für alle get-Methoden aller Elemente machen kann. Aber ich werde darüber nachdenken.
 
//+------------------------------------------------------------------+
//| ChartEvent-Funktion|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Einfache Aufgabe. Ändern Sie die Farbe der Beschriftung des Kontrollkästchens, wenn Sie auf das Kontrollkästchen klicken. Angekreuzt - grüner Text, nicht angekreuzt - rot. Das klappt nicht. Nicht angekreuzt wird es blau, angekreuzt ist es immer noch blau.
 

Alexander Fedosov:

Einfache Aufgabe. Ändern Sie die Farbe der Beschriftung des Kontrollkästchens, wenn Sie auf das Kontrollkästchen klicken. Angekreuzt - grüner Text, nicht angekreuzt - rot. Das klappt nicht. Nicht angekreuzt wird es blau, angekreuzt ist es immer noch blau.

Jetzt können Sie die Farben für verschiedene Zustände nur vor der Installation des Elements festlegen(Beispiel unten):

//+------------------------------------------------------------------+
//| Erstellt Ankreuzfeld 1|
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- Speichern des Fensterzeigers
   m_checkbox1.WindowPointer(m_window1);
//--- Eigenschaften vor der Erstellung festlegen
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- Ein Steuerelement erstellen
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| ChartEvent-Funktion|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
Einfache Aufgabe. Ändern Sie die Farbe der Beschriftung des Kontrollkästchens, wenn Sie auf das Kontrollkästchen klicken. Angekreuzt - grüner Text, nicht angekreuzt - rot. Das klappt nicht. Nicht angekreuzt wird es blau, angekreuzt ist es immer noch blau.

Wie wäre es damit?

   if(lparam==program.m_checkbox.Id())
     {
      if(program.m_checkbox.CheckButtonState()) program.m_checkbox.LabelColor(clrGreen);
      else program.m_checkbox.LabelColor(clrRed);
     }