Como ´limpar a variável key´ após utilizar o FormKeyDown?

Delphi

01/11/2006

Saudações gente,
eu de novo, como faço para esvaziar o conteúdo da key após utilizar o FormKeyDown?
Acontece que eu tenho usado esta propriedade para chamar uma tela de pesquisa para o edit que está com o foco. Até aí tudo bem, o problema é que quando eu passo o foco para o outro edit a tela de consulta deste aparece sem precisar chamar (acredito que a key continua com o F2 guardado). Tem como eu esvaziar assim que chamar a tela?

Ah! aproveitando, uma coisa que me intrigou...tem como usar um Align = Center no texto do Edit? desculpem a ignorância...mas eu não encontrei algo assim nele...acredito que ele não tem essa propriedade


Zooropa

Zooropa

Curtidas 0

Respostas

Aldus

Aldus

01/11/2006

No final do evento coloque: key:=0

Quanto ao alinhamento, o edit do delphi não tem alinhamento mesmo.

att
Mario


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Olá Aldus,
cara, testei o que vc me passou mas não funciona. Fora o OnKeydown do form eu tenho no mesmo evento de cada edit e em todos eles eu limpei a key. Porém basta eu dar um setfocus em qualquer um deles que a tela já aparece....o que me falta fazer?
De qualquer forma obrigado...


GOSTEI 0
Rhalves

Rhalves

01/11/2006

Cara, tentar utilizar assim:

Begin
Key := #0;
ChamaForm;
End;


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Olá Alves,
cara, tentei o que vc disse mas não deu certo. Dá tipos incompatíveis...e eu continuo com o mesmo problema....cada edit tem uma tela de busca que é chamada através do F2. Se eu digitar o F2 no primeiro edit e ir para o foco do próximo, este já chama a tela automaticamente, como se o F2 fosse pressionado, não consigo resolver isso. O trecho é este:

case key of VK_F2:
     if Edit1.Focused then
        Chama a Pesquisa;


Se alguém puder me ajudar...


GOSTEI 0
Renato.pavan

Renato.pavan

01/11/2006

Olá Alves, cara, tentei o que vc disse mas não deu certo. Dá tipos incompatíveis...e eu continuo com o mesmo problema....cada edit tem uma tela de busca que é chamada através do F2. Se eu digitar o F2 no primeiro edit e ir para o foco do próximo, este já chama a tela automaticamente, como se o F2 fosse pressionado, não consigo resolver isso. O trecho é este:
case key of VK_F2:
     if Edit1.Focused then
        Chama a Pesquisa;

Se alguém puder me ajudar...


Colega fiz um teste aqui da seguinte forma:

No FormKeyDown coloquei o codigo abaixo:
begin
  if Key = VK_F2 then
    if Edit1.Focused then
      ShowMessage(´Pressionado F2 no Edit1´)
    else if Edit2.Focused then
      ShowMessage(´Pressionado F2 no Edit2´)
    else if Edit3.Focused then
      ShowMessage(´Pressionado F2 no Edit3´)
    else
      ShowMessage(´Pressionado F2 no Edit4´);
end;


Desta forma executa o showmessage de acordo com o edit que estiver com foco, fiz isso pq vc relata que pressiona F2 no primeiro edit e vai pro proximo e sem pressionar o F2 ja abre a tela de pesquisa, nesse teste que fiz apenas qdo pressiono F2 exibe a mensagem relativa ao edit que estiver com foco.

Esepro ter ajudado de alguma forma.

[]´s

Renato


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Olá Renato,
o meu problema não está na execução do KeyDown com F2 e sim na passagem para outro componente após esta utilização porque o F2 continua pressionado fazendo com que o evento KeyDown do próximo componente seja acionado. No primeiro edit eu faço tudo tranquilo, ao concluir com ele e passar o foco para o próximo edit, este já chama a tela de pesquisa sem eu tc no F2, sacou?
Eu tenho que zerar a key a cada finalização do evento keydown e isso eu não consigo.
Muito obrigado.


GOSTEI 0
Campsoft

Campsoft

01/11/2006

Você ja tentou colocar o comando exit no final do if key=vk_f2 ?

if key=vk_f2 then begin
...
exit;
end;

verifique se nao existe nada no evento onkeyup do segundo campo.

se eu entendi a logica

f2 sobre campo1, executa evento (onkeydown), pula pro proximo campo.

(eu imagino que o evento onkeyup do segundo campo deve estar sendo o culpado)


GOSTEI 0
Marco Salles

Marco Salles

01/11/2006

Com voce faz duas coisas ao mesmo tempo ????

Se eu digitar o F2 no primeiro edit e ir para o foco do próximo,


Se voce digitar F2 no promeiro edit ele ira excecutar o codigo respctivo ao evento OnKeyDown desse edit..
Tambem não entendo porque voce testa o foco (usando If)
[b:53a4838c00] if Edit1.Focused then [/b:53a4838c00]
Pois o evento OnkewDonw so é disparado no edit que tem o foco
Quado se digitar F2 nun edit qualquer
case key of VK_F2:
//Vai fazer o que estiver aqui nesse edit qualquer


Não entendo[b:53a4838c00] porque que muda para o proximo edit [/b:53a4838c00], a não ser que dentro do codigo voce esteja dando uma instrução para mudar de controle ??


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Olá Marco,
eu sei que o evento é para o objeto focado porém não estava funcionando por isso tive que colocar esta ´marreta´ de perguntar se o objeto estava focado. Quanto à passar para o próximo eu realmente coloquei o comando para ir para o próximo edit porque é necessário que isso ocorra na hora da digitação. Só que assim que o próximo edit é focado, a tela de pesquisa deste campo é chamada sem que pra isso tecle o F2...como resolvo isso? (detalhe: no primeiro edit, tudo funciona tranquilo. É a partir do primeiro evento keydown que acontece isso a cada edit focado).
Agradeço a todos por toda ajuda.


GOSTEI 0
Micheus

Micheus

01/11/2006

Ah! aproveitando, uma coisa que me intrigou...tem como usar um Align = Center no texto do Edit? desculpem a ignorância...mas eu não encontrei algo assim nele...acredito que ele não tem essa propriedade
Se vc não quizer instalar um novo componente para isto, poderia definir uma nova classe e criá-la dinamicamente no OnCreate do seu form. Ex.:
inteface
type
  TEditCentered = class(TEdit)
  private
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TForm1 = class(TForm)
    ...
  private
    Edit2: TEditCentered;
  end;
...
implementation

procedure TEditCentered.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or ES_CENTER;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit2 := TNewEdit.Create(Self);
  Edit2.Parent := Self;
  Edit2.Top := 240;
  Edit2.Left := 8;
  ...
end;



GOSTEI 0
Marco Salles

Marco Salles

01/11/2006

Olá Marco, eu sei que o evento é para o objeto focado porém não estava funcionando por isso tive que colocar esta ´marreta´ de perguntar se o objeto estava focado.


[b:ba8ca70060]Mas tem que funcionar [/b:ba8ca70060], sem ter que usar truques..

Quanto à passar para o próximo eu realmente coloquei o comando para ir para o próximo edit porque é necessário que isso ocorra na hora da digitação.


Mas voce deve fazer isto depois de mostrado o formulário respctivo ao edit
Apertou F2 Então Chama o Formulario [b:ba8ca70060]Showmodal[/b:ba8ca70060] Vai para o Proximo Edit


e qual o comando que voce esta usando para passar para o proximo edit ???
Talves seria interresante colocar o fragemnto de codigo completo que faça esta mudança e apresentação do form para que possamos tentar simular este efeito meio que curioso
Acredito que todos os edits possuem mesmo codigo , pelo menos boa parte de codigos iguias , no que refere a apresentação do formulário e mudança do foco para o próximo edit


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Saudações Marco,
conforme solicitado estou colocando o código logo abaixo:
procedure TFr_GradePlano.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

  case Key of VK_ESCAPE:
     BtSair.OnClick(nil);
  end;

  if Key = VK_RETURN then
     Perform(Wm_NextDlgCtl,0,0);

  if key = VK_F2 then
  begin
     if dbCodConta.Focused then
     begin
        btLista.OnClick(self);
        key := 0;
     end;

     if dbCodUnNeg.Focused then
     begin
        btListaUnNeg.OnClick(self);
        key := 0;
     end;

Este código para o F2 possuem mais 3 edits, cada um com sua respectiva tela de pesquisa. Segue abaixo também o código do botão que chama uma das telas (o código é parecido para todos os botões, só muda a tela):
procedure TFr_GradePlano.btListaClick(Sender: TObject);
begin
  Application.createform(TFr_PesPlanoGer, Fr_PesPlanoGer);
  Fr_PesPlanoGer.Showmodal;

  if wcodigo <> ´´ then
  begin
    dbCodConta.Text  := wcodigo;
    dbDescConta.text := wnome;
    wcodigo := ´´;
    wnome   := ´´;
    Pesq             := 1;
    LoadGradePlano;
  end;
end;


Repare que no bloco if eu tenho duas variáveis globais (wcodigo e wnome) que carregam o resultado da minha pesquisa e joga nos edits ligados ao botão. Após isso o foco passa para o próximo edit (eu estava usando o setfocus mas depois ordenei os edits pelo Tab Order) e aí é que acontece o meu caso, a próxima tela de pesquisa abre sem eu teclar o F2.
Agradeço a ajuda de todos.


GOSTEI 0
Siam

Siam

01/11/2006

...e aí é que acontece o meu caso, a próxima tela de pesquisa abre sem eu teclar o F2.
Pode ser que o evento KeyDown esteja executando mais de uma vez quando F2 é pressionado.
Tente trocar onKeyDown por onKeyUp.


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Olá Siam,
já fiz a modificação, também não funcionou. Pessoal, será que alguém pode fazer um teste usando o código igual ao meu e verificar o erro?
Já testei de tudo e já estou quase desistindo de usar esta opção no aplicativo.
Mesmo assim agradeço a ajuda de todos. Valeu mesmo!


GOSTEI 0
Mrangel

Mrangel

01/11/2006

Tente Colocar só no onkeydown dos edits


if key = VK_F2 then
begin
btLista.OnClick(self);
end;

Marcelo Rangel


GOSTEI 0
Marco Salles

Marco Salles

01/11/2006

Pessoal, será que alguém pode fazer um teste usando o código igual ao meu e verificar o erro?


mas ta dificil ´zooropa´ entender o codigo...

[b:6af64eb811]no OnKeyDowm de um edit voce testa se o F2 foi pressionado[/b:6af64eb811].. Mas no mesmo conjunto de instruçoes voce testa se o foco esta em um dbedit ???

procedure TFr_GradePlano.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin bla..bla..bla.. //testa se o F2 foi presionado... if key = VK_F2 then //caso tenha sido presiionado faça: begin //testa se o foco esta com o DbCodConta ?????? if dbCodConta.Focused then //Ora esta instrução sera falsa //-->>>não sera executado


então fico sem entender a que pressupoe o codigo :cry: :cry:


GOSTEI 0
Zooropa

Zooropa

01/11/2006

Pessoal,
no evento OnKeyDown do form (usado inicialmente) eu verifico tudo. A tecla F2 foi pressionada? se sim, blz. Qual edit está focado? O edit fulano? blz, chama a tela de pesquisa fulano e depois de carregar passa para o cicrano. Só isso. Só que ao chegar no cicrano (sendo utilizando um Setfocus, tabOrder...o que for) o cicrano já chama a tela de pesquisa dele sem que eu aperte o F2. Independente do evento que eu use (KeyUp, KeyPress ou KeyDown), utilizando ou não um setfocus, basta passar para o próximo edit que a tela de pesquisa já se abre e eu só quero que abra ao pressionar o F2. Resumindo, se eu tiver dez edits um após o outro eu só preciso pressionar o F2 uma vez (no primeiro) que ele abre todas as telas de pesquisa uma após a outra e eu não quero isso.
Obrigado por toda a ajuda! Esse lance tá moendo...


GOSTEI 0
Cabreu.jr

Cabreu.jr

01/11/2006

Amigo, poste o seu código e o que voce quer fazer exatamente


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/11/2006

foi postado o seguinte:
Saudações Marco, conforme solicitado estou colocando o código logo abaixo:
procedure TFr_GradePlano.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of VK_ESCAPE:
     BtSair.OnClick(nil);
  end;

  if Key = VK_RETURN then
     Perform(Wm_NextDlgCtl,0,0);

  if key = VK_F2 then
  begin
     if dbCodConta.Focused then
     begin
        btLista.OnClick(self);
        key := 0;
     end;

     if dbCodUnNeg.Focused then
     begin
        btListaUnNeg.OnClick(self);
        key := 0;
     end;
(...) Agradeço a ajuda de todos.


creio que estejam faltando [b:815cebebd4]elses[/b:815cebebd4] entre os [b:815cebebd4]ifs[/b:815cebebd4].
eles aparecem no exemplo abaixo e, além disso, passei a usar mais efetivamente o [b:815cebebd4]case[/b:815cebebd4]:
procedure TFr_GradePlano.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_ESCAPE:
      BtSair.OnClick(nil);
    VK_RETURN:
      Perform(Wm_NextDlgCtl,0,0);
    VK_F2:
      if dbCodConta.Focused then
        btLista.OnClick(self)
      else
      if dbCodUnNeg.Focused then
        btListaUnNeg.OnClick(self);
  end;



GOSTEI 0
POSTAR