Ir para conteúdo
Fórum Script Brasil
  • 0

Adicionar item Dblookupcombo


Johelson

Pergunta

Olá Pessoal!

Sou novo no fórum e sempre consigo solucionar as dúvidas através dos tópicos mas desta vez não foi possível!

Estou desenvolvendo um programa de cadastro e no campo "naturalidade" gostaria que o Combobox abra os campos Cidade e UF numa só lista (sei que isto é possível porque trabalho com um programa que faz isto.

Por exemplo: Ao digitar "São" ele abre a lista com todas as cidades parecidas:

São Paulo - SP

São Luís - MA

e quando o texto digitado não existe na lista ele pergunta se eu gostaria de inserir, então abre um novo form onde há dois combobox, um com o campo cidade e outro com o campo UF!

Gostaria de saber como fazer, desde o combobox que exibe os dois campos em uma só lista (uma espécie de dbgrid dentro do combo box) até como adicionar cidades que ainda não existam na lista! Se devo fazer uma tabela somente para esses dois campos, se o componente que estou usando não é apropriado, etc. se possível da forma mais clara pois sou iniciante!

Grato

Johelson Gomes

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Johelson, um ComboBox apresenta apenas uma lista de strings, assim este tipo de componente mostra aquilo que foi inserido nele.

É importante saber se você fala de um TComboBox ou de um TDBComboBox (data-aware)

Gostaria de saber como fazer, desde o combobox que exibe os dois campos em uma só lista (uma espécie de dbgrid dentro do combo box) (...)
O recurso que você menciona, existe de forma fácil apenas no TDBLookupComboBox (propriedade ListField). Nos demais, você teria que criar mecanismos para mostrar da forma desejada (tipo, utilizando o desenho customizado).

Caixa de listagem todos são, mas as funcionalidades e particularidades são outras.

(...)até como adicionar cidades que ainda não existam na lista!

Se devo fazer uma tabela somente para esses dois campos,

se o componente que estou usando não é apropriado,

uma coisa puxa outra. Se você tiver uma tabela, você vai ver na lista o que você tem na tabela. Se não aparecer na listaa, vai ter que adicionar na tabela. Se você não tem tabela deve estar gravando em algum lugar. O componente apropriado depende do que você tem ou quer ter (tabela ou arquivo, ou o que você estiver usando).

Fazer uma tabela só para os dois campos pode lhe economizar espaço em disco, além do mais é o tipo de informação que normalmente está em tabela específica onde você tem o Código da cidade, nome da cidade e UF, sendo que nos registros que fazem referência a determinada cidade, você estará utilizando o código da cidade para relacionamento. É uma questão de aplicar as regras de modelagem de dados (até 3ª forma normal) - se interessar veja este tópico

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

Primeiramente, muito obrigado pela atenção e rapidez em responder!

Eu estou usando tabelas, no caso, há uma tabela tblclientes onde há uma campo naturalidade!

Pelo que você escreveu pude notar que devo usar um Tdblookupcombobox, ferramenta que eu não consigo entender quase nada(o q devo usar em cada item "list field, data source... etc!) rss!

Mas como eu disse antes sou um iniciante neste fantástico mundo da programação, então agradeceria se você pudesse me ajudar de uma forma mais clara!

Não sei se as regras do fórum permitem, mas você poderia me adicionar no MSN - johelsongomes@hotmail.com, então eu postaria a solução aqui no fórum!

P.S.: O relacionamento eu sei fazer (ou pelo menos eu acho que sei) rss!

Grato pela valiosa atenção!

Johelson Gomes

Editado por Johelson
Link para o comentário
Compartilhar em outros sites

  • 0
Não sei se as regras do fórum permitem, mas você poderia me adicionar no MSN - johelsongomes@hotmail.com, então eu postaria a solução aqui no fórum!
As regras sugerem que você não tente tirar dúvidas utilizando o recurso de MP (Mensagens Pessoais) do forum:

4.2 Não utilize o sistema de MP's para retirar dúvidas. Prefira postá-las no fórum, para que todos possam ajudar.

Mesmo assim, quanto a lhe add no MSN fica por conta de algum outro colega que o deseje, já que você deixou seu e-mail. Eu apenas add alguém do forum apenas em certas circunstâncias (por hora, foram apenas 2). É que o tempo é meio curto e não dá para add cada um que solicitar, senão, vou ter que passar todo o tempo em off-line ;).

Voce verá que, na medida do possível, sempre haverá algum colega disposto a ajudar.

Pelo que você escreveu pude notar que devo usar um Tdblookupcombobox, ferramenta que eu não consigo entender quase nada(o q devo usar em cada item "list field, data source... etc!) rss!
Com certeza é um componente muito interessante. Basicamente, como os outros data-aware, você configura as propriedades DataSource e DataField referentes a tabela que você está editando.

A idéia do "lookup" está associada a busca de uma lista de valores a partir de outro dataset, motivo pelo qual você configura as propriedade ListSource (o datasource ligado ao dataset de onde você obtém a lista de valores), ListField (o campo ou lista de campos separados por ";") e KeyField (o campo chave que será atribuído ao dataset em edição, setado na propriedade DataField, quando o item na lista for selecionado).

Uma característica deste componente é que você pode utilizá-lo sem necessitar estar ligado a um DataSource (alterando um determinado dataset a ele ligado). Nesta condição, qualquer item selecionado da lista, poderá ser obtido programaticamente via propriedade KeyValue, bem como uma seleção na lista pode ser feita setando esta propriedade para um valor que exista na lista. Esta propriedade está associada a propriedade KeyField, ou seja, os valores atribuídos ou lidos em KeyValue, corresponde àquele presente no dataset no campo definido por KeyField.

É o tipo de aplicação útil em telas de filtro, onde você pode mostrar em uma lista os itens disponíveis e o usuário seleciona um deles a ser utilizado como filtro em um relatório, por exemplo.

Ao utilizar mais que um campo na visualização, convém alguns "ajustes visuais" para que ao abrir a caixa de lista, ela tenha largura suficiente para apresentar as colunas. Por padrão, a largura da caixa quando aberta, é a mesma quando fechada (a definida em design-time), mas uma nova largura pode ser definida ao alterar a propriedade DropDownWidth (esta largura é em pixels).

Quanto a largura de cada coluna, esta é definida pela propriedade DisplayWidth do(s) campo(s) adicionado(s) à ListField (esta largura é definida em caracteres - mais ou menos isto).

Supondo que você mantenha os fontes padrões dos componentes, daria para fazer uma continha que facilita um pouco o cálculo da largura necessária (DropDownWidth) para mostrar as n colunas. Seria mais ou menos isto, para DisplayWidth >= 7:

DropDownWidth = Σ [(7 x DisplayWidth) - (DisplayWidth -7 +1)] + 20

Este 20 é só uma aproximação. Ele corresponde a aproximadamente a largura da barra de rolagem vertical. É relevante ter uma idéia aproximada da largura da caixa, pois, quando aberta, ela não apresenta barra de rolagem horizontal.

P.S.: O relacionamento eu sei fazer (ou pelo menos eu acho que sei) rss!
mesmo assim, seria conveniente ler e tentar entender aqueles assuntos listados no tópico que lhe passei (apenas sugestão).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus,

aqui estou eu novamente!

Segui a sua dica e coloquei um dblookupcombobox e funcionou direitinho! do jeito que eu queria, ou nem tanto...

Eu consegui fazer com que ele liste os valores da tabela cidades através do listsource e grave o item escolhido no campo naturallidade da tabela clientes através do data source, até ai beleza, maravilha!

agora vem o problema, só tem duas cidades listadas, as que eu adicionei pelo databasedesktop porque quando eu rodo o programa o dblookupcombox não edita as cidades, ele apenas lista as que já existem, portanto, eu não posso adicionar novas cidades! o que eu faço? eu quero que ele funcione como um dbcombobox onde você pode digitar texto e não só selecionar!

li alguma coisa na net sobre uma função dbcombobox.add, talvez isto não seria a solução para o que eu quero? eu não sei onde digitar esse código desse add ai!

O código é o seguinte:

if dbcombobox.items.indexof(texto) = -1 then

dbcombobox.items.add(texto);

eu coloquei ele desse jeito ai no evento onchange do dbcombobox mas sempre dá erro!

"undeclared indentifier: 'texto'

Por favor, me ajudem!

rsss

Grato

Johelson Gomes

Editado por Johelson
Link para o comentário
Compartilhar em outros sites

  • 0
Eu consegui fazer com que ele liste os valores da tabela cidades através do listsource e grave o item escolhido no campo naturallidade da tabela clientes através do data source, até ai beleza, maravilha!

agora vem o problema, só tem duas cidades listadas, as que eu adicionei pelo databasedesktop porque quando eu rodo o programa o dblookupcombox não edita as cidades, ele apenas lista as que já existem, portanto, eu não posso adicionar novas cidades! o que eu faço? eu quero que ele funcione como um dbcombobox onde você pode digitar texto e não só selecionar!

Ok, é realmente assim que ele funciona. Ele é útil, quando você tem o cadastro da informação em outra tela - parece-mse não é seu caso.

li alguma coisa na net sobre uma função dbcombobox.add, talvez isto não seria a solução para o que eu quero? eu não sei onde digitar esse código desse add ai!

O código é o seguinte:

if dbcombobox.items.indexof(texto) = -1 then

dbcombobox.items.add(texto);

eu coloquei ele desse jeito ai no evento onchange do dbcombobox mas sempre dá erro!

"undeclared indentifier: 'texto'

Com esta opção voltamos a sua questão inicial, e agora falando sobre o componente correto (que foi o que questionei inicialmente). O TDBComboBox permite isto que você quer fazer. No caso deste erro que você está tendo, deve ser porque o texto que é passado como parâmetro não está declarado em lugar algum. Alias, parece-me mesmo que deveria se referir ao texto digitado na caixa de edição do DBComboBox e que não existe na sua lista. Neste caso, este texto digitado é acessado pela propriedade Text do DBComboBox. Logo, seria algo como colocar no seu códigio:

if dbcombobox.items.indexof(dbcombobox.text) = -1 then

dbcombobox.items.add(dbcombobox.text);

Mas tenho a impressão de que ainda assim, ele não será incluso na sua tabela no banco de dados. Teste e verifique.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

É Micheus,

estou a ponto de desistir e colocar um DBEdit para esse campo naturalidade! rsss

Olha só o que aconteceu agora:

Com o código que voce me deu funcionou, adicionou, mas não da forma que eu pretendia!

Como eu coloquei o código no evento onchange do dbcombobox, ele adiciona um item a cada letra que eu digito, por exemplo:

S

São

São L...

entende?

outra coisa, quando eu fecho o programa e abro novamente a lista está zerada novamente!!!

E agora, o que eu faço???

Acho que vou desistir! rsss

Grato

Johelson Gomes

Link para o comentário
Compartilhar em outros sites

  • 0
Olha só o que aconteceu agora:

Com o código que voce me deu funcionou, adicionou, mas não da forma que eu pretendia!

Como eu coloquei o código no evento onchange do dbcombobox, ele adiciona um item a cada letra que eu digito, por exemplo:

S

São

São L...

entende?

Johelson, o que ocorre é que você deve fazer esta verificação/adição apenas quando o texto já foi digitado, ou seja, quando o usuário deixa o componente - evento OnExit.

Pode até ser conveniente você confirmar com o usuário se deve ou não incluir o novo item.

outra coisa, quando eu fecho o programa e abro novamente a lista está zerada novamente!!!

E agora, o que eu faço???

Sim isto é correto, é assim mesmo que este componente funciona.

Mas veja bem, se este componente busca a informação de uma tabela, você não acha que faz sentido que você guarde este texto adicionado na respectiva tabela?

Sendo assim, além de adicionar a lista como já mostrado, em algum momento você deverá guardar esta informação na tabela para que numa próxima utilização ele esteja lá.

Mas, também, você poderia gravá-lo em um arquivo (txt) local - o que não parece conveniente para este tipo de aplicação e informação, visto que é provável que você deseje compartilhar ela com outros usuários e manter um certo padrão em seu banco de dados. Vai que um usuário grava "São Paulo" e outro "S. Paulo"...

Voce deverá guardar duas informações, não é (Cidade e UF)?

Supondo que sejam dois campos na sua tabela de cidades, como é que você pretende gerenciar isto? Mostrar as duas informações na lista é simples, mas esperar que o usuário digite o nome da cidade seguido da UF (com ou sem delimitador) fica um pouco mais "complicado".

É por isto que eu costumo utilizar um DBLookupComboBox, e ao seu lado adiciono um pequeno botão [...] para dar acesso a uma tela de cadastro onde os dados são solicitados e o usuário tem que informá-los corretamente, sem grandes problemas.

Após uma inclusão como esta, basta atualizar o ListSource para que o registro apareça na lista e o usuário o selecione, já devolta na tela principal.

Abraços

Este é um dos motivos

Link para o comentário
Compartilhar em outros sites

  • 0

Olá pessoal!

Já tive uma dúvida parecida com esta:

http://scriptbrasil.com.br/forum/index.php?showtopic=112799

No entanto não consegui solucioná-la!

Acho que agora estou num caminho mais simples:

Adicionei ao meu projeto um DBlookupCombo da palheta Win 3.1 do Delphi.

O data source dele está ligado à tabela clientes - naturalidade onde será gravado a naturalidade do cliente

o lookup source está ligado à tabela cidaes - cidade que tem uma lista de cidades

agora eu gostaria de saber como fazer para que, ao ser digitada uma cidade que não exista na lista ele possa pedir para salvar!

já tentei o código dblookupcombo.items.add mas não dá certo porque esse lookupcombo não tem essa função items!

Grato

Johelson Gomes

Link para o comentário
Compartilhar em outros sites

  • 0
Já tive uma dúvida parecida com esta:

http://scriptbrasil.com.br/forum/index.php?showtopic=112799

No entanto não consegui solucioná-la!

Acho que agora estou num caminho mais simples:

Adicionei ao meu projeto um DBlookupCombo da palheta Win 3.1 do Delphi.

O data source dele está ligado à tabela clientes - naturalidade onde será gravado a naturalidade do cliente

o lookup source está ligado à tabela cidaes - cidade que tem uma lista de cidades

agora eu gostaria de saber como fazer para que, ao ser digitada uma cidade que não exista na lista ele possa pedir para salvar!

já tentei o código dblookupcombo.items.add mas não dá certo porque esse lookupcombo não tem essa função items!

Johelson, você trocou de componente mas não de problema! (estou juntando os tópicos)

Aliás, a melhor opção ainda seria continuar com os componentes tratados no outro tópico, já que são os que estão "em linha". Ou seja, este que você passou a usar está fora de linha e pode ser problema futuro - veja o que o help diz:

The components on the Windows 3.1 page of the Component palette provide Windows 3.1 control elements for backward compatibility with Windows 3.1 applications built with previous versions of the product.

São componentes mantidos para compatibilidade apenas e, na seqüência (é só você teclar F1 com o componente selecionado), há uma relação dos novos equivalentes para uso com Win32.

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, gastando um pouco de tempo, segue um exemplo utilizando os 3 componentes: TDBLookupComboBox, TDBLookupCombo e TComboBox.

Espero que você consiga avançar um pouco agora.

Abraços

Não consegui abrir o arquivo! "arquivo está em formato desconhecido ou danificado"

Não sei mais o que fazer!!! Será que é dificil fazer isso que estou tentando fazer?

o programa do local onde trabalho tem isso, o nome do programa é incorp ware!!!

Já estou no desespero, coloquei um dbEdit para naturalidade! rsss

Por favor me ajudem!!! rsss

Grato

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...