Fórum PickList #290085
30/07/2005
0
Bmendesj
Curtir tópico
+ 0Posts
30/07/2005
Michael
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
30/07/2005
Marco Salles
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
30/07/2005
Marco Salles
Desculpe , mas o exemplo eu usei DbGrid1.SelectedIndex=1 , isto é primeira coluna
Gostei + 0
31/07/2005
Marco Salles
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
20/08/2005
Bmendesj
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
20/08/2005
Marco Salles
:?: :?: :?: :?: :?: :?: :?:
[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;
[b:3895ea9f10]Talves agora seje simples ... Mas pelo que parece não era tão simples assim[/b:3895ea9f10] :cry: :cry: :cry: :cry:
[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
Clique aqui para fazer login e interagir na Comunidade :)