Discussão do artigo "Interfaces Gráficas VII: O Controle Guias (Capítulo 2)" - página 2

 
Anatoli Kazharski:

É claro que sim. )

A próxima atualização para essa classe(CTabs) será o "Modo de tabulação multilinha".

Como aqui (várias linhas):

Excelente. É uma pena que as tabelas e listas sejam apenas tabelas e listas por enquanto. Até o momento, elas praticamente servem apenas como visualização de dados sem nenhuma interatividade.

Eu gostaria, é claro, de pegar e selecionar as colunas/linhas necessárias de listas/tabelas e realizar algumas manipulações com elas - por exemplo: há uma lista, colocar caixas de seleção ou, em geral, selecionar completamente as linhas necessárias e exibir em uma janela separada os dados gerais nas linhas selecionadas .... Algo assim seria ótimo :)

No entanto, para poder fazer isso, você precisa adicionar métodos para manipular esses dados. Talvez isso já exista, mas eu não sei.

 
Artyom Trishkin:

Excelente. É uma pena que as tabelas e listas sejam apenas tabelas e listas. Até agora, elas servem praticamente apenas como visualização de dados sem nenhuma interatividade.

...

Para a maioria dos itens acima, está tudo lá.

A seleção de um item em listas(CListView) gera um evento, que pode ser usado para determinar qual item foi selecionado e qual valor atual foi selecionado.

O mesmo ocorre em tabelas(CTable). Ao selecionar uma linha da tabela, um evento é gerado e seus parâmetros contêm o índice da linha ( parâmetro dparam), pelo qual você pode obter os valores nas células dessa linha usando o método CTable::GetValue():

//+------------------------------------------------------------------+
//| Retorna o valor nos índices especificados. 
//+------------------------------------------------------------------+
string CTable::GetValue(const int column_index,const int row_index)
  {
//--- Verificar se está saindo do intervalo da coluna
   int csize=::ArraySize(m_vcolumns);
   if(csize<1 || column_index<0 || column_index>=csize)
      return("");
//--- Verificando a saída do intervalo de linhas
   int rsize=::ArraySize(m_vcolumns[column_index].m_vrows);
   if(rsize<1 || row_index<0 || row_index>=rsize)
      return("");
//--- Valor de retorno
   return(m_vcolumns[column_index].m_vrows[row_index]);
  }

//---

E no modo de edição de células da tabela é gerado um evento, em cujos parâmetros (parâmetro sparam) você pode obter uma string com o número da coluna, com o número da linha e o valor atual na célula que está sendo editada, no formato "column_row_text".

Artyom Trishkin:

Eu gostaria, é claro, de pegar e selecionar as colunas/linhas necessárias de listas/tabelas e realizar algumas manipulações com elas - por exemplo: há uma lista, colocar caixas de seleção ou, em geral, selecionar as linhas necessárias e exibir em uma janela separada os dados gerais nas linhas selecionadas.... Algo assim seria ótimo :)

Mais tarde, criarei classes separadas para listas com caixas de seleção e botões de rádio.

 
Olá. Um artigo muito bom, mas no momento tenho algumas dúvidas:

1.)
Não encontro informações sobre como posso adicionar controles CLabel ou CEdit simples ao formulário. (De objects.mqh)
Eles não têm uma função como WindowPointer().
Posso criar esses objetos, mas não posso anexá-los à janela.

O
CWndContainer::AddToElementsArray(m_subwin, _MyEditBox);
não funciona nesse caso...

2.)
O CComboBox é um objeto estático. É possível modificar a lista de elementos no

ComboBox-Listview após a criação do ComboBox?

Muito obrigado!

 

Tol, algo que não posso ganhar... Há duas janelas. Na primeira, a partir do menu principal, abrimos a segunda janela, que tem 4 guias com ícones. Cada guia tem sua própria tabela vinculada a ela.

O problema é o seguinte: ao abrir a primeira janela, a tabela criada mais recentemente está sempre visível, e não importa que, antes de abrir a janela, a guia seja programaticamente alterada para a necessária - ela é selecionada como deveria ser, mas a tabela nela não é a que está vinculada a ela, mas a mais recente.

Fiz um exemplo. Imagem da abertura da primeira janela:

Como você pode ver, a guia 1 está destacada, mas a tabela visível está vinculada à guia 4 - ela está escrita na própria tabela, nos cabeçalhos das colunas.

Além disso, se você alternar entre as guias, as tabelas serão colocadas onde deveriam estar, pois eu destaquei a segunda guia com o mouse:

Capturas de tela da plataforma de negociação MetaTrader

EURUSD, D1, 2016.11.03

MetaQuotes Software Corp., MetaTrader 5, Demonstração

EURUSD, D1, 2016.11.03, MetaQuotes Software Corp., MetaTrader 5, Demonstração


De volta à primeira:

Capturas de tela da plataforma de negociação MetaTrader

EURUSD, D1, 2016.11.03

MetaQuotes Software Corp., MetaTrader 5, Demonstração

EURUSD, D1, 2016.11.03, MetaQuotes Software Corp., MetaTrader 5, Demonstração


O que estou fazendo de errado? Ou é um bug?

Arquivos no trailer. Indicador.

Arquivos anexados:
 
Artyom Trishkin:

...

O que estou fazendo de errado? Ou é um bug?

Funciona corretamente com as guias CTabs . Mas para as guias CIconTabs , ainda não criei matrizes pessoais no mecanismo de biblioteca e exibição automática do conteúdo da guia selecionada ao abrir uma caixa de diálogo. Isso será corrigido na próxima atualização.

Mas, como solução temporária, você já pode rastrear a abertura de uma caixa de diálogo em uma classe personalizada e atualizar as guias conforme mostrado na listagem abaixo:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CUSTOM+ON_OPEN_DIALOG_BOX)
     {
      if(lparam==m_window2.Id())
         m_icon_tabs.ShowTabElements();
     }
  }
 
Anatoli Kazharski:

Isso funciona corretamente com guias do tipo CTabs . Mas, para as guias CIconTabs , ainda não criei matrizes pessoais no mecanismo de biblioteca e exibição automática do conteúdo da guia selecionada ao abrir uma janela de diálogo. Isso será corrigido na próxima atualização.

Mas, como solução temporária, agora você já pode rastrear a abertura de uma caixa de diálogo em uma classe personalizada e atualizar as guias conforme mostrado na listagem abaixo:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CUSTOM+ON_OPEN_DIALOG_BOX)
     {
      if(lparam==m_window2.Id())
         m_icon_tabs.ShowTabElements();
     }
  }
Obrigado. Funciona assim. Agora vou colocar duas tabelas sobrepostas em cada guia - vamos ver ;)
 
HI, se eu ampliar a caixa de diálogo e alterar o período, a caixa de diálogo não estará ok no MT4.
 
Ao compilar, ele gera erros como:
'return' - cannot convert from const pointer to nonconst pointer        SplitButton.mqh 90      65
. Isso pode ser corrigido com a exclusão de Const nas linhas correspondentes.
 

Estou tentando adicionar um campo de entrada a uma guia, mas ele não funciona.

input double whenToTrail=10.3;

class CProgram: public CWndEvents
{
protected:
   CSpinEdit         m_StartTS;
//Código
protected:
   bool              CreatetrailStop(const int x_gap, const int y_gap, const string text);
};


Então a função.

bool CProgram::CreatetrailStop(const int x_gap, const int y_gap, string text)
  {
//--- Salvar o ponteiro para o elemento principal
   m_StartTS.WindowPointer(m_window);
//--- Coordenadas
   int x = m_window.X() + x_gap;
   int y = m_window.Y() + y_gap;
//--- Reserva para a guia
   m_tabs.AddToElementsArray(1, m_StartTS);
//--- Propriedades
   m_StartTS.XSize(95);
   m_StartTS.YSize(15);
   m_StartTS.EditXSize(40);
   m_StartTS.MinValue(0.01);
   m_StartTS.StepValue(0.01);
   m_StartTS.SetDigits(1);
   m_StartTS.SetValue(NormalizeDouble(whenToTrail,1));
   
   m_StartTS.ResetMode(true);
//--- Criar um controle
   if(!m_StartTS.CreateSpinEdit(m_chart_id, m_subwin, text, x, y))
      return(false);
//--- Adicione o objeto à matriz comum de grupos de objetos
   CWndContainer::AddToElementsArray(0, m_StartTS);
   return(true);
  }

esse objeto não está anexado ao painel, mas está no gráfico.

e depois de excluir o gráfico, o objeto permanece
 
Olá, esse artigo me interessa muito. Tentei instalá-lo, mas quando o compilo, ele apresenta estes erros:

arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ LeftTransp_black.bmp' não encontrado Calendar.mqh 443 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ LeftTransp_blue.bmp' não encontrado Calendar.mqh 444 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ calendar_today.bmp' não encontrado Calendar.mqh 738 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_on.bmp' não encontrado DropCalendar.mqh 435 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_off.bmp' não encontrado DropCalendar.mqh 436 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ calendar_drop_locked.bmp' não encontrado DropCalendar.mqh 437 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ RightTransp_rotate_black.bmp' não encontrado TreeItem.mqh 247 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ RightTransp_rotate_white.bmp' não encontrado TreeItem.mqh 248 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_x_resize.bmp' não encontrado Pointer.mqh 8 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_x_resize_blue.bmp' não encontrado Pointer.mqh 9 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_y_resize.bmp' não encontrado Pointer.mqh 10 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_y_resize_blue.bmp' não encontrado Pointer.mqh 11 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_xy1_resize.bmp' não encontrado Pointer.mqh 12 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_xy1_resize_blue.bmp' não encontrado Pointer.mqh 13 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_xy2_resize.bmp' não encontrado Pointer.mqh 14 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Controls \ pointer_xy2_resize_blue.bmp' não encontrado Pointer.mqh 15 11
arquivo de recurso '\ Images \ EasyAndFastGUI \ Icons \ bmp16 \ folder.bmp' não encontrado FileNavigator.mqh 284 11
Arquivo de recurso '\ Images \ EasyAndFastGUI \ Icons \ bmp16 \ text_file.bmp' não encontrado FileNavigator.mqh 285 11

Procurei no arquivo zip MQL5, mas os arquivos não estão lá. Há alguma maneira de obtê-los?
Obrigado, senhor