Discussão do artigo "Interfaces Gráficas X: Gestão avançada de listas e tabelas. Otimização do código (build 7)" - página 9

 

Bem, Tol, obrigado pela dica:

//--- Colunas
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Obter a posição atual do controle deslizante da barra de rolagem vertical
      v=m_scrollv.CurrentPos()+t;
      //--- Linhas
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Dados da tabela de deslocamento
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Ajuste para a linha destacada
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
Então, tudo funciona como deveria ;)
 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Biblioteca EasyAndFastGUI

Viktor Glovluk, 2017.01.26 10:42 AM.

Caros membros do fórum, por favor, ajudem!

Com base nesta biblioteca de Anatoli Kazharski , tentando soldar uma coruja e queria organizar um registro nos estados de arquivo de caixas de seleção e valores de campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!

Desde já, obrigado!


 

Viktor Glovluk, 2017.01.26 10:42

Caros membros do fórum, por favor, me ajudem!

Com base nessa biblioteca de Anatoli Kazharski , estou tentando soldar uma coruja e queria organizar um registro no arquivo dos estados das caixas de seleção e dos valores dos campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!

Desde já, obrigado!

O clique nas caixas de seleção pode ser rastreado pelo evento com o identificador ON_CLICK_LABEL.

Em lparam vem o valor do identificador do elemento.

Exemplo:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento de clique no rótulo de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- Se você clicou na primeira caixa de seleção
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

Essa é realmente a única maneira?

//--- Se você clicou na primeira caixa de seleção

if(lparam==m_checkbox1.Id())

Respondido já depois de eu ter deixado esta postagem! Obrigado! E eu tenho que passar por todas as caixas de seleção e campos de entrada? E, por exemplo, se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos itens? Então, por meio desse índice, obter os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!
 
Viktor Glovluk:

Essa é a única maneira?

Como você quer isso? Esclareça.
 
Viktor Glovluk:

...

O que é um exemplo se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos elementos? Então, por esse índice, obtenha os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!

Observe o conteúdo da classe CWndContainer. Todos eles estão armazenados na estrutura WindowElements. Eles podem ser acessados a partir da classe do usuário.

   //--- Estrutura de matrizes de elementos
   struct WindowElements
     {
      //--- Matriz total de todos os objetos
      CChartObject     *m_objects[];
      //--- Matriz total de todos os elementos
      CElementBase     *m_elements[];

      //--- Matrizes pessoais de elementos:
      // Matriz de menus de contexto
      CContextMenu     *m_context_menus[];
      //--- Matriz de menus principais
      CMenuBar         *m_menu_bars[];
      //--- Dicas de ferramentas
      CTooltip         *m_tooltips[];
      //--- Matriz de listas suspensas de diferentes tipos
      CElementBase     *m_drop_lists[];
      //--- Matriz de barras de rolagem
      CElementBase     *m_scrolls[];
      //--- Matriz de tabelas de rótulos de texto
      CElementBase     *m_labels_tables[];
      //--- Matriz de tabelas dos campos de entrada
      CElementBase     *m_tables[];
      //--- Matriz de tabelas desenhadas
      CElementBase     *m_canvas_tables[];
      //--- Matriz de guias
      CTabs            *m_tabs[];
      //--- Matriz de guias com imagens
      CIconTabs        *m_icon_tabs[];
      //--- Matriz de calendários
      CCalendar        *m_calendars[];
      //--- Matriz de calendários suspensos
      CDropCalendar    *m_drop_calendars[];
      //--- Listas de árvores
      CTreeView        *m_treeview_lists[];
      //--- Navegadores de arquivos
      CFileNavigator   *m_file_navigators[];
      //--- Gráficos padrão (objetos gráficos)
      CStandardChart   *m_sub_charts[];
      //--- Controles deslizantes de imagem
      CPicturesSlider  *m_pictures_slider[];
      //--- Tempo
      CTimeEdit        *m_time_edits[];
      //--- Campos com várias linhas
      CTextBox         *m_text_boxes[];
     };
   //--- Matriz de matrizes de elementos para cada janela
   WindowElements    m_wnd[];
 

Quanto mais longe, melhor! :)

Novamente me deparei com implementações de manipuladores de eventos que não entendo! Ao criar um aplicativo personalizado, ele deve conectar a GUI por meio de uma classe:

//--- Conexão da classe do painel de comércio
#include "Menu.mqh"
CProgram program;

mas então como capturar o pressionamento de botões, como obter os estados das caixas de seleção e os valores dos campos de entrada, se eles estiverem na zona privada da classe CProgram? Devo mover o que preciso para a zona pública ou estou entendendo algo errado?

 
Viktor Glovluk:

...

mas depois como capturar o pressionamento de botões, como obter os estados das caixas de seleção e os valores dos campos de entrada, ...

No manipulador do CProgram.

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento de clique no rótulo de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Todos os artigos têm arquivos de exemplo de aplicativos MQL que mostram como lidar com eventos de controles.

 
Anatoli Kazharski:

No manipulador do CProgram.

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Evento de clique no rótulo de texto
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

Todos os artigos têm arquivos de exemplo de aplicativos MQL que mostram como lidar com eventos de controle.

No manipulador CProgram está claro, mas esse manipulador é para a interface, certo? Você não deve inserir soluções comerciais nele! Entendo muito pouco sobre OOP, a maior parte do meu conhecimento vem de seus artigos, portanto, posso ser estúpido! :)

Então, por exemplo, como implementar no Expert Advisor a abertura de uma ordem, cuja quantidade é definida no campo de entrada? Preciso obter o valor desse campo no próprio EA!

 
Viktor Glovluk:

No manipulador CProgram, isso está claro, mas esse manipulador é para a interface, certo? Você não deveria estar inserindo soluções comerciais nele!

Por que não? Sim, você pode. É uma classe de seu aplicativo MQL (indicador ou Expert Advisor). Tudo é igual.

Você pode obter o valor do campo de entrada da seguinte forma:

m_spin_edit1.GetValue()