Fórum Mostrar apenas um campo (Banco Dados) no combobox? #334027

01/12/2006

0

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

Responder

Posts

01/12/2006

Andrew

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.


Responder

Gostei + 0

01/12/2006

Quartieri

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


Responder

Gostei + 0

01/12/2006

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.


Responder

Gostei + 0

01/12/2006

Adriano_servitec

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


Responder

Gostei + 0

01/12/2006

Adriano_servitec

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


Responder

Gostei + 0

01/12/2006

Martins

[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!!


Responder

Gostei + 0

01/12/2006

Adriano_servitec

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.


Responder

Gostei + 0

01/12/2006

Martins

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!!!


Responder

Gostei + 0

01/12/2006

Adriano_servitec

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;



Responder

Gostei + 0

01/12/2006

Marco Salles

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


Responder

Gostei + 0

02/12/2006

Brasidata

[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...


Responder

Gostei + 0

02/12/2006

Adriano_servitec

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


Responder

Gostei + 0

02/12/2006

Martins

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!


Responder

Gostei + 0

02/12/2006

Martins

[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.


Responder

Gostei + 0

02/12/2006

Brasidata

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!!!!!!!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar