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

DBLookupComboBox


Eder

Pergunta

Ola..

já estou algum tempo para resolver este probleminha...

eu uso o DBLookupComboBox para pegar dados de uma tabela e gravar em outra...até aqui beleza...

quando o foco entra no DBLookupComboBox e ai aparece a seleção dos dados eu tenho opção para digitador no proprio DBLookupComboBox e dar enter(funciona beleza) e também tenho a opção de abrir com o mouse e selecionar pelas setas no teclado.....aqui é que ta o problema...quando eu uso o mouse funciona perfeito, mas quando uso as setas e dou enter ele não seleciona o registro alias não seleciona nada...

Uma vez o Jonas me passou esta dica:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables, StdCtrls, DBCtrls, Grids, DBGrids, RxLookup;

type
  TForm1 = class(TForm)
    DBLookupComboBox1: TDBLookupComboBox;
    Edit1: TEdit;
    DataSource1: TDataSource;
    Table1: TTable;
    DBGrid1: TDBGrid;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormActivate(Sender: TObject);
//
procedure MudarComEnter(var Msg: TMsg; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MudarComEnter(var Msg: TMsg; var Handled: Boolean);
begin
   If not ((Screen.ActiveControl is TCustomMemo) or   // se não for um memo
     (Screen.ActiveControl is TDBLookupComboBox) or  // se não for um DbLookup
     (Screen.ActiveControl is TCustomGrid) or // se não for uma grid o controle mudara com enter
     (Screen.ActiveForm.ClassName = 'TMessageForm')) then
   begin
     If Msg.message = WM_KEYDOWN then
        begin
           Case Msg.wParam of
              VK_RETURN,VK_DOWN : Screen.ActiveForm.Perform(WM_NextDlgCtl,0,0);   //,VK_TAB
              VK_UP : Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
           end;
        end;
   end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 If Key = #13 then
    Begin
      Key := #0;
      Perform(WM_NextDlgCtl, 0, 0);
    End;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Application.OnMessage := MudarComEnter;
end;

end.
Form1.KeyPreview=true;

Ela só funciona..se eu tirar o codigo do enter no OnKeyPress do Form1, neste caso eu teria usar o Tab no lugar no enter, porem não é bem aceito pelos usuarios...

Teria como fazer funcionar com a seleção feita pelas setas e em seguida com o enter??

Grato

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

8 respostass a esta questão

Posts Recomendados

  • 0
Teria como fazer funcionar com a seleção feita ( no DBLookupComboBox1 ) pelas setas e em seguida com o enter??

Eder .. faça dessa maneira

procedure TForm1.DBLookupComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  edit1.text := DBLookupComboBox1.Text;
end;

OBS: Ser voce estiver usando as setas e clicar no enter, o conteudo do campo ira para o edit ( Use o evento OnKeyUp do DBLookupComboBox1 )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Deveria funcionar ... eu uso dessa maneira em varias aplicações e funciona

Veja se não tem outro codigo impedindo de funcionar dessa maneira.

Faça o teste em uma nova aplicação ... coloque apenas um Edit, um DBLookupComboBox1, uma query e um datasource

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jonas...sim funciona mesmo...só tem um problema.

como vou trabalhar com o enter?

pois se eu usar a sua dica....tenho que desabilitar este codigo abaixo para trabalhar com o enter

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 If Key = #13 then
    Begin
      Key := #0;
      Perform(WM_NextDlgCtl, 0, 0);
    End;
end;

Não posso desabilitar enter...tens alguma dica para poder trabalhar com os dois processos?

Grato

Link para o comentário
Compartilhar em outros sites

  • 0
quando o foco entra no DBLookupComboBox e ai aparece a seleção dos dados eu tenho opção para digitador no proprio DBLookupComboBox e dar enter(funciona beleza)
funciona porque neste caso, a caixa de lista está fechada e teclando ENTER o seu procedimento executa a ação de mudar o foco para outro controle.

e também tenho a opção de abrir com o mouse e selecionar pelas setas no teclado.....aqui é que ta o problema...quando eu uso o mouse funciona perfeito, mas quando uso as setas e dou enter ele não seleciona o registro alias não seleciona nada...
e não funciona porque neste caso, quando a caixa de lista está aberta, e você usa o teclado, apenas a tecla ENTER tem a função de mudar a seleção - de acordo com a programação do componente - mas como você trata o ENTER sem se preocupar com esta situação, ocorre que o foco é mudado para outro controle, sem que o processo de seleção (implementado no componente) seja executado. Aliás, este procedimento (não selecionar se não usar o ENTER) é o padrão, caso não tenha observado anteriormente.

Uma opção pode ser, ao processar o ENTER, verificar se o componente ativo (ActiveControl) é um destes componentes com caixa de lista (TComboBox, TDBComboBox, TDBLookupComboBox) e verificar se a caixa de listas está aberta. (não estou 100% certo de que ela ainda será True no momento do processamento do ENTER - tem que testar).

No caso do TDBLookupComboBox, voce pode testar se a caixa de lista está visível através da propriedade ListVisible. Já no caso das TComboBox e TDBComboBox, voce poderá utilizar a propriedade DroppedDown.

Como efeito, com a caixa aberta, o primeiro ENTER, selecionaria o item e um segundo ENTER, mudaria o foco para o próximo componente.

Outra opção, poderia ser permitir que a tecla continuasse sendo processada quando o componente se tratar deste em questão, ou seja, você não mudaria o valor de Key para #0 (também tem que testar, pois não estou 100% certo de que funcionaria como o esperado).

Bom, são opções a verificar.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Outra opção, poderia ser permitir que a tecla continuasse sendo processada quando o componente se tratar deste em questão, ou seja, você não mudaria o valor de Key para #0 (também tem que testar, pois não estou 100% certo de que funcionaria como o esperado).
testei assim:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 then
    Begin
     //Key := #0;
     Perform(WM_NextDlgCtl, 0, 0);
    End;
end;

Mesmo assim...não deu certo...

a única maneira de funcionar é sem este código acima ou seja sem trabalhar com enter, ai sim sem este codigo acima e usando o Tab funciona como gostaria.

Mas beleza...deixa quieto...ou usuario trabalha com o enter do jeito que ta ou desabilito o enter e trabalha com o Tab e funciona da maneira como mencionado no tópico.

Grato

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

  • 0

Eder, implementei uma combinação das duas opções e teve como resultado um beep quando você está com a lista aberta e seleciona um item utilizando as setas de navegação e, em seguida, tecla o ENTER. Como havia dito, não tinha 100% certeza de que funcionaria.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
  NaoLimpaKey :Boolean;
begin
  if Key = #13 then
  begin
    if ActiveControl is TDBLookupComboBox then
      NaoLimpaKey := TDBLookupComboBox(ActiveControl).ListVisible
    else
      if ActiveControl is TCustomComboBox then
        NaoLimpaKey := TCustomComboBox(ActiveControl).DroppedDown
      else
        NaoLimpaKey := False;
        
    if not NaoLimpaKey then
      Key := #0;
    Perform(WM_NextDlgCtl, 0, 0);
  end;
end;

Abraços

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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...