Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Delphi => Konuyu başlatan: z - 08 Haziran 2005, 11:42:23

Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: z - 08 Haziran 2005, 11:42:23
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?
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: cozturk - 08 Haziran 2005, 11:55:17
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
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: z - 08 Haziran 2005, 12:06:03
Çö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.
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: cozturk - 08 Haziran 2005, 12:12:24
//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
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: z - 08 Haziran 2005, 12:35:20
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?
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: cozturk - 08 Haziran 2005, 13:06:02
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;
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: z - 08 Haziran 2005, 13:40:23
Çö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.
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: cozturk - 08 Haziran 2005, 13:44:48
T kısmı tehlikeli, Edit5.Setfocus; denmeli galiba :) ;
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: z - 08 Haziran 2005, 13:48:16
Açıkçası edit alanına isim verirken Tedit5 i kafadan salladım. Ama tehlike ile neden bahsettiğinizi anlamadım.
Başlık: Delphi' de herhangi bir komponenti seçili hale getirmek
Gönderen: cozturk - 08 Haziran 2005, 14:48:48
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ı.