önce konu ile ilgili bir kaç link.
viewtopic.php?t=4779&highlight=edit+enter+tab
viewtopic.php?t=16008&highlight=edit+enter+tab
viewtopic.php?t=2324&highlight=edit+enter+tab
viewtopic.php?t=15084&highlight=edit+enter+tab
olay basit formumuz üzerine editlerimiz var ve kullanıcıların ms-dos uygulamalarından kalan alışkanlığı
enter ve yön tuşları ile kontroller arasında gezinmek.
önce formun keypreview özelliğini true yapıyoruz. bu key eventlarında (keydown, keyup, keypres) forma öncelik tanıyor.
yani hem formun hemde editin keydown olayına koda yazmanız halinde önce formun keydown olayı çalışıyor sonra editin...
formun key önceliğini aldıktan sonra sıra kodumuza geliyor. keydown olayına
Kod: Tümünü seç
if key=vk_return then selectnext(activecontrol,true,true);
ama bu dınn sesi nerden çıktı...
bunun sebebini bende tam olarak bilmiyorum ancak bu sesi gidermenin 3 yolu var.
1. selectnext yerine başka bir komutla geçiş yapılabilir. (bu benim tercihim değil)
2. denetim masasından windowsun varsayılan sesi iptal edilebilir.(programın yüklendiği her makinede yapılması lazım- bir kaç müşteride yapmıştım-)
3. bir satırlık kod daha yazarak olayı kökünden halledebiliriz.
formun keypres olayına
Kod: Tümünü seç
if key=#13 then key:=#0
bu arada #13 enter tuşunun ascii (American Standard Code Information Interchance)karşığıdır. konumuza dönelim.
artık dınn sesinden de kurtulduk.
ama bir şey daha var
yön tuşları....
biz sadece enter tuşu ile geçiş yaptık yön tuşları hala boş.
keydowna geri dönelim ve kodumuzu biraz geliştirelim.
Kod: Tümünü seç
case key of
vk_return,
vk_down:selectnext(activecontrol,true,true);
vk_up:selectnext(activecontrol,false,true);
end;
çok güzel oldu dimi. artık editler arasında enter ve yön tuşlarını kullanarak rahat bir şekilde geçiş yapabiliyoruz.
yalnız bizim formumuzda her zaman sadece editler olmuyor.
Combobox larımızda oluyor. eğer forma bir combobox koyup itemsine birkaç eleman ekleyin.
programı çalıştırın. form üzerinde yön tuşları ile yukarı aşağı gezinin.
comboboxun üzerinden her geçişinizde itemsin değiştiğini göreceksiniz.
yön tuşları hem combobox için çalışıyor hemde bizim kodlarızla istediğimiz işi yapıyor.
Kullanıcı combo dan istediği elemanı seçtikten sonra aşağı ok tuşu ile bir sonraki kontrole geçtiği zaman seçtiği elemanın değişmesi hoşuna gitmeyecektir.
peki bunu engellemek için ne yapmamız gerekir.
doğru. Keydowna yazdığımız kodu biraz daha geliştirelim.
Kod: Tümünü seç
case key of
vk_return,
vk_down:Begin
selectnext(activecontrol,true,true);
key:=0;
end;
vk_up:Begin
selectnext(activecontrol,false,true);
key:=0;
end;
end;
Acaba ???
comboboxun itemsine eklediğimiz listemizin biraz uzun olduğunu düşünelim.
kullanıcı listeden seçeceği elemanın adını hatırlayamadı. listeyi açması lazım. Hemen fare ile listeyi açar. Ama bu kullanıcıya vakit kaybettirir.
düşünsenize klavye ile hızlı hızlı bilgileri giriyor birden eli fareye gidecek, farenin imlecini görecek, getirecek....
Normalde ALT+ Aşağı ok tuşu ile listeyi açar, yukarı aşağı gezer,enter ile seçer geçerim ama artık yapmıyor.
bu işlemleride bizim yaptırmamız lazım.
sadece combobox değil lookup combobox içinde aynı işlemleri yapmamız lazım.
kodumuzun son hali şöyle oluyor.
Kod: Tümünü seç
case key of
VK_RETURN:begin
if (activecontrol is TDblookupcombobox) then
if (activecontrol as TDblookupcombobox).Listvisible then begin inherited; exit;end;
if (activecontrol is TComboBox) then
if (activecontrol as TComboBox).DroppedDown then begin inherited; exit;end;
selectnext(activecontrol,true,true);
key:=0;
end;
VK_DOWN:begin
if shift=[ssalt] then begin inherited; exit; end;
if (activecontrol is TDblookupcombobox) then
if (activecontrol as Tdblookupcombobox).listvisible then begin inherited; exit;end;
if (activecontrol is TComboBox) then
if (activecontrol as TComboBox).DroppedDown then begin inherited; exit;end;
//eğer buraya gelmişse alt tuşuna basılmamış ve combolarda liste açık değil
//ozaman
selectnext(activecontrol,true,true);
key:=0;
end;
VK_UP :begin
if (activecontrol is TDblookupcombobox) then
if (activecontrol as TDblookupcombobox).Listvisible then begin inherited; exit;end;
if (activecontrol is TComboBox) then
if (activecontrol as TComboBox).DroppedDown then begin inherited; exit;end;
selectnext(activecontrol,false,true);
key:=0;
end;
end;
böylelikle listelerin açılma işini de halletmiş olduk.
peki sıkıntımız bittimi?
ya kontrol bir memo ise ve enter tuşuna bastığım zaman memoda bir alt satıra geçmek istiyorsam, yada...........
En iyisi kullanıcıya windowsdaki tab tuşunun maharetlerinden bahsetmek, ve bu tuşu kullanmalarını sağlamak...
Ama enter tuşu............