7 Ağustos 2020 Cuma

QuickBasic - 25: Klavye kullanımı

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$

Klavyede basılan bir tuşun bir veya iki baytlık bir dize(string) değerini verir.
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.

Örnek 1:
' 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_ifade
Klavye 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


Birçok programda klavye kısayoları kullanılır. Klavye kısayolları programın kullanımını kolaylaştırır, kullanım hızını arttırır. QuickBasic ile hazırladığımız programda klavye kısayollarını kullanmak için KEY n, KEY(n) ON ve ON KEY(n) kodlarını kullanabiliriz. Örnek 3'ü inceleyiniz.

Ö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

2 yorum:

  1. hocam iyi günler,
    Q basic'te geri alma tuşu var mı ?

    YanıtlaSil
    Yanıtlar
    1. Editör için soruyorsanız var ama DOSBOX'ta sorunlu. Virtualbox altında çalışıyor

      Sil