Forum: D Programlama Dili RSS
Klavyeden tuş okutma
Avatar
esatarslan52 (Moderatör) #1
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Klavyeden tuş okutma
Kullanıcı "e" veya "E" 'yi seçtiği müddetçe döngünün devam etmesini istiyorum ama bir türlü başaramadım. İlk seferde seçimi yazıp enter'e bastığımda ikinci kez tuş okuma yapmadan direk olarak "default" etiketine geçiş yapıyor.Ben sorunun kalvyeden tuş okutmakla ilgili olduğunu düşünüyorum. Ama bir türlü çözüme ulaşamadım :(
import std.stdio;
import std.cstream;
 
int main()
{
    char tusAl;
 
    do
    {
 
        writeln("NesneEklendi...");
        writeln("Yeni Bir Nesne Oluşturmak İstermisiniz(E/H)?");
        din.read(tusAl);
//        din.readf(&tusAl);
//        tusAl = din.getc();
 
        switch(tusAl)
        {
            case 'e','E':writeln("e ye bastı");break;
            case 'h','H':break;
            default:writeln(tusAl);break;
        }
 
    }while(tusAl =='e' || tusAl =='E');
 
    return 0;
}

din.read(),din.readf(),din.getc() Digitalmarsın sitesinden tuş okutma ile ilgili bu fonksiyonları buldum.
Mesela din.readf() kullanarak tuş okuttuğumda 2 kez giriş yapmama izin veriyor ikincisinden sonra yine kendisi otomatik olarak önce "default" etiketine geçiyor ve doWhile döngüsünden çıkıyor.
Mengu (Moderatör) #2
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
bunun sebebini buldum zannediyorum. ilk sordugunuz vakitte gelen cevabi bastirdiktan ve sonraki soruyu sorduktan sonra char'in degeri sifirlaniyor dolayisiyla do while dongunuz calismiyor. ha ben olsaydim bunu do - while icinde degil de recursive method olarak yapardim su sekilde:

import std.stdio;
import std.cstream;
 
void main()
{
    soruYaz();
}
 
void soruYaz()
{
    char[] tusAl;
    writefln("Yeni bir nesne olusturmak ister misiniz?");
    tusAl = din.readLine();
    if (tusAl.length > 0)
    {
        if (tusAl[0] == 'e' || tusAl[0] == 'E')
        {
            writeln("e tusuna bastiniz.");
            soruYaz();
        }
        else
        {
            return;
        }
    }
}
http://www.mengu.net - some kind of monster
Bu mesaj Mengu tarafından değiştirildi; zaman: 2009-08-08, 20:57.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Olayın içinde satır başı karakter(ler)i de var. Alınan tuşu yazdırırsak görünüyor:

    din.read(tusAl);
    writefln("*** karakter: %d", tusAl);

esatarslan52, tuşa basılmasından bahsederken Enter'a basmadan mı demek istiyordun? Öyleyse olanaksız, çünkü D'nin klavye diye bir aygıttan haberi yok: o art arda karakterlerin okunup yazıldığı giriş çıkış akımlarını biliyor.

Programı çalıştıran ortam da Enter'a basılana kadar (veya ara belleği dolana kadar) programı basılan karakterlerden haberdar etmiyor.

Bunun için ncurses gibi bir kütüphane kullanmak gerek.

Ali
Mengu (Moderatör) #4
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Olayın içinde satır başı karakter(ler)i de var. Alınan tuşu yazdırırsak görünüyor:

    din.read(tusAl);
    writefln("*** karakter: %d", tusAl);

esatarslan52, tuşa basılmasından bahsederken Enter'a basmadan mı demek istiyordun? Öyleyse olanaksız, çünkü D'nin klavye diye bir aygıttan haberi yok: o art arda karakterlerin okunup yazıldığı giriş çıkış akımlarını biliyor.

Programı çalıştıran ortam da Enter'a basılana kadar (veya ara belleği dolana kadar) programı basılan karakterlerden haberdar etmiyor.

Bunun için ncurses gibi bir kütüphane kullanmak gerek.

Ali

ya da dwt ile textbox yapacaksin, textbox'a event atayacaksin ve oyle yapacaksin. :D
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
esatarslan52, bilgiyi Mengu buldu; ben de programı yazdım:

  http://ddili.org/forum/post/222

dwt ile de başkası yapsın! :-p

Ali
Mengu (Moderatör) #6
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
ustad tebrikler. harikasin! :)

merak ettigim bir sey var, c ya da c++ kutuphaneleri kullanmaya gerek kalmadan, d'nin keyboard eventlerini destekleme durumu yok mu? mesela c# ile yapacak olsaydik bunu KeyEventArgs ile rahat ve kisa bir bicimde halledebilirdik.
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
C mantığını kullanan dillerde klavye event'leri konusunda hiçbir şey yapamayız. Çünkü dil'de klavye diye bir kavram yoktur. Eğer varsa, klavye programın girişine bir akım gibi bağlanır. Bu ilgisizliğin nedeni, C'nin taşınabilir olmayı amaçlamasıdır. Klavyeyi şart koşmayınca da klavyesi olmayan ortamlarda da çalışabilmiştir. Örneğin bir göçmen kuşun sırtına takılan bir izleme cihazının klavyesi yoktur... :)

Yani dilde klavye yok, akım var... C'de de yok, C++'da da yok... O yüzden bir kütüphane kullanmak şart.

ncurses herhalde doğrudan klavye sürücüsü ile iletişim kuruyordur; bilmiyorum...

Ali
Avatar
esatarslan52 (Moderatör) #8
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Yani dilde klavye yok, akım var... C'de de yok, C++'da da yok... O yüzden bir kütüphane kullanmak şart.
C deki gibi bir getch() fonksiyonu işimi görür aslında. Aşağıdaki linkte eleman std.c.stdio'modülünü ekleyerek getch() kullanmış ama aynı kodu ben çalıştıramadım.

http://www.digitalmars.com/d/archives/digitalmars/D/writef…
Avatar
esatarslan52 (Moderatör) #9
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
tusAl değişkenini char dizisi olarak tanımladıktan sonra readf() veya readLine() kullanarak istediğim şekilde çalışıyor. Yardımlarınız için teşekkürler.Bu arada recursive fonksiyon da çok iyi bir fikir  :cool:

import std.stdio;
import std.cstream;
 
int main()
{
    char[] tusAl;
 
    do
    {
        writeln("NesneEklendi...");
        writeln("Yeni Bir Nesne Oluşturmak İstermisiniz(E/H)?");
        din.readf(&tusAl);
//        tusAl = din.readLine();
 
        switch(tusAl[0])
        {
            case 'e','E':writeln(tusAl);break;
            case 'h','H':break;
        }
 
    }while(tusAl[0] =='e' || tusAl[0] =='E');
 
    return 0;
}
Mengu (Moderatör) #10
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
@esatarslan, niye takildin do while'a anlamadim. yardimci olabildiysem ne mutlu! :)

@cehreli, cok pis ezdin yalniz. :(
http://www.mengu.net - some kind of monster
Avatar
esatarslan52 (Moderatör) #11
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Mengu:
@esatarslan, niye takildin do while'a anlamadim. yardimci olabildiysem ne mutlu! :)
do while'a takıldığımıda nerden çıkardın  :huh:
Bir şeye takılacak olsaydım readf() veya read() fonksiyonlarına takılırdım ki aslında takıldım. Neden hala char dizisi tanımlamadan programın düzgün çalışmadığını anlamadım  :-/ .
Mengu:
ilk sordugunuz vakitte gelen cevabi bastirdiktan ve sonraki soruyu sorduktan sonra char'in degeri sifirlaniyor dolayisiyla do while dongunuz calismiyor.

read() de sıfırlamasının nedeni "abstract void read(out char x);" parametreyi "out" olarak kabul etmesi sanırım. Ama yinede sıfırlasa bile benim yeni bir giriş yapmamı beklemesi gerekmez mi?(veya yeni bir akımı).
Bu mesaj esatarslan52 tarafından değiştirildi; zaman: 2009-08-10, 13:21.
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Mengu, yanlış mı anlaşıldım? :( Ezme niyetim yok! :) Gülen surat unutmuşum diye mi? :)

Ali
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Asıl sorun olan '\n' karakterini süzerek şöyle çalıştırdım:

import std.stdio;
import std.cstream;
 
void main()
{
    char cevap;
 
    do {
        writeln("Nesne eklendi...");
 
        writeln("Yeni bir nesne oluşturmak ister misiniz (E/H)? ");
        cevap = cevap_al();
        
    } while((cevap == 'e') || (cevap == 'E'));
}
 
char cevap_al()
{
    char cevap;
 
    do {
        din.read(cevap);
 
        // Bu da çalısıyor:
        // cevap = din.getc();
    } while(cevap == '\n');
 
    return cevap;
}

Ali
Mengu (Moderatör) #14
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
ben '\n' olarak degil de '\0' olarak denemistim, olmamisti haliyle. :D
http://www.mengu.net - some kind of monster
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 11:06:47 (UTC -08:00)