PickList

Delphi

30/07/2005

Acredito que alguém já tentou fazer com que uma picklist abrisse de outra forma que não fosse com o mouse e quem tiver descoberto porfavor me diga pois isso me irrita desde quando eu comecei a programar.


Bmendesj

Bmendesj

Curtidas 0

Respostas

Michael

Michael

30/07/2005

Olá colega!

A combinação [b:769f1f0e9f]Alt + seta para baixo [/b:769f1f0e9f]não abre a Picklist? Funciona para qualquer combobox no Windows.

[]´s


GOSTEI 0
Marco Salles

Marco Salles

30/07/2005

Acredito que alguém já tentou fazer com que uma picklist abrisse de outra forma que não fosse com o mouse e quem tiver descoberto porfavor me diga pois isso me irrita desde quando eu comecei a programar.
]

Olá colega! A combinação Alt + seta para baixo não abre a Picklist? Funciona para qualquer combobox no Windows.


e por que não , supondo que o seu PicList Esteja na segunda coluna da Grid :?: :?: :?:

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
   if DbGrid1.SelectedIndex=1 Then
     begin
       DbGrid1.EditorMode:=true;
        keybd_event(VK_MENU, 0, 0, 0);
        keybd_event(VK_UP, 0, 0, 0);
        sleep(100);
        keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
     end
 end;
end;


Dai a lista ja abre e é so usar as Teclas do teclado ou Esc para sair

Pode ainda escolher esta lista usando o Space do teclado, Por exemplo

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key=32 Then
   begin
 if DbGrid1.SelectedIndex=1 Then
     begin
       DbGrid1.OnKeyDown:=nil;
       DbGrid1.EditorMode:=true;
        keybd_event(VK_MENU, 0, 0, 0);
        keybd_event(VK_UP, 0, 0, 0);
        sleep(100);
        keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
        DbGrid1.OnKeyDown:=DBGrid1KeyDown;
     end;
   end
end;


Acho que isto não vai te irritar mais...


GOSTEI 0
Marco Salles

Marco Salles

30/07/2005

e por que não , supondo que o seu PicList Esteja na segunda coluna da Grid


Desculpe , mas o exemplo eu usei DbGrid1.SelectedIndex=1 , isto é primeira coluna


GOSTEI 0
Marco Salles

Marco Salles

30/07/2005

bmendesj , mais uma coisa que gostaria de colocar... Como voce deve ter percebido eu tentei colocar duas situaçoes distintas... Uma situaçao em que a coluna do DbGrid recebe o foco , outra situação em que apos a coluna ter recebido o foco , a tecla Espaço é pressionada e se abre a Lista PickList

Pois bem , isto é apenas uma idéia , e estive pensando , que talvez fosse mais interresante trocar a [b:32553757d0]Tecla espaço pela Seta Para Baixo [/b:32553757d0], e alem disso , evitar que toda vez que receba o foco a lista Suspensa se
abra automaticamente , pois isto poderia ser um inconveniente na situção em que os registro ja estiverem salvos , e o usuário ficar percorrendo , a Grid .

Então eu fiz algumas pequenas alteraçoes e segue abaixo:

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=vk_Down Then  // seta para baixo do teclado
    begin
      if DbGrid1.SelectedIndex=1 Then
        begin
         //na situação de Edição ou Inserção.. Para que a Seta Para
        //baixo , não perca sua natureza , que e de andar nos registros da
       //Grid
          if (DataSource1.State In [DsEdit,DsInsert]) then            
            begin
             Key:=Vk_Return;
             DbGrid1.EditorMode:=true;
             keybd_event(VK_MENU, 0, 0, 0);
             keybd_event(VK_UP, 0, 0, 0);
             sleep(100);
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
           end;
        end;
    end;
end;


:idea: :idea: :idea: :idea:
[b:32553757d0]quando voce estiver sobre o registro e quiser abrir a lista suspensa, basta dar Um <ENTER> ... O Registro entrara no modo de edição ..A i basta apertar a Tecla Seta para baixo que a lista se abre[/b:32553757d0]

A Outra modificação que eu sugeri foi


procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
// A Lista so abre quando a coluna receber o foco , se não estiver nada 
//escrito nesta coluna...Quando o usuário estiver simplesmente //Percorrendo os registros , para evitar que a lista suspensa se abra
if Dbgrid1.DataSource.DataSet.FieldByName
                    (Dbgrid1.Columns.Items[1].FieldName).AsString = ´´ Then
     begin
        if DbGrid1.SelectedIndex=1 Then
          begin
             DbGrid1.EditorMode:=true;
             keybd_event(VK_MENU, 0, 0, 0);
             keybd_event(VK_UP, 0, 0, 0);
             sleep(100);
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
          end;
     end
 end;
end;


Por fim , isto é apenas uma idéia , se voce ou alguem tiver alguma idéia que melhore o código , por favor sinta-se á vontade


GOSTEI 0
Bmendesj

Bmendesj

30/07/2005

Esta última idéia é realmente boa!
Eu vou tentar resumir o dódigo de acordo com as minhas nescessidades or que eu acho ele muito grande e complicado para algo tão simples.


GOSTEI 0
Marco Salles

Marco Salles

30/07/2005

Eu vou tentar resumir o dódigo ........or que eu acho ele muito grande


:?: :?: :?: :?: :?: :?: :?:
[b:3895ea9f10]15 talves 20 Linhas de código ... O Resto são comentários[/b:3895ea9f10]


procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
  if key=vk_Down Then 
    begin 
      if DbGrid1.SelectedIndex=1 Then 
        begin 
          if (DataSource1.State In [DsEdit,DsInsert]) then            
            begin 
             Key:=Vk_Return; 
             DbGrid1.EditorMode:=true; 
             keybd_event(VK_MENU, 0, 0, 0); 
             keybd_event(VK_UP, 0, 0, 0); 
             sleep(100); 
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0); 
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); 
           end; 
        end; 
    end; 
end; 


procedure TForm1.DBGrid1ColEnter(Sender: TObject); 
begin 
if Dbgrid1.DataSource.DataSet.FieldByName 
                    (Dbgrid1.Columns.Items[1].FieldName).AsString = ´´ Then 
     begin 
        if DbGrid1.SelectedIndex=1 Then 
          begin 
             DbGrid1.EditorMode:=true; 
             keybd_event(VK_MENU, 0, 0, 0); 
             keybd_event(VK_UP, 0, 0, 0); 
             sleep(100); 
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0); 
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); 
          end; 
     end 
 end; 
end;


e quem tiver descoberto porfavor me diga pois isso me irrita desde quando eu comecei a programar.


acho ele muito grande e complicado para algo tão simples.


[b:3895ea9f10]Talves agora seje simples ... Mas pelo que parece não era tão simples assim[/b:3895ea9f10] :cry: :cry: :cry: :cry:

Eu vou tentar resumir o dódigo de acordo com as minhas nescessidades


[b:3895ea9f10]Agora sim , nos estamos de acordo... [/b:3895ea9f10]Adapta-lo para a sua necessidade..
Muitas das vezes codigos tem que serem modificados , pois funcionam em determinadas condiçoes . :arrow: Por exemplo , se colocar uma mensagem
[b:3895ea9f10](Showmessage)[/b:3895ea9f10] no evento DBGrid1KeyDown acho que não funciona.
O Importante é entender a idéia das instruçoes:

 Key:=Vk_Return; 
 DbGrid1.EditorMode:=true; 
 keybd_event(VK_MENU, 0, 0, 0); 
 keybd_event(VK_UP, 0, 0, 0); 
 sleep(100); 
 keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0); 
 keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); 


e como esse conjunto de instruçoes se comporta no seu Aplicativo.


GOSTEI 0
POSTAR