PickList
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
Curtidas 0
Respostas
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
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
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
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
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:
: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
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
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
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.
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
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