Mostrar apenas um campo (Banco Dados) no combobox?

Delphi

01/12/2006

Olah pessoal, minha duvida hj eh o seguinte:

Bom tenho um combobox que me mostra 2 campos
[b:b9a9d69061]ComboBox1.items.add(dm.ibq1.fieldbyname(´matricula´).AsString + ´ ´ + dm.ibq1.fieldbyname(´associado´).AsString);[/b:b9a9d69061]
Ai nos eventos onDropDown e OnClick fiz um tratamento para aumentar o tamanho do [b:b9a9d69061]DropDownWidth [/b:b9a9d69061] para poder enchergar os nomes do associados.
procedure TForm9.ComboBox1DropDown(Sender: TObject);
begin
combobox1.width:=450; // para enchergar os dados do associado
end;


procedure TForm9.ComboBox1Click(Sender: TObject);
begin
combobox1.width:=100; // para voltar ao tamanho inicial
end;


E carrego os todos os dados no evento onshow do Form assim
procedure TForm9.FormShow(Sender: TObject);
var
c : string;
begin
with dm.ibq1 do
  begin
    close;
    sql.clear;
    combobox1.Clear;
    sql.add(´select * from sind2´);
    sql.add(´order by matricula´);
    sql.add(c);
    Open;
while dm.ibq1.Eof = false do
begin
 ComboBox1.items.add(dm.ibq1.fieldbyname(´matricula´).AsString + ´ ´ + dm.ibq1.fieldbyname(´associado´).AsString);
 dm.ibq1.next;
end;
 dm.ibq1.close;
end;
end;

[b:b9a9d69061]Ateh aqui 100¬ funcional.[/b:b9a9d69061]

Agora o problema eh que preciso ao clicar em cima de algum associado aparecer apenas o numero da matricula neste combobox. [color=red:b9a9d69061](Pois se eu clicar em cima de algum associado o ComboBox mostra o campo matricula e o associado que eu selecionei, e quero apenas que mostre o campo matricula do associado que selecionei)[/color:b9a9d69061]
Pergunta: Eh possivel isso? Se form alguem pode me ajudar como fazer?

Tentei fazer no evento onclick do combobox assim
procedure TForm9.ComboBox1Click(Sender: TObject);
begin
with dm.ibq1 do
  begin
    close;
    sql.clear;
    sql.add(´select * from sind2´);
    sql.add(´order by matricula´);
    sql.add(c);
    Open;
    combobox1.Clear;
    ComboBox1.items.add(dm.ibq1.fieldbyname(´matricula´).AsString);
    dm.ibq1.Next;
    combobox1.width:=100; // para vc enchergar os dados
end;
end;
Mais nao funcionou

No aguardo
Agradeço a ajuda de todos
Adriano.


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Andrew

Andrew

01/12/2006

E se você utilizasse o [b:f16fd7dd5e]Copy[/b:f16fd7dd5e]

não sei quantos caracteres tem seu campo Matricula, mas você poderia usar [b:f16fd7dd5e]Copy[/b:f16fd7dd5e] ou combiná-lo com [b:f16fd7dd5e]Pos[/b:f16fd7dd5e] já q tem um separador entre os dois campos que parece ser um espaço em branco.

Certa vez uma colega aqui do fórum(martins) me mandou umas linhas para algo parecido usando Copy e Pos. Vou ver se encontro aqui para postar para vc.


GOSTEI 0
Quartieri

Quartieri

01/12/2006

No seu lugar eu usaria o DBLookUpComboBox, e só vc setar qual o campo a ser exibido.


GOSTEI 0
Brasidata

Brasidata

01/12/2006

Quer uma solução do tipo ´MARRETA´, feita as pressas só até eu encontrar uma solução pro seu caso?

Coloque um TEdit sobreposto no seu TComboBox (se vc alinhar direitinho vai parecer que é um componente só e no evento OnChange do ComboBox coloque:

Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));

Aí é só usar o text do Edit como referencia.

Tô até com vergonha dessa solução porca, mas ela foi feita em 5 minutos e funciona. E eu prometo achar algo mais profissional pra vc DEPOIS.


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

Quer uma solução do tipo ´MARRETA´, feita as pressas só até eu encontrar uma solução pro seu caso? Coloque um TEdit sobreposto no seu TComboBox (se vc alinhar direitinho vai parecer que é um componente só e no evento OnChange do ComboBox coloque: Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1))); Aí é só usar o text do Edit como referencia. Tô até com vergonha dessa solução porca, mas ela foi feita em 5 minutos e funciona. E eu prometo achar algo mais profissional pra vc DEPOIS.


Hehehehe, melhor do que eu estava fazendo, ja que nao mostrava nada

procedure TForm9.ComboBox1Click(Sender: TObject); var so_matricula : string; begin //combobox1.Clear; so_matricula:=combobox1.text; delete(so_matricula,pos(´ ´,so_matricula),maxInt); //if combobox1.Text = so_matricula then //so_matricula := Copy(Combobox1.Text, 0, Pos(´ ´, Combobox1.Text)-1); //if combobox1.Text = copy(combobox1.text, 0,(pos(´ ´, so_matricula))) then //if combobox1.text = Copy(Combobox1.Text, 1, Pos(´ ´, Combobox1.Text) - 1) then [b:fac0e2f28b]Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));[/b:fac0e2f28b]


Valeu amigo

[obs]Nao quero usar outro componente que nao seja o combobox


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

Tô até com vergonha dessa solução porca, mas ela foi feita em 5 minutos e funciona.
Amigo se eu ti falar que ficou 10 a tua dica, gostei da tua ideia. :D
Veja bem usei o tamanho do combobox1.width=20 esse codigo tambem uso no onclick do combo para retornar ao tamanho original do 20, e deixei ele do lado do edit como se fosse um combobox, ai coloquei o codigo que vc fez no evento onchange do combobox.

Gostei muito do resultado amigo.

Ficou show mesmo
Obrigado


GOSTEI 0
Martins

Martins

01/12/2006

[quote:c9285515bc=´brasidata´]Quer uma solução do tipo ´MARRETA´, feita as pressas só até eu encontrar uma solução pro seu caso? Coloque um TEdit sobreposto no seu TComboBox (se vc alinhar direitinho vai parecer que é um componente só e no evento OnChange do ComboBox coloque: Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1))); Aí é só usar o text do Edit como referencia. Tô até com vergonha dessa solução porca, mas ela foi feita em 5 minutos e funciona. E eu prometo achar algo mais profissional pra vc DEPOIS.


Hehehehe, melhor do que eu estava fazendo, ja que nao mostrava nada

procedure TForm9.ComboBox1Click(Sender: TObject); var so_matricula : string; begin //combobox1.Clear; so_matricula:=combobox1.text; delete(so_matricula,pos(´ ´,so_matricula),maxInt); //if combobox1.Text = so_matricula then //so_matricula := Copy(Combobox1.Text, 0, Pos(´ ´, Combobox1.Text)-1); //if combobox1.Text = copy(combobox1.text, 0,(pos(´ ´, so_matricula))) then //if combobox1.text = Copy(Combobox1.Text, 1, Pos(´ ´, Combobox1.Text) - 1) then [b:c9285515bc]Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));[/b:c9285515bc]


Valeu amigo

[obs]Nao quero usar outro componente que nao seja o combobox[/quote:c9285515bc]

Desculpe companheiro, mas não sou muito fã de gambiarras ou resoluções feitas na marreta, o Delphi nos dá recursos para resolvermos problemas sem precisarmos desse tipo de metodos.

Não testei aqui pq não tenho Delphi nesta máquina, mas creio q vá funcionar.
//Inclua essa linha no OnExit do ComboBox, troque o caractere (?) pelo número do combobox.

procedure TFxxxxx.ComboBox???Exit(Sender: TObject);
begin
  ComboBox??.Text := Copy(ComboBox??.Text, 1, Pos(´ ´, Trim(ComBoBox??.Text))-1);
end;


O código acima vai lhe retornar o q vc desejar.

Digamos q vc tenha:
[b:c9285515bc]Matricular[/b:c9285515bc]
0001 Jonas
0002 Marcio
etc...

vai lhe retornar apenas:
0001 ou 0002, dependendo do q for selecionado.

Boa sorte!!


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

Olah Martins, nao deu certo aqui nao

Usei assim
ComboBox1.Text := Copy(ComboBox1.Text, 1, Pos(´ ´, Trim(ComBoBox1.Text))-1);


Assim
ComboBox1.Text := Trim(Copy(ComboBox1.Text,0,Pos(´ ´,ComBoBox1.Text)-1));


Assim
ComboBox1.Text := Trim(Copy(ComboBox1.Text,1,Pos(´ ´,Trim(ComBoBox1.Text))-1));


Mudei 1 por 0 e nada nao pega os os codigos antes da pos ´ ´
somente assim esta funcionando
Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));


Mesmo assim obrigado por ajudar.


GOSTEI 0
Martins

Martins

01/12/2006

Olah Martins, nao deu certo aqui nao Usei assim [quote:c1d9dac811] ComboBox1.Text := Copy(ComboBox1.Text, 1, Pos(´ ´, Trim(ComBoBox1.Text))-1);


Assim
ComboBox1.Text := Trim(Copy(ComboBox1.Text,0,Pos(´ ´,ComBoBox1.Text)-1));


Assim
ComboBox1.Text := Trim(Copy(ComboBox1.Text,1,Pos(´ ´,Trim(ComBoBox1.Text))-1));


Mudei 1 por 0 e nada nao pega os os codigos antes da pos ´ ´
somente assim esta funcionando
Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));


Mesmo assim obrigado por ajudar.[/quote:c1d9dac811]

Cara até em Delphi 3 funcionaria assim.

procedure TForm1.ComboBox1Exit(Sender: TObject); 
begin 
  ComboBox1.Text := Copy(ComboBox1.Text, 1, Pos(´ ´, Trim(ComBoBox1.Text))-1); 
end; 


[b:c1d9dac811]Pos(´ ´, Trim(ComBoBox1.Text)[/b:c1d9dac811] ele pegaria até o espaço em branco.

Como estão os itens dentro do combobox, coloque um exemplo aqui para q possamos ver o separador.

Boa sorte!!!


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

Como estão os itens dentro do combobox, coloque um exemplo aqui para q possamos ver o separador. Boa sorte!!!
Eu carrego no evento onshow do for assim [quote:bf0589218a]procedure TForm9.FormShow(Sender: TObject); begin with dm.ibq1 do begin close; sql.clear; combobox1.Clear; sql.add(´select * from sind2´); sql.add(´order by matricula´); sql.add(c); Open; while dm.ibq1.Eof = false do begin [b:bf0589218a][color=red:bf0589218a]ComboBox1.items.add(dm.ibq1.fieldbyname(´matricula´).AsString + ´ ´ + dm.ibq1.fieldbyname(´associado´).AsString);[/color:bf0589218a][/b:bf0589218a] dm.ibq1.next; end; dm.ibq1.close; end; end;



GOSTEI 0
Marco Salles

Marco Salles

01/12/2006

com copy certamente resolve o probela , ate pelo que tudo indica esta quase no fim , mas bonito mesmo e desenvolver este tipo de problemas com Objetos


GOSTEI 0
Brasidata

Brasidata

01/12/2006

[quote:8ba252f62a=´Adriano_Servitec´][quote:8ba252f62a=´brasidata´]Quer uma solução do tipo ´MARRETA´, feita as pressas só até eu encontrar uma solução pro seu caso? Coloque um TEdit sobreposto no seu TComboBox (se vc alinhar direitinho vai parecer que é um componente só e no evento OnChange do ComboBox coloque: Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1))); Aí é só usar o text do Edit como referencia. Tô até com vergonha dessa solução porca, mas ela foi feita em 5 minutos e funciona. E eu prometo achar algo mais profissional pra vc DEPOIS.


Hehehehe, melhor do que eu estava fazendo, ja que nao mostrava nada

procedure TForm9.ComboBox1Click(Sender: TObject); var so_matricula : string; begin //combobox1.Clear; so_matricula:=combobox1.text; delete(so_matricula,pos(´ ´,so_matricula),maxInt); //if combobox1.Text = so_matricula then //so_matricula := Copy(Combobox1.Text, 0, Pos(´ ´, Combobox1.Text)-1); //if combobox1.Text = copy(combobox1.text, 0,(pos(´ ´, so_matricula))) then //if combobox1.text = Copy(Combobox1.Text, 1, Pos(´ ´, Combobox1.Text) - 1) then [b:8ba252f62a]Edit1.text := Trim(Copy(ComboBox1.Text,1,(Pos(´ ´,ComboBox1.Text)-1)));[/b:8ba252f62a]


Valeu amigo

[obs]Nao quero usar outro componente que nao seja o combobox[/quote:8ba252f62a]

Desculpe companheiro, mas não sou muito fã de gambiarras ou resoluções feitas na marreta, o Delphi nos dá recursos para resolvermos problemas sem precisarmos desse tipo de metodos.

Não testei aqui pq não tenho Delphi nesta máquina, mas creio q vá funcionar.
//Inclua essa linha no OnExit do ComboBox, troque o caractere (?) pelo número do combobox.

procedure TFxxxxx.ComboBox???Exit(Sender: TObject);
begin
  ComboBox??.Text := Copy(ComboBox??.Text, 1, Pos(´ ´, Trim(ComBoBox??.Text))-1);
end;


O código acima vai lhe retornar o q vc desejar.

Digamos q vc tenha:
[b:8ba252f62a]Matricular[/b:8ba252f62a]
0001 Jonas
0002 Marcio
etc...

vai lhe retornar apenas:
0001 ou 0002, dependendo do q for selecionado.

Boa sorte!![/quote:8ba252f62a]

Caro amigo Martins. Em primeiro lugar quero deixar bem claro que eu CONCORDO com vc. Eu tb, não gosto de ´gambiarras´ no Delphi. Porém, como vc mesmo disse, vc não testou o código que sugeriu por não ter o Delphi em sua máquina. Se você testar verá que ele não funcionará como o esperado, pois, se por algum motivo ele SAIR e ENTRAR novamente no ComboBox o TEXT será apagado (Eu testei). A questão aqui independe da versão do Delphi. Uso o Delphi 2006, cheio de recursos e para o caso ESPECIFICO do amigo Adriano, o componente COMBOBOX não têm sido muito amigável.
Dessa forma sugeri que ele colocasse um EDIT para receber o resultado do nosso código (E poderia ser tanto o seu quanto o meu) e trabalhasse com o valor desse edit, usando o ComboBox somente para escolher o Item. A idéia de SOBREPOR os componente foi SOMENTE para que o usuário final visualizasse ambos como um único componente e a solução VISUAL ficar mais próxima ao que o Adriano queria. CLARO que existem soluções mais adequadas. Eu aposto no uso do LockupComboBox ou até mesmo na criação de OUTRO componente usando o ComboBox como classe ancestral. Só que o Adriano deixou bem claro que NÃO gostaria de usar outro componente que não fosse o COMBOBOX (mesmo sem eu entender o porque). Daí a minha idéia, pela qual peço desculpas se ´maculei´ a integridade do Delphi com seus maravilhosos recursos. Mas , como prometi, assim que eu tiver tempo, conseguirei uma solução mais PROFISSIONAL, nem que para isso eu tenha que escrever um novo componente e xingá-lo de ´ComboBox´ para que o Adriano possa usar .

Abraços a todos...


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

Bom pra mim aqui como disse eu gostei da ideia de usar um edit com um combobox.

Alias fica ateh mais facil de usar esse codigo aqui
procedure TForm9.BitBtn1Click(Sender: TObject); begin with dm.ibqcorr do begin sql.clear; sql.add(´select * from corrente´); sql.add(´WHERE (mesrefini >= :pmi) and (mesreffim <= :pmf)´); [b:4a1ee86f23]if (edit1.Text <> ´´) then begin sql.add(´ and (matricula = :pmatricula)´); Parambyname(´pmatricula´).AsString := Edit1.text; end;[/b:4a1ee86f23] parambyname(´pmi´).asdate := StrToDate(maskedit1.text); parambyname(´pmf´).asdate := StrToDate(maskedit2.text); open; if DM.ibqcorr.isempty then showmessage(´Nao há registro. Por favor tente novamente´); end; end;


Em vez de
[b:4a1ee86f23]if (combobox1.Text <> ´´) then begin
sql.add(´ and (matricula = :pmatricula)´);
Parambyname(´pmatricula´).AsString := ComboBox1.text;
end;[/b:4a1ee86f23]
Sobre a questao de usar componentes da paleta Data Controls, isso eh pq nao gosto de usar dbedit, dbloockup, etc. Sei que sao mais faceis de usar, incusive no combobox ateh tive que colocar esse codigo por nao ter na propriedade dele [b:4a1ee86f23]DropDownRolws[/b:4a1ee86f23]
procedure TForm9.ComboBox1DropDown(Sender: TObject);
begin
combobox1.width:=450; // para vc enchergar os dados
end;

procedure TForm9.ComboBox1Click(Sender: TObject);
begin
     combobox1.width:=20; // voltar ao tamanho normal do combo
end;


Por tanto pra mim ja esta 100¬. E tambem resolvido

Agradeço a todos pela ajuda
Adriano


GOSTEI 0
Martins

Martins

01/12/2006

Sem bate-boca, por mim tudo bem, o software é seu mesmo, quem vai fazer manutenção é vc, lhe foram dadas sugestões, cabe ao desenvolvedor desenvolvê-las, vc poderia té mesmo usar controles data-ware como fora sugerido por outro colega.

Mas se está funcionando 100¬ então manda ver, continua aí.

Boa sorte!


GOSTEI 0
Martins

Martins

01/12/2006

[b:140edc05ef]brasidata[/b:140edc05ef], peço sinceramente que me desculpe se foi grosseiro ou lhe ofendi, não foi essa minha intensão, sabemos do poder da ferramenta e assim como você assim q eu estiver em casa, onde tenho Delphi, poderei testar e encontrar um solução profissional seja ela com componentes prontos, criando um derivado ou em POO.

mais uma vez, minhas sinceras desculpas.

[b:140edc05ef]Adriano[/b:140edc05ef] desculpe-me também, espero que vc tenha sucesso no desenvolvimento do seu software.


boa sorte a todos.


GOSTEI 0
Brasidata

Brasidata

01/12/2006

Que isso, Martins?!?!

não há do que se desculpar... Eu não me ofendi, não.. é que a linguagem escrita é complicada e muitas vezes pode ter um sentido ambíguo. Hora alguma vc foi hostil (e espero não ter sido tb). Afinal, isso é um fórum e como tal, as opniões tem que ser diferentes para justificar a discussão.

Acho que o Adriano tá achando o caminho dele, devagar o sistema tá funcionando e graças ao DELPHI, seu recursos e suas gambiarras a gente sempre tem uma resposta para as nossas dificuldades de desenvolvimento.

E viva as diferenças...

PS: Mas a guerra tava tão boa!!!!! :)
PS2: (só pra relaxar)... Encontrei uma excelente utilidade para aquele suporte de CDs que veio na revista PCExpert numero 29. Graças a ele consegui consertar a válvula da minha descarga... Acho que funcionará com o suporte das outras edições tb... E VIVA A GAMBIARRA!!!!!!!!


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/12/2006

[b:9104907060]Adriano[/b:9104907060] desculpe-me também, espero que vc tenha sucesso no desenvolvimento do seu software. boa sorte a todos.

Olah [b:9104907060]Martins[/b:9104907060], nada nao amigo, que isso, afinal o que vc esta fazendo eh querer me ajudar, espero que vc descubra como fazer este codigo no combobox, eu ateh testei ele no JEDI jvComboBox, mais tambem nao obtive sucesso :( .


GOSTEI 0
Martins

Martins

01/12/2006

[quote:c36404af13=´Martins´][b:c36404af13]Adriano[/b:c36404af13] desculpe-me também, espero que vc tenha sucesso no desenvolvimento do seu software. boa sorte a todos.

Olah [b:c36404af13]Martins[/b:c36404af13], nada nao amigo, que isso, afinal o que vc esta fazendo eh querer me ajudar, espero que vc descubra como fazer este codigo no combobox, eu ateh testei ele no JEDI jvComboBox, mais tambem nao obtive sucesso :( .[/quote:c36404af13]

Vou tentar montar um exemplo funcional e te mando por e-mail para vc ver se é isso mesmo q vc quer ou então te adiciono no MSN.

[b:c36404af13]brasidata[/b:c36404af13] somos da PAZ, mas esse fórum serve mesmo para amadurecermos algumas linhas de código e otmizá-las tb, valew meu brother, boa sorte para vcs e bom FDS!


GOSTEI 0
POSTAR