Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17338
|
Enviada: Qui Ago 15, 2019 9:33 am Assunto: Melhorar preenchimento combobox? |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 8913 Localização: Sinop-MT
|
Enviada: Qui Ago 15, 2019 10:15 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17338
|
Enviada: Qui Ago 15, 2019 11:10 am Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10445 Localização: Contagem/MG - BRAZIL
|
Enviada: Qui Ago 15, 2019 3:08 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17338
|
Enviada: Sex Ago 16, 2019 3:00 pm Assunto: |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 8913 Localização: Sinop-MT
|
Enviada: Ter Ago 20, 2019 8:43 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17338
|
Enviada: Ter Ago 20, 2019 10:39 am Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10445 Localização: Contagem/MG - BRAZIL
|
Enviada: Ter Ago 20, 2019 11:13 am Assunto: |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 8913 Localização: Sinop-MT
|
Enviada: Qua Ago 21, 2019 9:28 am Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10445 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Ago 21, 2019 12:17 pm Assunto: |
|
|
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 |
|
 |
|