Yayınlama: 7 Ağustos 2020
Bilgisayarda girdi birimi olarak kullanılan donanımlardan en çok kullanılanı
klavye ve faredir.
QuickBasic ile kullanıcının klavye girdisi
sağlayabileceği gibi klavye tuş vuruşları da takip edilip kontrol edilebilir.
Klavye ile veri girişi
INPUT, LINE INPUT
Klavyeden girilen karakterleri değişken(ler)e aktarır. Ayrıntı için:
3: Değişkenlere veri aktarma
INKEY$
Klavyeden tuşlara basıldığında tuş bilgileri klavye ara belleğine(tampon)
aktarılır.
PLAY komutunda olduğu gibi tampondaki sıraya göre tuş vuruşları bilgisayara
iletilerek değerlendirilir.
Tamponda bekleyen bir karakter yoksa INKEY$ boş olacaktır.
Tek karakterlik bir dize, klavyeden okunan gerçek tuş karakteri içerirken, iki
karakterli bir dize, ilk karakteri 0 olan genişletilmiş bir kodu belirtir.
F1-F12, imleç yön tuşları, home, end... Nümerik klavye tuşları... vb.
Tek başına basılan CTRL, ALT, SHIFT, CAPS LOCK, NUM LOCK, SCROLL LOCK
tuşlarını algılamaz.
Aşağıdaki kodları deneyin.
' Bir tuşa basmasını bekletme DIM mesaj AS STRING CLS mesaj = "Devam etmek için bir tuşa basınız" PRINT mesaj WHILE INKEY$ = "": WEND PRINT mesaj DO: LOOP UNTIL INKEY$ <> "" PRINT mesaj DO: LOOP WHILE INKEY$ = "" PRINT mesaj DO UNTIL INKEY$ <> "": LOOP PRINT mesaj DO WHILE INKEY$ = "": LOOP PRINT mesaj a$ = INPUT$(1) PRINT mesaj SLEEP PRINT "Son"
Örnek 2:
' Klavyeden basılan tuşu, karakterini ve karakter kodunu yazar ' Tek başına CTRL ALT SHIFT tuşlarını algılamaz ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com DO a$ = INKEY$ IF a$ <> "" THEN g = LEN(a$) PRINT "TUŞ: "; a$, "KOD:"; IF g = 2 THEN PRINT ASC(LEFT$(a$, 1)); ASC(RIGHT$(a$, 1)) ELSE PRINT ASC(a$) END IF END IF LOOPÖrnek 3:
' Yön tuşları ile basit yılan oyunu ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com DEFINT A-Z CONST sol = "K", sag = "M", yuk = "H", asa = "P" krktr$ = CHR$(219) satir = 12 sutun = 40 CLS COLOR 14 LOCATE satir, sutun, 1, 0, 8 DO c$ = INKEY$ IF LEN(c$) = 2 THEN SELECT CASE RIGHT$(c$, 1) CASE sol sutun = sutun - 1 IF sutun < 1 THEN sutun = 1 CASE sag sutun = sutun + 1 IF sutun > 80 THEN sutun = 80 CASE yuk satir = satir - 1 IF satir < 1 THEN satir = 1 CASE asa satir = satir + 1 IF satir > 25 THEN satir = 25 END SELECT LOCATE satir, sutun, 0 PRINT krktr$; END IF LOOP UNTIL c$ = CHR$(27)
Örnek 4: Yön tuşları ile kontrol edilen menü örneği
' Yön tuşları ile kontrol edilen menü örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com DEFINT A-Z DIM eleman(6) AS STRING CONST azr = 4 'aktif menü elemanı zemin rengi 'menü elamanlarını aktar FOR n = 0 TO 6 READ eleman(n) NEXT CLS 'Zemin hazırla SCREEN 0, , 2, 0 COLOR 7, 1 FOR n = 1 TO 2000: PRINT CHR$(178); : NEXT SCREEN 0, , 0, 0 'Hazır zemini ekrana aktar PCOPY 2, 0 DO r = RND * 12 + 2 'menü satır c = RND * 40 + 1 'menü sütun me = menu(eleman(), r, c, azr) 'menü elemanı PCOPY 2, 0 'Hazır zemini ekrana aktar LOCATE 1, 1 PRINT "Seçilen menü elemanı: "; eleman(me); SELECT CASE me CASE 0 'yeni '.. CASE 1 'Aç '.. CASE 2 'Kaydet '.. '.. CASE 6 'çıkış EXIT DO END SELECT LOOP DATA Yeni,Aç,Kaydet,Farklı kaydet...,Yazdır,Baskı Önizleme,Çıkış FUNCTION menu (elmn() AS STRING, r, c, azr) 'r: menü sol üst köşe satır no 'c: menü sol üst köşe sütun no 'azr: aktif menü elemanı zemin rengi YukOk$ = CHR$(0) + "H" 'Yukarı yön tuşu AsaOk$ = CHR$(0) + "P" 'Aşağı yön tuşu mes = UBOUND(elmn) - LBOUND(elmn) 'menü eleman sayısı 'en çok karakterli elemanın uzunluğunu bul FOR n = 0 TO mes euz = LEN(elmn(n)) 'eleman uzunluğu IF euz > g THEN g = euz 'eleman uzunluğu g den büyükse NEXT COLOR 0, 7 'PCOPY 0, 1 'Çerçeve çiz LOCATE r, c PRINT CHR$(218); STRING$(g + 2, 196); CHR$(191) LOCATE r + mes + 2, c PRINT CHR$(192); STRING$(g + 2, 196); CHR$(217) FOR n = 0 TO mes LOCATE r + n + 1, c PRINT CHR$(179); SPACE$(g + 2); CHR$(179) NEXT 'Gölge dikey FOR a = r + 1 TO r + mes + 2 c1 = c + g + 4 z1$ = CHR$(SCREEN(a, c1)) 'zemin karakterini al z2$ = CHR$(SCREEN(a, c1 + 1)) COLOR 8, 0 LOCATE a, c1: PRINT z1$ 'zemin karakterini yaz LOCATE a, c1 + 1: PRINT z2$ NEXT 'Gölge yatay FOR b = c + 2 TO c + g + 5 z1$ = CHR$(SCREEN(a, b)) COLOR 8, 0 LOCATE a, b: PRINT z1$ NEXT GOSUB myaz 'menü elemanlarını yaz DO k$ = INKEY$ SELECT CASE k$ CASE YukOk$ akmen = akmen - 1 'aktif menü elemanı numarası IF akmen < 0 THEN akmen = mes CASE AsaOk$ akmen = akmen + 1 IF akmen > mes THEN akmen = 0 CASE CHR$(13) 'enter menu = akmen 'aktif menü elemanı numarasını ver 'PCOPY 1, 0 EXIT FUNCTION END SELECT IF k$ = YukOk$ OR k$ = AsaOk$ THEN GOSUB myaz LOOP myaz: FOR n = 0 TO mes IF n = akmen THEN 'aktif menü elemanı numarası COLOR 15, azr ELSE COLOR 0, 7 END IF LOCATE r + n + 1, c + 2 PRINT elmn(n) + STRING$(g - LEN(elmn(n)), 32) NEXT RETURN END FUNCTION
Bir başka menü örneği:
INPUT$(n)
Klavyeden n sayısı kadar karakter girişini bekler. a$=INPUT$(1) satırı
a$ = INKEY$ satırına benzer. INPUT$ tuş vuruşunu bekler, INKEY$ ise beklemez.
a$ = INPUT$(3) PRINT a$
KEY n
Kullanımı:
KEY n, string_ifadeKlavye fonksiyon tuşlarına string değerler atar. Atanan fonksiyon tuşuna basıldığında string değerlerde belirtilen tuşlara basılmış gibi olur.
Örnek 1:
CLS KEY 1, CHR$(219) 'F1 tuşuna 219 karakteri atandı KEY 2, CHR$(24) 'F2 tuşuna 24 karakteri atandı KEY 3, CHR$(13) 'F3 tuşuna ENTER karakteri atandı PRINT "F1-F3 deneyiniz" INPUT "Test: ", a$ PRINT a$n : Fonksiyon tuşu numarasıdır.
n için verilecek değerler:
1-10: F1-F10 fonksiyon tuşları
11: Yukarı yön tuşu(yukarı ok)
12: Sol yön tuşu
13: Sağ yön tuşu
14: Aşağı yön tuşu
15-25: Kullanıcı tanımlı tuşlar
30-31: F11-F12 fonksiyon tuşları
string_ifade: 15-25 dışındaki tüm n değerleri için tuşa
basıldığında girilen string dizedir.
15-25 için kullanılacak string_ifadesi sözdizimine sahiptir.
CHR$(klavye işareti) + CHR$(tarama kodu) şeklinde olmalıdır.
klavye işareti(keyboard flag): CTRL, ALT, SHIFT, CAPS LOCK, NUM LOCK
tuşlarının ASCII karakter karşılığı olmadığı için klavye işareti olarak bu
tuşların değerleri kullanılır.
Klavye işareti değerleri:
0: işaret yok. Tek tuş kullanımı
1: Sol Shift
2: Sağ Shift
4: Ctrl
8: Alt
32: Num Lock
64: Caps Lock
128: Genişletilmiş tuşlar.
Birden çok fonksiyon tuşu beraber basıldığını takip etmek için tuş
değerleri toplanır.
Örneğin: CTRL+SOL SHIFT için 4 + 1 = 5
Örnek 2:
KEY 15, CHR$(4) + CHR$(13) ' CTRL+ENTER KEY 15, CHR$(4) + CHR$(1) ' CTRL+ESC KEY 16, CHR$(128) + CHR$(72) ' Yukarı ok KEY 18, CHR$(128) + CHR$(80) ' Aşağı ok
tarama kodu: Her bir klavye tuşuna ait koddur. Kod listesi için
QuickBasic menüsü Help / Contents sayfasında
Keyboard Scan Codes sayfasını açın.
Çevrimiçi sayfa
Örnek 3:
' Klavye kısayolu kullanım örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com CLS PRINT "Num lock kapatın." PRINT "Kaydet: CTRL+S" PRINT "Yardım: F1" PRINT "Çıkış: ESC" ON KEY(1) GOSUB yardim 'F1 tuşu basıldığında KEY(1) ON KEY 15, CHR$(4) + CHR$(31) 'CTRL+S KEY(15) ON ON KEY(15) GOSUB kaydet 'CTRL+S tuşlarına basıldığında KEY 16, CHR$(0) + CHR$(1) 'ESC KEY(16) ON ON KEY(16) GOSUB son 'ESC tuşuna basıldığında DO: LOOP 'Sonsuz döngü kaydet: n = n + 1 PRINT "Kaydedildi... Sayı:"; n RETURN yardim: PRINT "Program yardımı: ...." RETURN son: PRINT "Program sonlandı !" END RETURN
KEY(n) ON | OFF | STOP
KEY(n) ON: n ile tanımlanan fonksiyon tuşu kullanımda olur.
KEY(n) OFF: n ile tanımlanan fonksiyon tuşu kullanım dışı olur
KEY(n) STOP: n ile tanımlanan fonksiyon tuşu kullanımı duraklatılır.
KEY(n) ON ile tekrar aktif edilir.
KEY LIST
Fonksiyon tuşlarını ve KEY n ile fonksiyon tuşlarına atanan string
ifadeleri listeler.
KEY ON
Ekranın en alt satırında fonksiyon tuş numaralarını ve atanan string
ifadeleri gösterir. KEY(n) ON ile karıştırmayın. Farklı işleve sahiptir.
KEY OFF
Ekranın en alt gösterilen fonksiyon tuşlarını gizler. KEY(n) OFF ile
karıştırmayın.
Örnek 1:
' Fonksiyon tuşları kullanım örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com CLS KEY 1, "Yardım" KEY 2, "Yeni" KEY 3, "Aç" KEY 4, "Kaydet" KEY 5, "Yazdır" KEY 7, "Gizle" KEY 8, "Göster" KEY 10, "Çıkış" KEY LIST 'Fonksiyon tuşlarını listeler KEY ON ON KEY(1) GOSUB yardim 'F1 e basıldığında KEY(1) ON ON KEY(2) GOSUB yeni 'F2 ye basıldığında KEY(2) ON ON KEY(7) GOSUB gizle 'F7 ye basıldığında KEY(7) ON ON KEY(8) GOSUB goster 'F8 e basıldığında KEY(8) ON ON KEY(10) GOSUB son 'F10 a basıldığında KEY(10) ON DO: LOOP 'sonsuz döngü END yardim: CLS : PRINT "Yardım sayfası" RETURN yeni: CLS : PRINT "Yeni dosya" RETURN gizle: KEY OFF RETURN goster: KEY ON RETURN son: PRINT "Program sonlandı !" FOR n = 1 TO 10 KEY n, "" KEY(n) OFF NEXT END RETURN
ON KEY(n) GOSUB
Bir olay gerçekleştiğinde belirtilen alt rutini çalıştıran QuickBasic
komutlarından biriside ON KEY'dir. Diğerlerinin listesini görmek için
editörde imleç ON üzerinde iken F1 tuşuna basınız.
Adından da anlaşılacağı gibi ON KEY, n ile belirtilen tuşa
basıldığında belirtilen alt rutin çalıştırılır.
Kullanımı:
ON KEY(n) GOSUB {satır etiketi | satır numarası}
GOSUB'dan sonra çalıştırılacak alt rutinin satır numarası veya
etiketi belirtilir.
Örnek 1:
' Fonksiyon tuşları kullanım örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com CLS DATA 1, "Yardım", 2, "Yeni", 3, "Aç" DATA 4, "Kaydet", 5, "Yazdır", 10, "Çıkış" FOR n = 1 TO 6 READ k READ m$ KEY k, m$ KEY(k) ON NEXT ON KEY(1) GOSUB yardim ON KEY(2) GOSUB yeni ON KEY(3) GOSUB ac ON KEY(4) GOSUB kaydet ON KEY(5) GOSUB yazdir ON KEY(10) GOSUB son KEY LIST DO: LOOP END yardim: 'F1 PRINT "Yardım" RETURN yeni: 'F2 PRINT "Yeni" RETURN ac: 'F3 PRINT "Aç" RETURN kaydet: 'F4 PRINT "Kaydet" RETURN yazdir: 'F5 PRINT "Yazdır" RETURN son: 'F10 PRINT "Son" FOR n = 1 TO 10 KEY n, "" KEY(n) OFF NEXT END RETURN
INP
Kullanımı:
INP(port)
Bilgisayarın giriş/çıkış(I/O = Input/Output) bağlantı
noktasından(port) okunan bayt değerini verir.
Klavye donanımı da bir G/Ç bağlantısı oluşturduğundan klavyenin port
adresinden klavyeden basılan tuşun durumu hakkında bilgi alınabilir. Tek
olarak basılan CTRL, SHIFT, ALT tuşlarını da algılar.
Klavye port adresi &H60'dır.
INP ve OUT komutu donanıma doğrudan erişim sağladığı için
dikkatli kullanmak gerekir.
Örnek 1:
' INP fonksiyonu örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com CLS PRINT "Basılan tuş tarama kodu:" DO LOCATE 2: PRINT USING "###"; INP(&H60) '96 LOOPÖrnek 2:
' INP fonksiyonu örneği ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com DIM kod AS INTEGER CLS PRINT "Tuş basılı iken kod...:" PRINT "Tuş bırakıldığında kod:"; DO kod = INP(&H60) 'klavye portu: 96 IF kod < &H80 THEN '128 COLOR 10: LOCATE 1, 24: PRINT kod END IF IF kod > &H7F THEN '127 COLOR 12: LOCATE 2, 24: PRINT kod END IF LOOPÖrnek 3:
' INP fonksiyonu ile tuşa basılma durumu ' ©2020 Mesut Akcan ' mesutakcan.blogspot.com DIM kod AS INTEGER CLS DO kod = INP(&H60) 'klavye portu: 59 IF kod < 128 THEN COLOR 10: b$ = " basıldı..." ELSE COLOR 12: b$ = " bırakıldı..." END IF LOCATE 1, 1 SELECT CASE kod CASE 72, 200: PRINT "Yukarı ok"; b$ CASE 29, 157: PRINT "CTRL"; b$ CASE 56, 184: PRINT "ALT"; b$ CASE 42, 170: PRINT "Sol SHIFT"; b$ CASE 28, 156: PRINT "ENTER"; b$ CASE 30, 158: PRINT "A"; b$ CASE 1: EXIT DO END SELECT LOOP
Önceki Bölüm: 24: Ses, Müzik | Sonraki Bölüm: 26: Olay ile dallanma |
hocam iyi günler,
YanıtlaSilQ basic'te geri alma tuşu var mı ?
Editör için soruyorsanız var ama DOSBOX'ta sorunlu. Virtualbox altında çalışıyor
Sil