Czytanie z klawiatury

0

Piszę własny kalkulator w C#(Visual Studio 2008 Express). Potrzebuję, tak jak jest to rozwiązane w Microsoftowym kalkulatorze, bez klikania na TextBoxa który jest "ekranem" kalkulatora, móc wprowadzać na bieżąco liczby i znaki z klawiatury, np. włączam program i bez żadnego klikania od razu wpisuję liczby i znaki(+,- itp.)do działania.

Nie wiem również jak zrobić TextBox nadający się jako ten "ekran". Jeśli dam Enable = false, czcionka w polu jest szara, jeśli true, można po nim pisać(wyeliminowałem to przez ReadOnly) i je zaznaczać, to znaczy jest taka pionowa kreska jak przy pisaniu. Jak to rozwiązać?

EDIT: I jeszcze jeden problem. Do liczenia wybrałem zmienne double, ponieważ obsługują dużo miejsc po przecinku. Jednak nie przy mnożeniu dużych liczb całkowitych dają wyniki z przecinkami i z jakimś E+zależy od liczb, przez co nie mogę już nic zrobić z tą liczbą.

EDIT2: Dzieje się to podczas konwersji double do stringa. Double ma poprawną wartość, dopiero po konwersji szwankuje. Jak więc skonwertować double do stringa(lub double zapisać jako parametr Text TextBoxa)?

1
  1. Chodzi ci o zdarzenie keyPress? dodajesz je dla formy i masz wszystkie naciśnięte przez użytkownika klawisze do obsługi...

  2. Nie możesz użyć labela? Ew. dodać jakieś tło za niego?

  3. Ale o co chodzi bo nie rozumiem? :|

  4. Dałeś tyle informacji i kodu że wszystko jest jasne. Ale znajoma wróżka powiedziała że kiedy wychodzi np. 20.000000000032 to wina leży po stronie niedokładności w reprezentacji liczb zmiennoprzecinkowych (chyba jeden z najpopularniejszych błędów początkujących). Użyj Math.Round() albo sformatuj łańcuch ( .ToString( -parametry- ); - http://idunno.org/archive/2004/14/01/122.aspx )

0
blazej30 napisał(a)

bez klikania na TextBoxa który jest "ekranem" kalkulatora, móc wprowadzać na bieżąco liczby i znaki z klawiatury
Zdarzenie KeyPress formy

Nie wiem również jak zrobić TextBox nadający się jako ten "ekran". Jeśli dam Enable = false, czcionka w polu jest szara,
Ustaw BackColor na Window.</quote>

EDIT: I jeszcze jeden problem. Do liczenia wybrałem zmienne double, ponieważ obsługują dużo miejsc po przecinku. Jednak nie przy mnożeniu dużych liczb całkowitych dają wyniki z przecinkami i z jakimś E+zależy od liczb, przez co nie mogę już nic zrobić z tą liczbą.
Możesz zrobić, bo to jest poprawna forma liczby zmiennoprzecinkowej. Przykładowo 5e4 oznacza 5*10^4 czyli 50 000. Nic ci nie szwankuje. Więc jeżeli w konwersji otrzymujesz taką liczbę, to również możesz ją konwertować z powrotem na double (chyba że napisałeś jakąś własną kaleką konwersję).
Zauważ że na liczbach w takim formacie operuje zarówno windowsowy kalkulator jak i każdy kieszonkowy, a przynajmniej takie które kosztują więcej niż 10 zł.

0

Co do tego KeyPress, jak się z nim obchodzić, to znaczy po utworzeniu go jak coś z niego odczytywać(prosiłbym o jakiś kawałek przykładowego kodu).

BackColor ustawione na Window, samo pole białe, ale cyfry w nim cały czas szare.

Po prostu chcę aby najprostszym sposobem konwertować double do string, nie zmieniając jego zawartości, czyli bez kombinacji z "e". Aktualna konwersja wygląda tak:

textBox1.Text = Convert.ToString(wynik);

a chcę żeby w TextBoxie pojawiał się wynik bez żadnych kombinacji, da się to jakoś zrobić?

0

Co do KeyPressa to użycie jest proste, otwierasz zakladke pioruna w Designerze, dla formy, kilkasz dwa razy w wybrany event.
dostaniesz bazowo taka metode:

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            z parametru e mozesz wyciagnac znak
            label1.Text += e.KeyChar+" ";
        }

I jeszcze coś, ustaw właściwość formy KeyPreview na true, wtedy nawet gdy inna kontrolka bedzie miala focus, to i tak zdarzenie keyPress bedzie wywoływane dla Formy, a nie tylko dla kontrolki

0
...
KeyDown += new KeyEventHandler(Klawisz);
...
public void Klawisz(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.NumPad1)
            {...

Tak to sobie rozkombinowałem. Tylko mam następny problem znalazłem przyciski 0-9 z klawiatury numerycznej i zwykłej, znalazłem przecinek, znalazłem dodać(Key.Add) i podzielić(Key.Divide), ale nie mogę znaleźć odjąć i pomnożyć. Pod jaką nazwą się kryje?

0

Subtract? Multiply?
Bez podstaw angielskiego nic nie zdziałasz.

@down - ja wiem co można, ale to nie ja mam problem. ;P

1

@up - można sprawdzić np. podczas debugowania - naciskasz przycisk i wiesz który enum dostajesz...

@blazej - A nie lepiej zamiast KeyDown użyć KeyPress? :| dostałbyś od razu char zamiast bawić się z enumami... Wszystko tak samo tylko zamieniasz KeyDown na KeyPress. Ale co ja tam wiem.

0

@somekind - angielski znam dość dobrze, znaków(co dość dziwne) nikt mnie jakoś nie uczył.

Dzięki wszystkim za odpowiedzi, tylko proszę jeszcze o ostatni problem, jak przy konwersji double->string nie zmieniać treści zmiennej(to znaczy zachowywać wynik cyfrowy, bez "e").

0

bez e? wartosc mozesz sformatować odpowiednio metodą ToString();
przykladowo ToString("0.0000");

Ale proponowałbym zerknąć tutaj, Od razu lepiej się programuje, i wszystko trybisz i jarzysz.

;)

0
blazej30 napisał(a)

@somekind - angielski znam dość dobrze

No to gratuluję, bo ja to raczej słabo.

znaków(co dość dziwne) nikt mnie jakoś nie uczył.

Mnie też nie. Idąc tym tokiem myślenia, to chyba dziwne, że je znam.

Zresztą, dałbym sobie raciczkę uciąć, że add, subtract, divide i multiply to nazwy działań, a nie jakichś tam znaków.

jak przy konwersji double->string nie zmieniać treści zmiennej(to znaczy zachowywać wynik cyfrowy, bez "e").

Dość dobrze znasz angielski, więc pewno lepiej będzie Ci czytać w oryginale niż przetłumaczone przeze mnie:
http://idunno.org/archive/2004/14/01/122.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1