Chamar Um Método Ao Pressionar a Tecla Enter De Um ComboBox
Chamar O Método Em Sí Na Verdade Não É O Problema. O Problema Existe, Que O Método a Ser Chamado\Executado Depende do Valor Do Combobox...
//O Método Abaixo, chama o Método GetData Ao Se Pressionar a Tecla Enter Do
ComboBox.
Procedure Tform1.ComboBox1.KeyPress(Sender:Toboject;Var Key: Char);
Begin
If Key=#13 Then
GetData;
End;
//O Método GetData Depende do Valor Combobox
Procedure GetData;
Begin
ShowMessage(Form1.ComboBox1.Text);
End;
O Problema Que Dá, é Que o Valor Que Aparece na Mensagem ShowMessage, Não é o Valor Selecionado na Lista Suspensa, Mas Sim o Valor Atual Do Combobox.
Obs:Na Realidade O Método GetData A Ser Executado Não é Tão Trivial Assim, Só a Título de Exemplo Escrevi Este Método Contendo Uma Instrução APENAS.
Já Tentei De Tudo, Ate Mesmo Chamar Uma Mensagem Personalizada Do Windows, Usando a Função Da API PostMessage.Não Deu Resultado....Mas Acredito Na
//O Método Abaixo, chama o Método GetData Ao Se Pressionar a Tecla Enter Do
ComboBox.
Procedure Tform1.ComboBox1.KeyPress(Sender:Toboject;Var Key: Char);
Begin
If Key=#13 Then
GetData;
End;
//O Método GetData Depende do Valor Combobox
Procedure GetData;
Begin
ShowMessage(Form1.ComboBox1.Text);
End;
O Problema Que Dá, é Que o Valor Que Aparece na Mensagem ShowMessage, Não é o Valor Selecionado na Lista Suspensa, Mas Sim o Valor Atual Do Combobox.
Obs:Na Realidade O Método GetData A Ser Executado Não é Tão Trivial Assim, Só a Título de Exemplo Escrevi Este Método Contendo Uma Instrução APENAS.
Já Tentei De Tudo, Ate Mesmo Chamar Uma Mensagem Personalizada Do Windows, Usando a Função Da API PostMessage.Não Deu Resultado....Mas Acredito Na
Marco Salles
Curtidas 0
Respostas
Anorex
14/01/2004
no seu caso não o evento OnSelect não seria mais adequado?
GOSTEI 0
Marco Salles
14/01/2004
no seu caso não o evento OnSelect não seria mais adequado?
Evento OnSelect De Quem :?: :?:
Quero Frisar Novamente [color=red:8b186ffbe2]Que ´ O Problema Existe, Que O Método a Ser Chamado\Executado Depende do Valor Do Combobox...E O Valor Do ComboBox Apresentado Para o Método Não É, 0 SELECIONADO e Sim o Valor Do Combobox Atual ´[/color:8b186ffbe2]
Como Mudar Isto,Quando Estamos Processando Um Evento Interno Do Próprio Combobox (Que No Meu Caso é o Evento ONKEYPRESS:?:
Amigos, Acredito Na Criatividade Do Pessoal Do Forum.E Agradeço Desde Já
GOSTEI 0
Fórum Vini
14/01/2004
Olá,
não sei se entendi muito bem o seu problema, mas tente isso:
Ele pega o valor do item selecionado.
Espero ter ajudado.
Vinicius.
não sei se entendi muito bem o seu problema, mas tente isso:
Showmessage(Combobox1.Items[Combobox1.ItemIndex]);
Ele pega o valor do item selecionado.
Espero ter ajudado.
Vinicius.
GOSTEI 0
Marco Salles
14/01/2004
Vini , Vou Colocar a Dúvida De Outra Forma. Suponha Um Form Com Um Único Componente Combobox. Neste Componente em Sua Propriedade Items Digitamos Quatro Colunas.Por Exemplo:´Me;Ajude;Por;Favor´. Depois Disto, Limpamos Sua Propriedade Text. Finalmente Rodamos O aplicativo. O Resultado é Um Combobox Limpo.Vamos Então Com O Mouse Selecionar Este ComboBox. Agora Ainda Como O mouse Vamos Navegar Atê o Quarto Item , Neste Caso é a Palavra ´Favor´. Quando Esta Palavra Estiver Selecionada Na Lista Suspenda Damos Um <Enter>.
E O QUE ACONTECE COM O CONTEUDO DO COMBOBOX :?: NADA,ABSOLUTAMENTE NADA :!: Então o Que Estou Querendo é : Após o Item Estiver Selecionado, e Exeutando UM <ENTER> , Este Item Selecionado Aparecesse No COMBOBOX. Dá Para Fazer Isto Ou é Impossível :?:
E O QUE ACONTECE COM O CONTEUDO DO COMBOBOX :?: NADA,ABSOLUTAMENTE NADA :!: Então o Que Estou Querendo é : Após o Item Estiver Selecionado, e Exeutando UM <ENTER> , Este Item Selecionado Aparecesse No COMBOBOX. Dá Para Fazer Isto Ou é Impossível :?:
GOSTEI 0
Anorex
14/01/2004
Siga A Sua Última Mensagem Que Você Mesmo Deu A Soulução.
Fiz Do Jeito Que Você Descreveu O Que Queria E Saiu Do Jeito Que Você Está Querendo....... :!: :!: :!:
Fiz Do Jeito Que Você Descreveu O Que Queria E Saiu Do Jeito Que Você Está Querendo....... :!: :!: :!:
GOSTEI 0
Fábio Valente
14/01/2004
O problema, pode ser, não testei.... que você está pegando o valor ´Text´ do combo ao pressionar a Tecla.... ou seja, o próprio componente não selecionou, ainda, o ítem que pressionou.... possivelmente a dica anterior do .Vini. resolverá!!!
Sem mais,
Sem mais,
GOSTEI 0
Anorex
14/01/2004
ComboBox1.Text := ComboBox1.Items[ComboBox1.ItemIndex];
GOSTEI 0
Marco Salles
14/01/2004
Siga A Sua Última Mensagem Que Você Mesmo Deu A Soulução.
Fiz Do Jeito Que Você Descreveu O Que Queria E Saiu Do Jeito Que Você Está Querendo....... :!: :!: :!:
No Meu Computador Isto Não Acontece. Quando Eu Seleciono Um Item Do Suspenso do Combobox e Dou Enter, Não Muda o Conteudo Do Combo, Mesmo Que Eu Escreva a Istruçao Sugerida No Evento OnkeyPress....
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
ComboBox1.Text := ComboBox1.Items[ComboBox1.ItemIndex];
end;
Agora Ja a Citação Do Nervouz :´O problema, pode ser, não testei.... que você está pegando o valor ´Text´ do combo ao pressionar a Tecla.... ou seja, o próprio componente não selecionou, ainda, o ítem que pressionou.... possivelmente a dica anterior do .Vini. resolverá!!!´
ACREDITO QUE DEVE SER ESTE O PROBLEMA, ESTOU AQUI PARA PEDIR UMA MANEIRA DED RESOLVER. COMO VOCE DISSE :´QUE NÃO TESTOU´,(MAS EU TESTEI) a Dica Do Vini Endossada Pelo Anorex Infelismente Não ResolveU... Amigos , Como Resolver :?:
GOSTEI 0
Paulo_amorim
14/01/2004
Concordo com o Vini
O Text do Combo soh sera atualizado APOS o evento ONKEYPRESS
tente um evento posterior, por exemplo OnChange
Se vc coloca o mouse sobre uma opçao e clica enter mas o TEXT nao eh mudado, tente mudar a propriedade STYLE do ComboBox para DropDownList
O Text do Combo soh sera atualizado APOS o evento ONKEYPRESS
tente um evento posterior, por exemplo OnChange
Se vc coloca o mouse sobre uma opçao e clica enter mas o TEXT nao eh mudado, tente mudar a propriedade STYLE do ComboBox para DropDownList
GOSTEI 0
Paulo_amorim
14/01/2004
Novamente tentando...ehehe
eu tentei aqui simular oq ue voce falou
com a propriedade Style setada como DROPDOWNLIST ele funcionou
o unico inconveniente eh que o usuario nao vai poder digitar o valor (apesar que a cada letra digitada ele vai para o primeiro registro encontrado)
eu tentei aqui simular oq ue voce falou
com a propriedade Style setada como DROPDOWNLIST ele funcionou
o unico inconveniente eh que o usuario nao vai poder digitar o valor (apesar que a cada letra digitada ele vai para o primeiro registro encontrado)
GOSTEI 0
Marco Salles
14/01/2004
Novamente tentando...ehehe
eu tentei aqui simular oq ue voce falou
com a propriedade Style setada como DROPDOWNLIST ele funcionou
o unico inconveniente eh que o usuario nao vai poder digitar o valor (apesar que a cada letra digitada ele vai para o primeiro registro encontrado)
Meu Amigo Paulo, Com Esta Propiedade Selecionada(Style setada como DROPDOWNLIST) Irá Funcionar Do Jeito Que Eu Quero, [color=red:d003a19869]Mas o Problema é Que Eu Preciso Editar Valores No Combo. [/color:d003a19869]E Quanto a Sua Primeira Afirmação:´O Text do Combo so sera atualizado APOS o evento ONKEYPRESS tente um evento posterior, por exemplo OnChange ´,Posso Afirmar Que Ele Não Atualiza.[color=red:d003a19869]SÓ ATUALIZA COM A FUNÇÃO SHOWMESSAGE[/color:d003a19869].
Veja o Exemplop Abaixo Com O mesmo Form, Mesmo Combo:
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
ComboBox1.Text := ComboBox1.Items[ComboBox1.ItemIndex];
end;
//Escrevi um Evento OnChange Como V.C Sugeriu
procedure TForm1.ComboBox1Change(Sender: TObject);
var
texto:String;
begin
Texto:=ComboBox1.Text;
end;
end.
Conclusão:O TEXTO DO COMBO NÃO É ATUALIZADO.MAS SE COLOCAR UMA FUNÇÃO SHOWMESSAGE,AÍ A HISTÓRIA É DIFERENTE.MAS O USUÁRIO NÃO QUER FICAR VENDO MENSAGEM NA TELA,TODA VEZ QUE ELE APERTAR <ENTER>. SE ALGUEM CONHECE UMA OUTRA CHAMADA
QUE SEJA INTERNA E NÃO RETORNE NADA DE INTERFACE PARA O USUÁRIO,EU ACHO QUE ESTE PODE SER UM DOS CAMINHOS.....
OBS:ESTA ESTRATÉGIA EU TENTEI USAR USANDO UMA CHAMADA A API DO WINDOS FUNÇÃO POSTMESSAGE(COMO EU DESTAQUEI NO INÍCIO DO TÓPICO)
Marco Escreveu No Início Do Tópico:´Já Tentei De Tudo, Ate Mesmo Chamar Uma Mensagem Personalizada Do Windows, Usando a Função Da API PostMessage.Não Deu Resultado´
Continuo Ainda Acreditando na Criatividade dos Meus Amigos Do Forum...
GOSTEI 0
Marco Salles
14/01/2004
Só Gostaria De Uma Resposta.Tem Ou Não Tem Jeito.
GOSTEI 0
Fabio.hc
14/01/2004
Tem jeito sim.
Tente assim:
Tente assim:
var Form1: TForm1; vtexto:string; procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin vtexto:=ComboBox1.Items[ComboBox1.ItemIndex]; end; procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RETURN then ComboBox1.Text:=vtexto; end;
GOSTEI 0
Marco Salles
14/01/2004
É Isto Mesmo Fabio.HC. Funcionou Como o Desejado. :D Mas Na Minha Terra (Sou Do Interior De Minas) Tem Um Ditado Popular Que Diz:´Mato a Cobra e Mostro o Pau...´Por Analogia Voce Matou a Cobra , Mas O Que Voce Usou Para Mata-la :?: Quem é VK_RETURN .(Tudo Bem Que Deve Ser Definido Na Secção Windows Como VK_TAB , VK_Up, Vk_Down , etc...),O Que Esta Variável Tem :?: e Porque Voce Escolheu o Evento ComboBox1KeyUp :?: . Dá Para MostrarComo Matou a ´Cobra´ :?:
P:S Quero Agradecer a Todos Que Atê Aqui Contribuiram Para O
Equacionamento Deste Tópico e Em Particular Parabenizar Ao ´Fabio.HC
Por Resolve-lo Da Maneira Como Ele Foi Colocado. Espero Que Ele
Contribua Mais Uma Ves Com Os Seus Conhecimentos e Mostre Como
Matou a ´Cobra´ :P
P:S Quero Agradecer a Todos Que Atê Aqui Contribuiram Para O
Equacionamento Deste Tópico e Em Particular Parabenizar Ao ´Fabio.HC
Por Resolve-lo Da Maneira Como Ele Foi Colocado. Espero Que Ele
Contribua Mais Uma Ves Com Os Seus Conhecimentos e Mostre Como
Matou a ´Cobra´ :P
GOSTEI 0
Fabio.hc
14/01/2004
[quote:baadb489f4=´Marco Salles´]Quem é VK_RETURN.[/quote:baadb489f4]É a tecla enter.
[quote:baadb489f4=´Marco Salles´]O Que Esta Variável Tem [/quote:baadb489f4]É para ser usada no KeyUp e KeyDown.
[quote:baadb489f4=´Marco Salles´]e Porque Voce Escolheu o Evento ComboBox1KeyUp[/quote:baadb489f4]Este evento é acionado quando solta a tecla.
[quote:baadb489f4=´Marco Salles´]Dá Para MostrarComo Matou a ´Cobra´.[/quote:baadb489f4]Quando clica no combo e abre caixa e passa o mouse sobre os itens a variavel itemindex é a incrementada com a posição do item selecionado, quando é pressionado a tecla enter o itemindex passa a ser -1, por isso o combo fica vazio, antes disso o conteudo do combo é armazenado na variavel vtexto, quando a tecla enter é solta, aciona o evento KeyUp e a variavél vtexto é armazenda em combo1.text.
[quote:baadb489f4=´Marco Salles´]O Que Esta Variável Tem [/quote:baadb489f4]É para ser usada no KeyUp e KeyDown.
[quote:baadb489f4=´Marco Salles´]e Porque Voce Escolheu o Evento ComboBox1KeyUp[/quote:baadb489f4]Este evento é acionado quando solta a tecla.
[quote:baadb489f4=´Marco Salles´]Dá Para MostrarComo Matou a ´Cobra´.[/quote:baadb489f4]Quando clica no combo e abre caixa e passa o mouse sobre os itens a variavel itemindex é a incrementada com a posição do item selecionado, quando é pressionado a tecla enter o itemindex passa a ser -1, por isso o combo fica vazio, antes disso o conteudo do combo é armazenado na variavel vtexto, quando a tecla enter é solta, aciona o evento KeyUp e a variavél vtexto é armazenda em combo1.text.
GOSTEI 0
Marco Salles
14/01/2004
Obrigado Fabio Hc Pela Explicação Destalhada e Objetiva. :D Quero Levantar Uma Pequena Modificação No Seu Código, Sem Querer Tirar, Nenhumas Fatia Do Seu Mérito.
Acontece , Que O Código Apresentado Tem Um Pequeno Efeito Colateral , Que Você Mesmo Pode Testar( A Explicação Para Isto, Eu Confesso Que Não Sei).
Tudo Funciona Bem, O Usuário Seleciona o Item Suspenso No Combo Usando o Mouse(Ou Mesmo o Teclado) e Aperta o Enter. Faz Isto Diversas Vezez e Funciona Diversas Vezez. So Que Em Determinado Momento, o Usuário Por Nenhuma Razão Específica, Dar Um <Enter> Seguido De <Enter>. Na Minha Razão, Não Era Para Acontecer Nada, So Que na Prática Não é Bem Assim. E Por Razões Desconhecidas Por Mim, O [color=red:3a97672de3]Combo Muda De Valor...[/color:3a97672de3]Se Você Quiser Comentar Sobre Isto, Sua Opinião é Muito Bem Vinda. .. :(
Então Sugiro Um a Pequena Mudança, Que Parece Que Irá Corrigir o Problema. :idea:
Note o Código Abaixo:
//Mudamos a Variavel Vtexto:String Para a Variável i:Integer e O Efeito Colateral Some....
Var
[color=red:3a97672de3]i : Integer;[/color:3a97672de3]
{$R *.DFM}
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
i:=Combobox1.ItemIndex;
end;
procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_Return Then
ComboBox1.ItemIndex:=i;
end;
P:S Quero Ressaltar Mais Uma Vez Que Não Tenho a Menor Intenção De Tirar os Méritos Do Fábio, Apenas Sinto-me Na Obrigação De Comentar o Resultado.Vai Que, Alguem De Voces, Está Montando Um Programa Que Use Um Combo e Que Por Algum Motivo (Seja De Espaço Ou De Preferência) Não Queira Ou Não Possa Usar O Mouse , e Vai Fazer Tudo Através De Teclado. Então Sem o Código Apresentado Pelo Fabio Como Iríamos Selecionar Um Item Do ComboBox Via Teclado???? :?:
Acontece , Que O Código Apresentado Tem Um Pequeno Efeito Colateral , Que Você Mesmo Pode Testar( A Explicação Para Isto, Eu Confesso Que Não Sei).
Tudo Funciona Bem, O Usuário Seleciona o Item Suspenso No Combo Usando o Mouse(Ou Mesmo o Teclado) e Aperta o Enter. Faz Isto Diversas Vezez e Funciona Diversas Vezez. So Que Em Determinado Momento, o Usuário Por Nenhuma Razão Específica, Dar Um <Enter> Seguido De <Enter>. Na Minha Razão, Não Era Para Acontecer Nada, So Que na Prática Não é Bem Assim. E Por Razões Desconhecidas Por Mim, O [color=red:3a97672de3]Combo Muda De Valor...[/color:3a97672de3]Se Você Quiser Comentar Sobre Isto, Sua Opinião é Muito Bem Vinda. .. :(
Então Sugiro Um a Pequena Mudança, Que Parece Que Irá Corrigir o Problema. :idea:
Note o Código Abaixo:
//Mudamos a Variavel Vtexto:String Para a Variável i:Integer e O Efeito Colateral Some....
Var
[color=red:3a97672de3]i : Integer;[/color:3a97672de3]
{$R *.DFM}
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
i:=Combobox1.ItemIndex;
end;
procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_Return Then
ComboBox1.ItemIndex:=i;
end;
P:S Quero Ressaltar Mais Uma Vez Que Não Tenho a Menor Intenção De Tirar os Méritos Do Fábio, Apenas Sinto-me Na Obrigação De Comentar o Resultado.Vai Que, Alguem De Voces, Está Montando Um Programa Que Use Um Combo e Que Por Algum Motivo (Seja De Espaço Ou De Preferência) Não Queira Ou Não Possa Usar O Mouse , e Vai Fazer Tudo Através De Teclado. Então Sem o Código Apresentado Pelo Fabio Como Iríamos Selecionar Um Item Do ComboBox Via Teclado???? :?:
GOSTEI 0
Fabio.hc
14/01/2004
O Código Apresentado Tem Um Pequeno Efeito Colateral , Que Você Mesmo Pode Testar( A Explicação Para Isto, Eu Confesso Que Não Sei).
Tudo Funciona Bem, O Usuário Seleciona o Item Suspenso No Combo Usando o Mouse(Ou Mesmo o Teclado) e Aperta o Enter. Faz Isto Diversas Vezez e Funciona Diversas Vezez. So Que Em Determinado Momento, o Usuário Por Nenhuma Razão Específica, Dar Um <Enter> Seguido De <Enter>. Na Minha Razão, Não Era Para Acontecer Nada, So Que na Prática Não é Bem Assim. E Por Razões Desconhecidas Por Mim, O Combo Muda De Valor...
Quando pressiona a tecla enter pela primeira vez: E o evento termina o Keypress, e itemindex é igual a -1.
Quando pressiona a tecla enter pela segunda vez: itemindex é igual a -1, limpando o combo e variavel vtexto e pressionando várias vezes a tecla enter o itemindex continua -1 o combo e a variavel vtexto continua vazio.
Com esta modificação do Marco Salles.
Quando pressiona a tecla enter pela primeira vez:
- No evento Keypress a variavel i é igualada com itemindex.
- E o evento termina o Keypress o itemindex é igual a -1.
- No evento KeyUp o itemindex é igualado com a variavel i.
Quando pressiona a tecla enter pela segunda vez o itemindex é igual a variavel i e o combo mantem o valor selecionado.
GOSTEI 0
Marco Salles
14/01/2004
Tá Explicado , e Dou o Assunto Por Encerrado. Obrigado Mais Uma Vez...
GOSTEI 0
Baliza
14/01/2004
[quote:ebecad3b68=´Marco Salles´]É Isto Mesmo Fabio.HC. Funcionou Como o Desejado. :D Mas Na Minha Terra (Sou Do Interior De Minas) Tem Um Ditado Popular Que Diz:´Mato a Cobra e Mostro o Pau...´Por Analogia Voce Matou a Cobra , Mas O Que Voce Usou Para Mata-la :?: Quem é VK_RETURN .(Tudo Bem Que Deve Ser Definido Na Secção Windows Como VK_TAB , VK_Up, Vk_Down , etc...),O Que Esta Variável Tem :?: e Porque Voce Escolheu o Evento ComboBox1KeyUp :?: . Dá Para MostrarComo Matou a ´Cobra´ :?:
P:S Quero Agradecer a Todos Que Atê Aqui Contribuiram Para O
Equacionamento Deste Tópico e Em Particular Parabenizar Ao ´Fabio.HC
Por Resolve-lo Da Maneira Como Ele Foi Colocado. Espero Que Ele
Contribua Mais Uma Ves Com Os Seus Conhecimentos e Mostre Como
Matou a ´Cobra´ :P[/quote:ebecad3b68]
é a tecla Enter 13 e vk_retorn funciona da mesma forma
P:S Quero Agradecer a Todos Que Atê Aqui Contribuiram Para O
Equacionamento Deste Tópico e Em Particular Parabenizar Ao ´Fabio.HC
Por Resolve-lo Da Maneira Como Ele Foi Colocado. Espero Que Ele
Contribua Mais Uma Ves Com Os Seus Conhecimentos e Mostre Como
Matou a ´Cobra´ :P[/quote:ebecad3b68]
é a tecla Enter 13 e vk_retorn funciona da mesma forma
GOSTEI 0
Marco Salles
14/01/2004
Não EntendI Baliza o Que V.C Quis Acrescentar :?: ,Afirmar :?: ,Comparar :?: .... :?:
GOSTEI 0
Jose Narezzi
14/01/2004
kkk, vamos reabrir o tópico do Marcos Salles depois de 12 anos, para que outros possam descobrir o motivo dessa falha no Enter no combobox.
É muito simples, eu também tive esse problema e achei que era defeito do delphi. Não é não, é defeito nosso.
Essa falha ocorre quando voce usa algum codigo para transformar o TAB no Enter, quando chega na combobox, o delphi espera um TAB e não um Enter, como voce mudou a reação dele, ele fica sem saber o o que fazer.
Procure na sua aplicação quais são as funções tratam a troca do TAB pelo ENTER.
Abraços
É muito simples, eu também tive esse problema e achei que era defeito do delphi. Não é não, é defeito nosso.
Essa falha ocorre quando voce usa algum codigo para transformar o TAB no Enter, quando chega na combobox, o delphi espera um TAB e não um Enter, como voce mudou a reação dele, ele fica sem saber o o que fazer.
Procure na sua aplicação quais são as funções tratam a troca do TAB pelo ENTER.
Abraços
GOSTEI 0