Delphi' de herhangi bir komponenti seçili hale getirmek

Başlatan bunalmis, 08 Haziran 2005, 11:42:23

z

Forum üstünde bir kaç tane Tedit alanı olsun.

Tedit'lerin tamamını klavye ile doldurduğumuzu ardından en son olarak Tamam tuşuna bastığımızı farzedin.

Tamam tuşuna ait program Tedit değerlerini alıp hata testine soksun ve hata varsa hangi Tedit verisi hatalı ise o Tedit'i seçsin. Bize sadece klavyede tuşlara basmak kalsın.

Seçme işlemini otomatik yaptırmazsak mouse ile kursoru bizim ilgili Tedit üzerine taşıyıp tıklamamız gerekir. (Sonuç olarakilave bu hareketten dolayı  parmaklarımız ve bileğimiz ağrır :D )

Ancak ben bu otomatik seçim işinin nasıl yapılacağını bulamadım.

Nasıl?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

Tab order ile oluyor  galiba. Yani normalde biz taba basarsak sıra ile form üzerindeki kontroller arasında gidebiliyoruz. Tab order değeri sıfır olan ilk nesne olsa gerek.

işte program çalışırken biz bu taborder değerini kendimiz değiştirebiliriz. mesela edit1 içine birşey yazılıyorkenbu sırada hemen yanındaki tamam butonu seçili olmalı ise, edit1in on keypress olayına button5. taborder:=0 yazmamız gerekebilir.
belki de bundan iyisi button1.selected:=true; gibi birşey olabilir.
çok yardımcı oldum farkındayım :D

z

Çöztürk seçmek istediğim Tedit'in taborder değerini 0 yaptım ama işe yaramıyor. Bir de tab tuşuna da basmak istemiyorum. Program hatalı değer içeren Tedit!i otomatik olarak seçsin ben sadece yeni değer yazayım istiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

//TEdit Nesnesi
Bilgi girişi yapılabilen nesnelerdir.
AutoSelect TRUE ise tab tuşu ile focus yapıldığında edit içindeki
bilgiyi seçili hale getirir.

demiş. Galiba Form veya nesnelernin focus olayına bakılacak

z

Eğer Tedit'ler direk fom üzerinde değil de groupbox gibi bir şeyin üstündeyse Groupbox tab orderi de sıfır yapınca olacak galiba. Ama tab tuşuna basmak işime gelmiyor.

Peki en kötü ihtimalle tab tuşuna basılmış gibi bir şey yaptırabilirmiyiz.
Keyboard bufferdan okumak gibi keyboard buffera tab yazmak mesela?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

Nesneler arasında ENTER tuşu ve OK tuşlarıyla hareket etmenizi sağlar.
Formda TabStop Özelliği True olan nesneler için TabOrder sırasına göre Enter
ve Ok tuşlarıyla hareket etmenizi sağlar.
Aşağıdaki kodu formun OnFormKeyDown kısmına yerleştirin ve Formun KeyPreview
Özelliğini True Yapın. Hepsi bu kadar. Kolay gelsin...

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
     if ((Key = VK_Return) or (Key = VK_Down))  then
     begin
       keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), 0, 0);
       keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), KEYEVENTF_KEYUP, 0);
     end;

     if (Key = VK_UP) then
     begin
       keybd_event(VK_Shift, MapVirtualKey(VK_Shift, 0), 0, 0);
       keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), 0, 0);
       keybd_event(VK_Tab, MapVirtualKey(VK_Tab, 0), KEYEVENTF_KEYUP, 0);
       keybd_event(VK_Shift, MapVirtualKey(VK_Shift, 0), KEYEVENTF_KEYUP, 0)
     end;
end;



KLAVYEDEN BİR TUŞA BASMA ETKİSİ VERME

// herhangi bir harf basma :
keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); // C harfi basıldı
keybd_event(Ord('c'), MapVirtualKey(Ord('c'), 0), 0, 0); // c harfi basıldı

// Kontrol tuşunu basma :
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);



// BUNU NEREDE KULLANABİLİRSİNİZ ?
// mesela bir edit arama kutusunun altında bir grid arananları listelemek için,

// grid'in keypress olayına;

Edit1.SetFocus;
keybd_event(Ord(Key), MapVirtualKey(Ord(Key), 0), 0, 0);

// yazarsanız grid üzerindeyken basılan tuş editin içine yazılır. böylece
// kullanıcı mouse ile edite gelip, aradığı metni tekrar yazmak zorunda kalmaz
// kesintisiz olarak kullanmaya devam eder.

[/size]

{ Virtual Keys, Standard Set }

VK_LBUTTON = 1;
VK_RBUTTON = 2;
VK_CANCEL = 3;
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
VK_BACK = 8;
VK_TAB = 9;
VK_CLEAR = 12;
VK_RETURN = 13;
VK_SHIFT = $10;
VK_CONTROL = 17;
VK_MENU = 18;
VK_PAUSE = 19;
VK_CAPITAL = 20;
VK_KANA = 21;
VK_HANGUL = 21;
VK_JUNJA = 23;
VK_FINAL = 24;
VK_HANJA = 25;
VK_KANJI = 25;
VK_CONVERT = 28;
VK_NONCONVERT = 29;
VK_ACCEPT = 30;
VK_MODECHANGE = 31;
VK_ESCAPE = 27;
VK_SPACE = $20;
VK_PRIOR = 33;
VK_NEXT = 34;
VK_END = 35;
VK_HOME = 36;
VK_LEFT = 37;
VK_UP = 38;
VK_RIGHT = 39;
VK_DOWN = 40;
VK_SELECT = 41;
VK_PRINT = 42;
VK_EXECUTE = 43;
VK_SNAPSHOT = 44;
VK_INSERT = 45;
VK_DELETE = 46;
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
VK_LWIN = 91;
VK_RWIN = 92;
VK_APPS = 93;
VK_NUMPAD0 = 96;
VK_NUMPAD1 = 97;
VK_NUMPAD2 = 98;
VK_NUMPAD3 = 99;
VK_NUMPAD4 = 100;
VK_NUMPAD5 = 101;
VK_NUMPAD6 = 102;
VK_NUMPAD7 = 103;
VK_NUMPAD8 = 104;
VK_NUMPAD9 = 105;
VK_MULTIPLY = 106;
VK_ADD = 107;
VK_SEPARATOR = 108;
VK_SUBTRACT = 109;
VK_DECIMAL = 110;
VK_DIVIDE = 111;
VK_F1 = 112;
VK_F2 = 113;
VK_F3 = 114;
VK_F4 = 115;
VK_F5 = 116;
VK_F6 = 117;
VK_F7 = 118;
VK_F8 = 119;
VK_F9 = 120;
VK_F10 = 121;
VK_F11 = 122;
VK_F12 = 123;
VK_F13 = 124;
VK_F14 = 125;
VK_F15 = 126;
VK_F16 = 127;
VK_F17 = 128;
VK_F18 = 129;
VK_F19 = 130;
VK_F20 = 131;
VK_F21 = 132;
VK_F22 = 133;
VK_F23 = 134;
VK_F24 = 135;
VK_NUMLOCK = 144;
VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
VK_LSHIFT = 160;
VK_RSHIFT = 161;
VK_LCONTROL = 162;
VK_RCONTROL = 163;
VK_LMENU = 164;
VK_RMENU = 165;
VK_PROCESSKEY = 229;
VK_ATTN = 246;
VK_CRSEL = 247;
VK_EXSEL = 248;
VK_EREOF = 249;
VK_PLAY = 250;
VK_ZOOM = 251;
VK_NONAME = 252;
VK_PA1 = 253;
VK_OEM_CLEAR = 254;

z

Çöztürk çok teşekkürler son bilgiler bir şekilde işimize yarayacak.

Bu arada benim sorumun cevabı çok basitmiş.

Seçilmesi istenen Edit alanının adı Tedit5 olsun.

TEdit5.Setfocus; demek yetiyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

T kısmı tehlikeli, Edit5.Setfocus; denmeli galiba :) ;

z

Açıkçası edit alanına isim verirken Tedit5 i kafadan salladım. Ama tehlike ile neden bahsettiğinizi anlamadım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

tam detayını ben de anlamadım fakat Tedit dediğinizde bu onun tipi oluyor galiba. mesela program çalışırken yeni bir edit oluşturabilirsiniz.

var
yeni:Tedit;

begin

yeni:=Tedit . create;


Yani isim olarak Tedit5 değilde Tedit deseniz olmazdı.