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
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Bem, Tol, obrigado pela dica:
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++;
}
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)!Essa é a única maneira?
...
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.
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:
#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?
...
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.
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!
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: