A więc zaczynamy na poważnie...
Ogólna koncepcja prostego kalkulatora zakłada wprowadzanie danych jedynie za pomocą kliknięć w odpowiedni klawisz, wprowadzanie za pomocą klawiatury na razie zostawiamy (nie będziemy robić wszystkiego na raz).
Zaczyniemy od prostej czynnośći. Po kliknięciu 1 chcemy aby na wyświetlaczu pojawiło się 1. Gdy drugi raz kliknięmy 1 to na wyświetlaczu będzie już 11, itp.
Zasada jest taka:
0 +1
![->](./images/smilies/013.gif)
1
1 +1
![->](./images/smilies/013.gif)
11
11 +1
![->](./images/smilies/013.gif)
11
Wszystko jest proste z wyjątkiem pierwszej sytuacji, gdy mamy zero, ale co to dla nas.
Do dzieła. Klikamy dwa razy w przycisk nr 1. Jeśli używacie tego samego programu co na początku, to wyświetli nam się procedure z ShowMessage('Witaj!'); (należy skasować tą linie). Jeśli jest to nowy program to zostanie utworzona procedura. Zanim coś napiszemy musimy sprawdzić jak nazywa się nasza kontrolka Edit (klikamy Edit na formie i odszukujemy Name w Object Inspector). U mnie jest to edtNumber (dla ułatwienie proponuję użyć tej samej nazwy w Waszym projekcie). Następnie wracamy do naszego zdarzenia (wystarczy dwa razy kliknąć w przycisk). Zaczniemy od prostej wersji, a mianowicie chcemy dopisać 1 na końcu wyświetlanego tekstu. Kod będzie wyglądał tak (na razie nie wpisujcie go):
Code: Select all
edtNumber.Text:=edtNumber.Text+'1';
Prawda, że nic skomplikowanego
![Question ??](./images/smilies/question.gif)
Teraz wpiszmy kod i wyjaśnimy co poszczególne element znaczą. Zaczynami od napisania
edt a następnie wciskamy Ctrl+Space (alternatywny zapis ^Space). Środowisko wyświetli mam listę istniejących kontrolek, obiektów i zmiennych, które zaczynają się od
edt. Na liście prawdopodobnie będzie tylko jedna pozycja edtNumber. Zatwierdzamy ją za pomocą Entera. Jak widać, wpisywanie długich nazw nie jest trudne i nawet nie trzeba ich pamiętać. Wystarczy, że wiemy od czego się zaczyna. Prawda, że użyteczne
Wpisaliśmy już
edtNumber, czyli nazwę naszej kontrolki. Teraz chcemy zmienić wyświetlany tekst. Jak już wspominałem, tekst w przypadku Edit przechowywany jest w polu Text. Musimy się do niego odwołać. Text jest składową kontrolki edtNumber, a w celu odwołania się do składowych używamy . (kropki). Tak więc wciskamy . (kropkę) Środowisko automatycznie wyświetli nam listę dostępnych właściwości. Aby nie bawić się w przewijanie listy wpisujemy jeszcze
te, co zawęzi wybór do jedej pozycji Text. Wciskamy Enter i mamy już wpisane:
Teraz przyjżyjmy się symbolowi := Jest to przypisanie wartości. Lewej stronie przypisywa jest wartość generowana przez prawą stronę, np x:=5 przypisze zmiennej x wartość 5. edtNumber.Text:='Test'; przypisze własności Text wartość tekstową 'Test' (dla przypomnienia w Pascalu wartości zmiennych tekstowych - string - wpisujemy w apostrofach). Oczywiście błędem będzie edtNumber.Text:=5; gdyż pole Text jest typu tekst (string) a nie liczbą (integer). Aby przypisać jakąś liczbę do zmiennej tekstowej możemy ją po prostu zapisać jako '5' albo użyć specjalnej funkcji konwertującej IntToStr(liczba), czyli w tym przypadku IntToStr(5). Wynik będzie taki sam, czyli '5'. Druga metoda (z IntToStr) jest bardziej uniwersalna.
Wracając do naszego kodu. Pod pole Text chcemy podpisać starą wartość + jedynkę na końcu. A więc odczytujemy starą wartość, czyli wpisujemy edtNumber.Text (używając ^Space dla wygody) a następnie dodajemy do tego '1'. W rezultacie otrzymujemy:
Code: Select all
edtNumber.Text:=edtNumber.Text+'1';
Bardziej uniwersalnym odpowiednikiem będzie:
Code: Select all
edtNumber.Text:=edtNumber.Text+IntToStr(1);
Oczywiście zamiast drugiego edtNumber.Text możemy wpisać np 'Ala ma kota' (w ramach ćwiczeń proponuje sprwadzić jaki będzie efekt) a zamiast 1 możemy użyj jakiejś zmiennej liczbowej (o czym później).
Proponuję skompilować program i sprwadzić jaki będzie efekt...
Otrzymamy 011111, co nas oczywiście nie zadowala
![:)](./images/smilies/001.gif)
Musimy to poprawić. Jak to rozwiązać
Bardzo prosto. Po prostu, jeśli wpisany tekst po przekonwerowaniu na liczbę jest równy 0 (czyli wpisane jest '0') to zamieniamy go na '1', a jeśli nie to dopisujemy do niego '1'. W tym celu użyjemy instrukcji warunkowej:
Code: Select all
if warunek
then akcja_gdy_warunek_jest_prawdziwy (bez średnika)
else akcja_gdy_warunek_jest_fałszywy;
która dla osób mających styczność z Pascalem nie jest niczym nowym. Musimy jedynie uzupełnić warunek i akcje. Dla przypomnienia jeśli akcja ma więcej niż jedną instrukcję to należy dopisać przed nią begin a po niej end:
Code: Select all
if warunek
then begin
akcja_1;
akcja_2;
end
else akcja;
Teraz uzupełnimy szablon. Zaczniemy od warunku. Musimy spradzić czy aktualna wartośc jest równa 0 (można cały ten problem rozwiązać inaczej, ale wybrałem tą wersję aby pokazać kilka ciekawych rzeczy). A więc oczytujemy aktualną wartość i porównujemy ją do '0' (porównanie tekstu)
można także skonwertować tekst na liczbę funkcją StrToInt i porównać do zera liczbowego, czyli:
Code: Select all
if StrToInt(edtNumber.Text)=0
i przy tym rozwiązaniu pozostaniemy. Dla przypomnienia := to podstawienie wartości, a = to porównanie (dla zainteresowanych w C/C++ jest odpowiednio = i !=).
Następnie napiszemy akcje dla podmieniania zera, będzie ona bardzo prosta
Code: Select all
then edtNumber.Text:=IntToStr(1)
oraz dla dopisanie jedynki (to co robilismy wcześniej)
Code: Select all
else edtNumber.Text:=edtNumber.Text+IntToStr(1);
Całość będzie wyglądała następująco:
Code: Select all
if StrToInt(edtNumber.Text)=0
then edtNumber.Text:=IntToStr(1)
else edtNumber.Text:=edtNumber.Text+IntToStr(1);
Skompilujce program i sprawdzcie czy działa...
Pozostaje dopisać takie same akcje dla pozostałych przycisków, co może być męczące. Jeśli ktoś chce to zrobić, to proszę bardzo, ja jestem na to zbyt leniwy
![Cool 8)](./images/smilies/cool.gif)
Dodatkowo kopiowanie kodu (większego niż jedna linijka) do różnych procedur jest mało efektywne, gdyż jeśli coś zmieniamy to musimy to zrobić 9 razy co nie jest wygodne. My rozwiążemy to lepiej, ale o tym napiszę gdy zrealizujecie powyższe ćwiczenie
[ Added: 2005-03-03, 19:00 ]
Znag wrote:ale jak klikam 2 razy na obramowanie, to pojawia się tylko okno z kodem
Reczywiście, sorry mój błąd. W starszym Delphi tak to działało, tutaj zmienili. Jednak nie stanowi to problemu, wystarczy odnaleźć w Object Inspektorze pole Picture i kliknąć ... (polecam przeglądać Object Inspektora, można znaleźć tam trochę ciekawych rzeczy).
PS. Odnosnie 9 przycisków, które mają właściwe ten sam kod, to chętnie wysłucham Waszych propozycji rozwiązania tego problemu i je skomentuje.