ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Melhorar preenchimento combobox?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qui Ago 15, 2019 9:33 am    Assunto: Melhorar preenchimento combobox? Responder com Citação

Tenho uma rotina para preencher combobox com dados do banco

Código:
procedure TDM.pPreencheComboPai(FCombo: TComboBox; bPreencherCombo: Boolean;
  const mNomeTabela, mNomeCampoSTR, mNomeCampoPK: String);
begin
  FDQueryTmp.Close;
  FDQueryTmp.SQL.Clear;
  FDQueryTmp.SQL.Text :=
      '   SELECT &NomeCampoPK, &NomeCampoSTR '+
      '     FROM &NomeTabela   '+
      ' ORDER BY &NomeCampoSTR        ';
  FDQueryTmp.MacroByName('NomeTabela').AsRaw := mNomeTabela;
  FDQueryTmp.MacroByName('NomeCampoPK').AsRaw := mNomeCampoPK;
  FDQueryTmp.MacroByName('NomeCampoSTR').AsRaw := mNomeCampoSTR;

  FDQueryTmp.Open;
  if bPreencherCombo then
    ComposicaoCombobox(FCombo, FDQueryTmp, mNomeCampoSTR)
  else
  begin
    FCombo.Items.Clear;
    FDQueryTmp.First;
    while not FDQueryTmp.Eof do
    begin
      FCombo.Items.AddObject(
        FDQueryTmp.FieldByName(mNomeCampoSTR).AsString,
           TObject(FDQueryTmp.FieldByName(mNomeCampoPK).AsInteger));
      FDQueryTmp.Next;
    end;
  end;
end;


Mais a medida que o banco esta engordando este combo fica mais lento para ser carregado, existe uma outra forma que não seja componentes DATACONTROLS?

Usamos componentes simples sem acesso direto ao banco.

Obrigado.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8913
Localização: Sinop-MT

MensagemEnviada: Qui Ago 15, 2019 10:15 am    Assunto: Responder com Citação

vc pode usar um DBLookUpComboBox

vc lista os dados e preenche as propriedades:

Código:
ListSource - Datasource com a lista de dados
ListField - campo q sera exibido
KeyField - campo PK


e pra saber qual foi selecionado:

Código:
if DBLookUpComboBox1.KeyValue > 0 then
  ShowMessage(IntToStr(DBLookUpComboBox1.KeyValue));

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qui Ago 15, 2019 11:10 am    Assunto: Responder com Citação

joemil escreveu:
vc pode usar um DBLookUpComboBox

vc lista os dados e preenche as propriedades:

Código:
ListSource - Datasource com a lista de dados
ListField - campo q sera exibido
KeyField - campo PK


e pra saber qual foi selecionado:

Código:
if DBLookUpComboBox1.KeyValue > 0 then
  ShowMessage(IntToStr(DBLookUpComboBox1.KeyValue));


Pois é Joemil, mais a empresa não utiliza estes componentes de acesso direto ao banco de dados.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10445
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Ago 15, 2019 3:08 pm    Assunto: Responder com Citação

Amigo, sempre que você for utilizar o preenchimento de uma lista de items de strings de um componente visual é bom desabilitar o controle de visualização, seja para descendentes de TStrings, TStringList e dervados, desta forma:

Código:
with combobox1 do
begin
      try
         disablecontrols;
         tabela.First;
         while not tabela.eof do
         begin
           Items.AddObject('NOME TABELA', TObject(TabelaCodigo.AsInteger));
           tabela.Next;
         end;
      finally
         enablecontrols; // garanto que mesmo numa exceção, será habilitado os controles.         
      end;
end;



Fiz sem delphi, quaisquer erros, por favor desconsiderar, o que vale é a ideia.

Outra forma de acelerar a recuperação dos dados é obtê-los através de uma view, assim não tem que fazer requisições para coleta dos dados, pois esta já se encontra pronta na view.




bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Sex Ago 16, 2019 3:00 pm    Assunto: Responder com Citação

johnny-walker escreveu:
Amigo, sempre que você for utilizar o preenchimento de uma lista de items de strings de um componente visual é bom desabilitar o controle de visualização, seja para descendentes de TStrings, TStringList e dervados, desta forma:

Código:
with combobox1 do
begin
      try
         disablecontrols;
         tabela.First;
         while not tabela.eof do
         begin
           Items.AddObject('NOME TABELA', TObject(TabelaCodigo.AsInteger));
           tabela.Next;
         end;
      finally
         enablecontrols; // garanto que mesmo numa exceção, será habilitado os controles.         
      end;
end;



Fiz sem delphi, quaisquer erros, por favor desconsiderar, o que vale é a ideia.

Outra forma de acelerar a recuperação dos dados é obtê-los através de uma view, assim não tem que fazer requisições para coleta dos dados, pois esta já se encontra pronta na view.




bye


Obrigado johnny-walker ajudou bastante.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8913
Localização: Sinop-MT

MensagemEnviada: Ter Ago 20, 2019 8:43 am    Assunto: Responder com Citação

tem tb o beginUpdate/EndUpdate

Código:
with combobox1 do
begin
      try
         disablecontrols;
         tabela.First;
         ComboBox1.Items.beginUpdate;
         while not tabela.eof do
         begin
           Items.AddObject('NOME TABELA', TObject(TabelaCodigo.AsInteger));
           tabela.Next;
         end;
      finally
         enablecontrols; // garanto que mesmo numa exceção, será habilitado os controles.         
         ComboBox1.Items.endUpdate;
      end;
end;

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Ter Ago 20, 2019 10:39 am    Assunto: Responder com Citação

joemil escreveu:
tem tb o beginUpdate/EndUpdate

Código:
with combobox1 do
begin
      try
         disablecontrols;
         tabela.First;
         ComboBox1.Items.beginUpdate;
         while not tabela.eof do
         begin
           Items.AddObject('NOME TABELA', TObject(TabelaCodigo.AsInteger));
           tabela.Next;
         end;
      finally
         enablecontrols; // garanto que mesmo numa exceção, será habilitado os controles.         
         ComboBox1.Items.endUpdate;
      end;
end;


Excelente Joemil, ficou mais rápido ainda. Muito obrigado pela dica.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10445
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Ter Ago 20, 2019 11:13 am    Assunto: Responder com Citação

Acredita Joemil que tinha esquecido do beginupdate.. endupdate, sem o delphi a gente acaba esquecendo alguns detalhes.



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8913
Localização: Sinop-MT

MensagemEnviada: Qua Ago 21, 2019 9:28 am    Assunto: Responder com Citação

johnny-walker escreveu:
Acredita Joemil que tinha esquecido do beginupdate.. endupdate, sem o delphi a gente acaba esquecendo alguns detalhes.

bye


eu tb tinha esquecido rsrsrs. depois fazendo umas alteracoes aqui no codigo, achei ele e lembrei do post
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10445
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Ago 21, 2019 12:17 pm    Assunto: Responder com Citação

Depois disto, somente criar uma View que dá para ser utilizada para relatórios que fica bem mais fácil e rápido o processo de preencher.
Fiz isto num componente destes, mas utilizei o jvdbComboBox que é bem mais fácil do que utilizar AddObjects para deixar uma outra informação.
Assim preencho o Items e Values, sendo que Items eu posso concatenar com o código que não tem problema, pois o que é armazenado é sempre o Values.
Assim eu deixo da seguinte forma:
Preencho os Items deixando sempre o primeiro item como "Selecione uma opção" e em values salto uma linha e deixo ela nula, somente com o salto de linha, assim quando preencho fica tudo tranquilo, pois é adicionado a partir da segunda linha.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB