Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Problemas Com Listview


Guest --samuelsjn --
 Share

Question

Guest --samuelsjn --

Pessoal,

Estou fazendo um sistema em delphi e esta ocorrendo um pequeno ("grande") problema.

Estou crindo uma tela de pesquisa utilisando o componente ListView.

As colunas desta tabela (ListView) contem nomes para a identificação das informações.

Quando a janela de pesquisa abre sem nenhuma informação buscada na base de dados, a tabela (ListView) aparece sem erro nenhum. Mas, se alguma informação existir na base de dados o título desta tabela (ListView) some, e só aparece quando clicamos com o mouse.

Estou utilizando delphi 7 com o banco de dados postgres utilizando conexão atraves do componente ADOConnection, e as consultas sql atraves do componente ADOQuery.

Gostaria de saber um jeito de reverter este problema.

Segue abaixo o código que estou utilizando para preencher a ListView:

procedure TfrmPesquisaReq.CarregaDados;
var
  lstitmItem: TListItem;
  vCont: Integer;
begin
  lstvwDados.ShowColumnHeaders := true;
  lstvwDados.Clear;
  if cmbxFiltro.ItemIndex = 0 then
  begin
    dtmdlConnection.QueryAuxiliar.Close;
    dtmdlConnection.QueryAuxiliar.SQL.Clear;
    dtmdlConnection.QueryAuxiliar.SQL.Add('Select req.id, req.data, req.dia, req.etapa, und.nome, Sum(quantidade) as quantidade');
    dtmdlConnection.QueryAuxiliar.SQL.Add('from req, und where req.id = und.id');
    dtmdlConnection.QueryAuxiliar.SQL.Add('group by req.id, req.data, req.dia, req.etapa, und.nome');
  end
  else
  begin
    dtmdlConnection.QueryAuxiliar.Close;
    dtmdlConnection.QueryAuxiliar.SQL.Clear;
    dtmdlConnection.QueryAuxiliar.SQL.Add('Select req.id, req.data, req.dia, req.etapa, und.nome, Sum(und.quantidade) as quantidade');
    dtmdlConnection.QueryAuxiliar.SQL.Add('from req, und where req.id = :condicao and req.id = und.id');
    dtmdlConnection.QueryAuxiliar.SQL.Add('group by req.id, req.data, req.dia, req.etapa, und.nome');
    dtmdlConnection.QueryAuxiliar.Parameters.ParamByName('condicao').Value := StrToInt(strnglstReq[cmbxFiltro.ItemIndex]);
  end;
  dtmdlConnection.QueryAuxiliar.Open;
  vCont := 0;
  while not dtmdlConnection.QueryAuxiliar.Eof do
  begin
    vCont := vCont + 1;
    lstitmItem := lstvwDados.Items.Add;
    lstitmItem.Caption := IntToStr(vCont);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('id').AsString);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('data').AsString);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('nome').AsString);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('dia').AsString);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('etapa').AsString);
    lstitmItem.SubItems.Add(dtmdlConnection.QueryAuxiliar.FieldByName('quantidade').AsString);
    dtmdlConnection.QueryAuxiliar.Next;
  end;
  dtmdlConnection.QueryAuxiliar.Close;
  lstitmItem.ListView.Refresh;
end;

Estou chamando esta procedure no onActivate do formulario.

Os nomes das colunas das tableas estão diferentes que as da base de dados.

alguém poderia me ajudar.

E outra pergunta. Em qual evento do ADOQuery que eu trato as respostas de erro de chave estrangeira vindas do banco postgres

Obrigado mais uma vez e desculpe pela amolação

Edited by Micheus
Adicionado o delimitador de código [code] [/code]. Lembre-se de utilizá-lo para melhor visualização
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0
As colunas desta tabela (ListView) contem nomes para a identificação das informações.

Quando a janela de pesquisa abre sem nenhuma informação buscada na base de dados, a tabela (ListView) aparece sem erro nenhum. Mas, se alguma informação existir na base de dados o título desta tabela (ListView) some, e só aparece quando clicamos com o mouse.

samuelsjn, além de manipulá-la em CarregaDados, você manipula a propriedade lstvwDados.ShowColumnHeaders em algum outro ponto do programa?
Link to comment
Share on other sites

  • 0
Guest --samuelsjn --
As colunas desta tabela (ListView) contem nomes para a identificação das informações.

Quando a janela de pesquisa abre sem nenhuma informação buscada na base de dados, a tabela (ListView) aparece sem erro nenhum. Mas, se alguma informação existir na base de dados o título desta tabela (ListView) some, e só aparece quando clicamos com o mouse.

samuelsjn, além de manipulá-la em CarregaDados, você manipula a propriedade lstvwDados.ShowColumnHeaders em algum outro ponto do programa?

Caro amigo Micheus,

Eu não utilizo o lstvwDados.ShowColumnHeaders em outro lugar, somente aqui no CarregaDados.

Abraço

Link to comment
Share on other sites

  • 0
Eu não utilizo o lstvwDados.ShowColumnHeaders em outro lugar, somente aqui no CarregaDados.
samuelsjn, então verifique se a propriedade ViewStyle está definida com outro valor que não seja vsReport, porque é apenas neste estilo que o header das colulas são mostrados.

Link to comment
Share on other sites

  • 0
Guest --samuelsjn --
Eu não utilizo o lstvwDados.ShowColumnHeaders em outro lugar, somente aqui no CarregaDados.
samuelsjn, então verifique se a propriedade ViewStyle está definida com outro valor que não seja vsReport, porque é apenas neste estilo que o header das colulas são mostrados.

Caro Micheus,

Como vai?

Obrigado pela força que esta me dando.

Cara o evento ViewStyle esta como vsReport.

Não teria como "pintar" o cabeçalho logo apos a entrada dos dados na ListView não?

valeu

Link to comment
Share on other sites

  • 0
Não teria como "pintar" o cabeçalho logo apos a entrada dos dados na ListView não?
samuelsjn, dando uma olhada melhor numa tela que eu utilizo o ListView, me ocorreu que talvez va não tenha definido em design-time o nome das colunas.

No código, o que você faz é inserir os dados referentes as colunas e que serão mostrados no "grid" (eu também faço deste modo). Então, acho que talvez você não tenha criado as colunas em design-time via propriedade Columns (tem um botãozinho com "...").

A primeira coluna definida será aquela em que aparecerá o seu "lstitmItem.Caption", as demais correspondem a cada "lstitmItem.SubItems.Add".

Não seria isto que está faltando?

Link to comment
Share on other sites

  • 0
Guest --samuelsjn --
Não teria como "pintar" o cabeçalho logo apos a entrada dos dados na ListView não?
samuelsjn, dando uma olhada melhor numa tela que eu utilizo o ListView, me ocorreu que talvez va não tenha definido em design-time o nome das colunas.

No código, o que você faz é inserir os dados referentes as colunas e que serão mostrados no "grid" (eu também faço deste modo). Então, acho que talvez você não tenha criado as colunas em design-time via propriedade Columns (tem um botãozinho com "...").

A primeira coluna definida será aquela em que aparecerá o seu "lstitmItem.Caption", as demais correspondem a cada "lstitmItem.SubItems.Add".

Não seria isto que está faltando?

Ola Micheus,

Eu coloquei assim na propriedade Columns:

0 - Ordem // esse vai ser o cabeçario da listview

1 - id

2 - data

3 - nome

4 - dia

5 - etapa

6 - quantidade

ai eu utilizo o CarregaDados na seguencia em que esta para colocar as informações nas colunas...

Mas eu utilizei sim esta propriedade da ListView.

No sistema só esta acontecendo nesta janela, que é uma janela de pesquisa, as outras estão funcionando mil maravilhas

Abraço e obrigado

Link to comment
Share on other sites

  • 0
Eu coloquei assim na propriedade Columns:

0 - Ordem // esse vai ser o cabeçario da listview

1 - id

2 - data

3 - nome

4 - dia

5 - etapa

6 - quantidade

ai eu utilizo o CarregaDados na seguencia em que esta para colocar as informações nas colunas...

Mas eu utilizei sim esta propriedade da ListView.

No sistema só esta acontecendo nesta janela, que é uma janela de pesquisa, as outras estão funcionando mil maravilhas

samuelsjn, se é assim, acho que se esgotaram minhas sugestões. :(

Mas vão alguns comentários sobre o código que você postou inicialmente:

1) acho que seria interessante chamar o procedimento no OnShow, ao invés de no OnActivate;

2) lstitmItem.ListView.Refresh; - esta linha ao final do seu procedimento não é apropriada. Se seu dataset QueryAuxiliar não contiver dados, a variável lstitmItem será nula (ou lixo) e poderá resultar em erro. Se realmente for necessário forçar a atualização, melhor seria você utilizar o proprio ListView -> lstvwDados.Refresh;

Abraços

Link to comment
Share on other sites

  • 0
Guest --samuelsjn --

Grande Micheus,

Cara funcionou. Muito Obrigado mesmo....

Eu coloquei o CarregaDados no on Show e funcionou....

você sabe me explicar porque????

Amigo muito obrigado mesmo, voce me poupou muito tempo.....

Valeu

Abraço

Link to comment
Share on other sites

  • 0
Eu coloquei o CarregaDados no on Show e funcionou....

você sabe me explicar porque????

Não saberia explicar adequadamente, não. Mas alguns procedimentos que implicam em mudanças visuais antes de o form ser mostrado (OnShow), não funcionam muito bem se você colocar em outro evento que ocorra antes de ele estar realmente preparado para ser mostrado.

Só verificando a seqüência em que os eventos estão ocorrendo para tentar entender o porque de não funcionar.

Abraços

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...