editler arasında enter ve yön tuşları ile dolaşmak

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

editler arasında enter ve yön tuşları ile dolaşmak

Mesaj gönderen aslangeri »

evet daha önce defalarca konuşuldu ama ben olayı biraz daha detaylandırmak istiyorum.

ö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);
artık enter tuşu ile tuşlar arasında geziniyoruz.
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
NOT: dikkat ettiyseniz keydownd key i vk_return ile karşılaştırdık ama key preste #13 ile. bunun nedeni keydown olayında key parametresinin tipinin word, keypres eventinde ise char olarak tanımlanması.
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;
yukarı çıkmak için selectnext prosedürüne false parametresini geçtik. Selectnext komutu için detaylı bilgi için delphi help i kullanabilirsiniz.

ç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;
keyleri sıfırlayarak yön tuşları ile ilgili sıkıntıyıda hallettik.

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;
yaptığımız iş kontrolün sınıfını buluyoruz. Açılır listenin açık olup olmama durumuna bakıyoruz ve inherited komutu ile kontrolün varsayılan işlemi yapmasını sağlıyoruz.

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............
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

Mesaj gönderen y.kulac »

açıklayıcı bilgileriniz için teşekkür ederim.
oyle
Üye
Mesajlar: 137
Kayıt: 17 Eki 2006 05:53

Mesaj gönderen oyle »

Öncelikle Elinize Saglik.

Bu yontemi kullanarak editlardan cxgride focus oldugunda onkeydown olayinin calismasini istemiyorum. Yani cxgrid de iken columun lar uzerinde gezinirken sonraki kontrol e focus olmasini istemiyorum. Bunun icin

Kod: Tümünü seç

if (activecontrol is TcxGrid) then exit;

satirini en basa ekledim. Ama calismiyor :?
CxGride focus landiktan sonra yon tuslari veya enter kullandigimizda diger kontrollere focuslanmasini nasil engelleyebiliriz.?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
öncelikle cxgridi hiç kullanmadığımı belirtmek isterim. onun kendine özel kontrolleri varmıdır durumu nedir bilemiyorum.
keydown olayına breakpoint koyup öyle denemenizi tavsiye edeceğim.
tabi breakpointi programı başlamadan önce koymayın. programı çalıştırı cxgride focus olun ondan sonra breakpointi koyun. tuşa bastığınızda olaya gelmesi lazım.
orda değişkenlerin değerlerini ve programı izlediği yolu takip ederek sonuca ulaşabilirsiniz.
veya bir alternatif olarakda
cxgridin onenter olayında formun keydown ve keypres eventlarını iptal edin. onexit da ise tekrar eski haline getirin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

F li kısayol tuşları

Mesaj gönderen baloglurecep »

Aslan geri hocam saygılar ;

Projemde f li kısayol tuşları atamak istiyorum. genelde kaydetme yada formda ilgili başka bir pencere açmakiçn. ancak ne formun ne de bileşnlerin key evetslerinde bu işi yapabliyorum. projemde busines diye bir bileşen seti kullanıyorum. sanırım onun etkisi var galiba. çünkü standar bileşenlerle yaptığımda istediğim sonucu alıyorum. ancak aynı kodları projemde denediğimde sonuç alamıyoum. konuyla alakalı olduğu için burayada yazdım. yorumlarınız bana ışık olacak.

saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
muhtemelen kullandığınız bussines bileşenleri key eventlarını önce kendileri yorumluyorlar.
ben kısayol tuşları için pop up menu kullanıyorum.
sizede tavsiye ederim.
kolya gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
tux
Üye
Mesajlar: 22
Kayıt: 01 Nis 2008 03:24

Re: editler arasında enter ve yön tuşları ile dolaşmak

Mesaj gönderen tux »

cxGrid için bu şekilde çalışıyor

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not cxGrid1.IsFocused then begin
if Key = VK_UP then PostMessage(Handle, WM_NEXTDLGCTL, 1, 0);
if Key = VK_DOWN then PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
end;
end;
Kullanıcı avatarı
igny
Üye
Mesajlar: 54
Kayıt: 14 Mar 2008 04:03

Re: editler arasında enter ve yön tuşları ile dolaşmak

Mesaj gönderen igny »

Arkadaşlar konu üzerinden 3 yıl geçmiş belki konuyu hortlatmak gibi olacak ama belki birinin işine yarar diye yazıyorum.
Cx gridde yön tuşları ile gezinmek için aşağıdaki Foknsiyonu kullanabilirsiniz.

Function CxKontrol(FF:Tform):Boolean
begin
Result:True;
if (FF.ActiveControl is TcxGridsite) Then Result:=False;
end;

bunu formunuzun onkeydown olayına yazın

procedure TFrmForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift : TShiftState);
begin
Case Key Of
if (key = VK_DOWN) or (key = VK_UP) then
if not CxKontrol(FrmForm1) then
buraya yön tuşları ile yapılması gerekenleri yazın
..........

end;
Cevapla