Kalkulator w C# - kilka pytań dotyczących jego obsługi

0

Jestem dość początkujący, jeśli chodzi o C# (albo raczej ogólnie w programowaniu).
W ramach ćwiczeń próbuję sobie napisać kalkulator. Mam już normalne, działające guziczki odpowiadające za liczby i konkretne działania. Dalej chcę rozbudować parę rzeczy.
Obecnie natknąłem się na 4 problemy:

  1. Jak zaczytać wciśnięcie klawisza? W sensie, zablokowałem textboxa, żeby użytkownik nie wklepał mi tam żadnych liter ani nic takiego. Chciałbym, żeby jednak aplikacja wykrywała wciśnięcia cyfr i wrzucała je do textboxa (bez konieczności zaznaczania go).
    Próbowałem googlować, ale wszędzie jest jak zaczytywać wciśnięte klawisze gdy textbox jest zaznaczony do pisania.
    Na razie mam coś takiego (jeśli chodzi o te OR albo AND w pierwszym IF, to różne kombinacje próbowałem, też dla jednego, konkretnego klawisza):
 private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 || e.KeyCode == Keys.NumPad0 && e.KeyCode == Keys.NumPad9)
            {
                if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
                {
                    if (textBox1.Text == "0")
                    {
                        textBox1.Text = "";
                    }
                    textBox1.Text = (textBox1.Text + "1");
                }
            }
        }

Niestety program w ogóle nie reaguje na klikanie czegokolwiek.

  1. Operuję na float'ach, więc użytkownik może wpisywać przecinki. Problem polega na tym, że może ich wpisać ile chce, a to już nie jest pożądane.

Chciałem dodać IF'a typu "jeśli jest przecinek, to nie rób nic". I tutaj dwa pytania - da się znaleźć konkretny znak w stringu? Jedyne co wyczytałem do tej pory, to możliwość znalezienia indexu tego znaku w stringu. Wtedy ten IF brzmiałby jakoś "jeśli zmienna.indeks.przecinka > 0, nie rób nic". Zadziała to tak? I drugie pytanie - jak zrobić, żeby IF nie wykonywał nic? Po prostu pusty?

  1. Chciałem zrobić menu kontekstowe. Wiecie, u góry, zaraz pod paskiem programu. Typu "plik, edycja" etc., ale niezbyt ogarniam jak to ma wyglądać. Próbowałem dodać MenuContextStrip, ale po uruchomieniu nigdzie go nie ma. Może coś pomijam?

  2. Dodałem też checkox pozwalający zapisywać nasze działania do pliku. Chciałem też dodać możliwość edycji lokacji/nazwy pliku (z poziomu wspomnianego menu kontekstowego, ale tutaj to nie ma znaczenia).
    Na razie mam:

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@”D:\textfile.txt”, true))

I to działa fajnie.
Niestety nie wiem jak zrobić, żeby ścieżka do pliku była wywoływana z innego miejsca, które może edytować użytkownik. Próbowałem:

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@variable, true))
variable = “\”D:\\textfile.txt\””

Ale wtedy wywala mi błąd (nieobsługiwany wyjątek).

Jakieś pomysły?
Z góry dzięki za pomoc!

dodanie znaczników <code class="csharp"> - furious programming

1

Odblokuj ten textbox i działaj na zdarzeniu KeyPress, tu masz link http://stackoverflow.com/questions/463299/how-do-i-make-a-textbox-that-only-accepts-numbers

jak zrobić, żeby IF nie wykonywał nic?

Nie robić tego ifa wcale, po co Ci w ogóle coś takiego?

0

@dam1an:

  1. Napisałem - na odblokowanym textboxie użytkownik mógłbym wklepać znaki różne od cyfr, więc musiałbym dać sporą obsługę tego typu zdarzeń.

  2. Również napisałem po co mi pusty IF. Ma być coś typu: "If string zawiera znak"{ nie rób nic} else {wpisz znak}

0

Co do menu, dodajesz ContextMenuStrip i wpisujesz jakieś wartości w formie w "Type Here".

  1. Napisałem - na odblokowanym textboxie użytkownik mógłbym wklepać znaki różne od cyfr, więc musiałbym dać sporą obsługę tego typu zdarzeń.

Przyjrzyj się linkowi, tam jest to już obsłużone

  1. Również napisałem po co mi pusty IF. Ma być coś typu: "If string zawiera znak"{ nie rób nic} else {wpisz znak}

! przed wyrażeniem w ifie neguje je czyli

if(!text.Contains("a"))//albo (text.Contains("a")==false)
{
}

Co do ostatniego pytania:

using (System.IO.StreamWriter file = new System.IO.StreamWriter(myTextBox.Text, true))
0

@dam1an W menu to zrobiłem, powpisywałem różne wartości i nadal go nie widzę.
Resztę Twoich porad sprawdzę i zobaczę czy zadziałało. Dzięki.

@gumiś niezbyt rozumiem czego to się ma tyczyć? Forum chyba do tego jest, żeby zapytać gdy czegoś nie rozumiem z kursów.

0

Sorry, to jest MenuStrip

0

@dam1an Ok, menu działa, dzięki wielkie!
Z tym IF, to dziwne, bo miałem coś podobnego i nie działało. Ale może dlatego, że wcześniej tam zmiennej używałem, a nie tak jak podałeś. Dzięki x2!
Co do ostatniego - wtedy to zaciąga czysto z textboxa to, co wpisze użytkownik. A nie będzie przecież wpisywał @"lokalizacja". Dlatego chciałem to zrobić przy użyciu zmiennej.

0

Jeśli user wpiszę do textboxa D:/folder.plik.txt to powinno zadziałać, nie potrzebna małpa. Jeśli chcesz żeby user wpisał tylko nazwę pliku to niestety musisz dodać coś w tym stylu: @"D:/folder/" + textbox.Text + ".txt"

0
Zygfryd napisał(a):

@dam1an Ok, menu działa, dzięki wielkie!
Co do ostatniego - wtedy to zaciąga czysto z textboxa to, co wpisze użytkownik. A nie będzie przecież wpisywał @"lokalizacja".

http://msdn.microsoft.com/en-us/library/ms228362.aspx

0

Teraz dopiero zrozumiałem co ty próbowałeś zrobić variable = “\”D:\\textfile.txt\””
Jako ścieżkę do pliku nie podajesz "ścieżka" tylko po prostu ścieżka. Te cudzysłowy to są po prostu znaki informujące kompilator że to co jest po między nimi ma traktować jako tekst.

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