E-book
17.75
drukowana A5
64.58
drukowana A5
Kolorowa
102.74
Delphi w przykładach dla początkujących

Bezpłatny fragment - Delphi w przykładach dla początkujących

część 1


5
Objętość:
538 str.
ISBN:
978-83-8126-883-7
E-book
za 17.75
drukowana A5
za 64.58
drukowana A5
Kolorowa
za 102.74

Wstęp

Oddajemy do rąk Czytelnika pierwszą część książki poświęconej programowaniu w języku Delphi. Nie należy jej traktować jako podręcznika, ponieważ nią nie jest. Ideą przewodnią całego cyklu jest prezentacja możliwości Delphi na podstawie konkretnych rozwiązań. Poprzez nie Czytelnik zapoznaje się ze sztuką programowania.

Każdy zamieszczony w tej książce program jest szczegółowo opisany i skomentowany. W ten sposób Czytelnik sukcesywnie zapoznaje się z nowymi rozwiązaniami i poleceniami Delphi, które później będzie mógł wykorzystać w swoich projektach.

Do tej pory powstało wiele książek i artykułów na temat podstaw Delphi, także w internecie nie brakuje materiałów na ten temat. Niniejsza książka jest odpowiedzią na powstały nie-dosyt, jak owe teoretyczne wiadomości wykorzystać w praktyce. Wychodząc naprzeciw początkującym programistom, zawarliśmy w książce projekty ponad dwudziestu różnych programów komputerowych, jak najbardziej stroniąc od powtarzania podstawowej wiedzy na temat programowania, którą bez problemu można pozyskać, chociażby z internetu. Opierając się na tym założeniu, oczekujemy od Czytelnika posiadania podstawowej wiedzy na temat programowania w języku Delphi. Zakładamy więc, iż Czytelnik wie, w jaki sposób utworzyć nowy projekt programu, w jaki sposób umieścić potrzebne komponenty na formie głównej oraz, w jaki sposób zmieniać właściwości komponentów.

Większość zamieszczonych w książce projektów jest w formie surowej, bez estetycznych upiększeń. Naszym celem bowiem było przedstawienie działających rozwiązań, zadbanie o poprawną pracę programów. W ten sposób też każdy programista powinien pracować nad swoim projektem. Najpierw tworzymy surowy szkic programu, zabiegając wyłącznie o to, aby wszystkie jego procedury działały bez zarzutu. Na samym końcu dopiero zaczynamy zajmować się estetyką programu, nadając kolory, style itd. My pominęliśmy ten etap, wychodząc z założenia, iż dla programisty liczyć się będzie tylko działające rozwiązanie. Z uwagi na to, iż o gustach się nie dyskutuje, przyjmujemy, że programista nada zaprezentowanym programom własną szatę graficzną, przystosowaną do indywidualnej wrażliwości estetycznej. Jako przykład poglądowy, w rozdziale pt. „Hot Spot” zamieszczamy w pełni opracowany projekt, także pod względem szaty graficznej, aby przedstawić jedną z propozycji zadbania o wygląd naszego programu.

Książka podzielona jest na dwa główne działy: Gry i zabawy oraz Programy użytkowe. Nie chcemy w naszym cyklu ograniczać Delphi tylko do programów użytkowych. Programowanie daje znacznie większe możliwości i nie chcemy mentalności początkującego programisty zamykać w tym ograniczonym wyobrażeniu. Zgodnie z tym założeniem w następnych częściach pojawią się kolejne działy, jak chociażby budowa robota czy androida, które odsłonią pełną ofertę możliwości, jaką daje programowanie w języku Delphi. Nabywając w ten sposób szerszego spojrzenia na temat programowania, staniemy się profesjonalnymi programistami, którzy nie będą bali się wyzwań. Tylko na tej podstawie możliwe są wszelkie innowacje i rewolucje technologiczne. Ktoś, kto boi się poszukiwać i z góry zakłada, że to się nie uda, nigdy nie stanie się autorem czegoś przełomowego. Jako przykład — choć może z nieco innej dziedziny — przywołamy Alberta Einsteina, który zapytany o to, w jaki sposób wpadł na pomysł swojej teorii względności, odpowiedział krótko, że nie bał się myśleć. Nie bójmy się zatem i my. Zastanawiajmy się, poszukujmy i pytajmy, jeżeli czegoś nie wiemy, bo tylko w ten sposób możemy się rozwijać, także jako programiści.

Mam nadzieję, że niniejsza książka będzie inspiracją dla Czytelników i zachętą do rozwijania własnych projektów. Tego wszystkim życzę z całego serca.

Robert Trafny

Gry i zabawy

Policz, ile to jest — wersja prosta

Rozdział poświęcony grom i zabawom wykonanych w środowisku Borland Turbo Delphi otwieramy, chyba najprostszym przykładem z możliwych (z punktu widzenia programistycznego), zabawą matematyczną polegającą na odgadnięciu poprawnego wyniku działania na dwóch liczbach.


Założenia i opis zabawy:


Po naciśnięciu przycisku START program wybierze dla nas jakieś działanie matematyczne z użyciem dwóch liczb, wyświetli je i poprosi o podanie właściwego wyniku. Ponieważ zależy nam na rozwijaniu swego umysłu, wszystkie obliczenia wykonujemy w pamięci. Z uwagi na ten wymóg, ograniczymy zakres używanych liczb do dwudziestu: program będzie wybierał liczby tylko z zakresu od 0 do 20. Oczywiście, programista może sobie ustalić ten zakres w sposób zupełnie indywidualny.

Kolejnym ograniczeniem, jakiego dokonamy, będzie wyeliminowanie z używanych działań, dzielenia. W ten sposób nie będziemy musieli obliczać w pamięci liczb ułamkowych. Trudno przecież w pamięci policzyć, ile to jest 19 podzielić przez 7. Nasz program będzie obsługiwał tylko dodawanie, odejmowanie i mnożenie.

Po obliczeniu w pamięci wyniku wpisujemy go w pole edycyjne programu i naciskamy przycisk Sprawdź. Program sprawdza poprawność wyniku i wyświetla odpowiedni komunikat informacyjny, czy dobrze, czy źle. Jeżeli odpowiedź jest poprawna, działanie jest usuwane z panelu programu. Inna sytuacja ma miejsce w przypadku podania niepoprawnej odpowiedzi. Działanie do policzenia nie znika, usuwany jest tylko podany przez nas wynik. W ten sposób możemy spróbować swoich sił jeszcze raz, a gdy się znowu nie uda, jeszcze raz i jeszcze raz. Decyzja będzie zależała od nas. Jeżeli będziemy chcieli zrezygnować z tego działania, wystarczy, że naciśniemy przycisk START, a program wymieni nam działanie na inne.

Wprowadzamy do programu także tabelę wyników, która będzie pokazywała, ile do tej pory udzieliliśmy odpowiedzi poprawnych, a ile niepoprawnych. Przy zamykaniu programu, pojawi się także komunikat, w którym w zależności od uzyskanych wyników, program nam pogratuluje lub zachęci do większego zaangażowania.

Jako rozszerzenie możliwości programu zadbamy o to, aby program informował nas, gdy nieopatrznie naciśniemy przycisk Sprawdź bez wpisania wyniku w polu edycyjnym oraz aby umożliwiał wpisywanie w tym polu tylko liczb, minusa (bo wyniki będą czasami liczbami ujemnymi) oraz pozwalał na używanie klawisza Backpace do kasowania wprowadzanych znaków w przypadku pomyłki.

Użyte komponenty:


Edit1 — pole edycyjne do wpisywania odpowiedzi,

Button1 — przycisk START,

Button2 — przycisk Sprawdź,

Label1 — wyświetla napis „Wyniki”,

Label2 — wyświetla napis „Poprawne:”,

Label3 — wyświetla napis „Niepoprawne:”,

Label4 — wyświetla ilość poprawnych odpowiedzi,

Label5 — wyświetla ilość niepoprawnych odpowiedzi,

Label6 — wyświetla działanie do policzenia.

Powyższe komponenty wstawiamy na formę główną i układamy względem siebie tak jak na rysunku poniżej:

Należy zwrócić uwagę, że numery komponentów lub formy głównej (TForm) mogą się w Waszych projektach różnić. Należy więc poszczególny kod przypisać do właściwych komponentów i nadać im właściwe nazwy. W naszym projekcie modyfikujemy nazwy poszczególnym komponentom w następujący sposób (właściwość Caption w Inspektorze Obiektów):

Komponent nazwa


Edit1 (usuwamy nazwę)

Button1 START

Button2 Sprawdź

Label1 Wyniki

Label2 Poprawne:

Label3 Niepoprawne:

Label4 0 (zero)

Label5 0 (zero)

Label6 Ile to jest:

W dalszej kolejności także przy pomocy Inspektora Obiektów zmieniamy inne właściwości tych komponentów, a więc: kolor, rozmiar, położenie itp.

Kod programu

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TcloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;

WYNIK: Integer; //zmienna przechowująca wynik działania

Poprawne: Integer; //zmienna przechowująca ilość poprawnych odpowiedzi

Niepoprawne: Integer; //zmienna przechowująca ilość niepoprawnych odpowiedzi


implementation

{$R *.dfm}


//przy uruchomieniu programu wyzeruj punktację

procedure TForm1.FormCreate(Sender: TObject);

begin

Poprawne:=0; //wyzeruj ilość poprawnych odpowiedzi

Niepoprawne:=0; //wyzeruj ilość niepoprawnych odpowiedzi

Label4.Caption:= „0”; //wyświetl „0” poprawnych odpowiedzi

Label5.Caption:= „0”; //wyświetl „0” niepoprawnych odpowiedzi

end;


//przy zamykaniu programu oceń uzyskane wyniki

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if (Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then

begin

ShowMessage(„Musisz jeszcze trochę potrenować”);

end

else

ShowMessage(„Gratuluję! Uzyskałeś dobry wynik”);

end;


//pozwól na wpisywanie tylko liczb, minusa i Backpace w polu odpowiedzi

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if not (Key in [„0”. . „9”, #45,#8]) then

begin

Key:=#0;

ShowMessage(„To nie jest liczba”); //wyświetl komunikat o błędzie

end;

end;


//gdy naciśniesz przycisk START

procedure TForm1.Button1Click(Sender: TObject);

var

Liczba1: Integer; //zmienna przechowująca pierwszą liczbę

Liczba2: Integer; //zmienna przechowująca drugą liczbę

Dzialanie: Integer; //zmienna pomocnicza do losowania znaku działania

Znak: String; //zmienna przechowująca znak działania


begin

Edit1.Clear; //wyczyść pole edycyjne (Do podawania Odpowiedzi)

Randomize; //uruchom maszynę losującą

Liczba1:=Random(21); //losuj pierwszą liczbę

Liczba2:=Random(21); //losuj drugą liczbę

Dzialanie:=Random(3); //losuj znak działania matematycznego

case Dzialanie of //gdy zostanie wylosowana dana liczba to…

0: WYNIK:= Liczba1+Liczba2; //…wykonaj dodawanie

1: WYNIK:= Liczba1-Liczba2; //…wykonaj odejmowanie

2: WYNIK:= Liczba1*Liczba2; //…wykonaj mnożenie

end;

if Dzialanie=0 then

Znak:= '+'; //jeżeli wylosowano dodawanie to pokaż znak '+”

if Dzialanie=1 then

Znak:= '-'; //jeżeli wylosowano odejmowanie to pokaż znak '-”

if Dzialanie=2 then

Znak:= „x”; //jeżeli wylosowano mnożenie to pokaż znak „x”

Label6.Caption:=(„Ile jest: ' + IntToStr(Liczba1) + ' ' + znak + ' ' +IntToStr(Liczba2) + ”? ”); //wyświetl działanie

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

end;


//gdy naciśniesz przycisk Sprawdź


procedure TForm1.Button2Click(Sender: TObject);

Label KONIEC; //Etykieta do przechodzenia w inne miejsca kodu

var

Odp: String; //zmienna przechowująca naszą odpowiedź


begin

Odp:= Edit1.Text; //odczytaj podaną odpowiedź i przypisz ja do zmiennej

if Odp=„” then //gdy nie podano odpowiedzi monituj o wpisaniu wyniku

begin

ShowMessage(„Wpisz najpierw wynik”); //wyświetl komunikat informujący

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

goto KONIEC; //pomiń poniższy kod i przejdź od razu na koniec procedury

end;


if Odp=(IntToStr(WYNIK)) then //jeżeli odpowiedź jest poprawna to …

begin

ShowMessage(„Bardzo dobrze!”); //wyświetl komunikat o poprawnej odpowiedzi

Label6.Caption:= „Ile jest: '; //wyczyść działanie

Poprawne:=Poprawne +1; //dodaj punkt do poprawnych odpowiedzi

end //bez średnika

else //w przeciwnym wypadku …

begin

ShowMessage(„Niestety źle”); //wyświetl komunikat o złej odpowiedzi

Niepoprawne:=Niepoprawne +1; //dodaj punkt do niepoprawnych odpowiedzi

end;

Edit1.Clear; //wyczyść pole do podawania Odpowiedzi)

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

Label4.Caption:= IntToStr(Poprawne); //wyświetl ilość poprawnych odpowiedzi

Label5.Caption:= IntToStr(Niepoprawne); //wyświetl ilość niepoprawnych odpowiedzi

KONIEC: //etykieta do której przechodzi kod, gdy ktoś nie wpisze żadnej liczby

end;

end.

Komentarz

1. Zmienne globalne


Zazwyczaj w programach używamy zmiennych lokalnych, powiązanych tylko z daną procedurą. W ten sposób unikamy konfliktu logicznego, gdy w tym samym czasie jedną zmienną chcą wykorzystać dwie lub więcej procedur.

Czasami jednak zachodzi potrzeba dostępu do parametru z poziomu różnych procedur tak, jak w naszym programie: procedura dla przycisku START generuje wynik działania, który jest umieszczony w zmiennej globalnej WYNIK, a inna procedura, powiązana z obsługą przycisku Sprawdź, korzysta z tej zmiennej, aby porównać, czy udzielona odpowiedź jest poprawna. Gdyby zmienna WYNIK była zmienną lokalną, zamkniętą w jednej procedurze, nie udałoby się tego dokonać. Stąd też w naszym projekcie umieszczamy trzy zmienne globalne:

WYNIK — do przechowywania wyniku działania,

Poprawne — do przechowywania ilości poprawnych odpowiedzi,

Niepoprawne — do przechowywania ilości niepoprawnych odpowiedzi.

Umieszczamy je w sekcji między varImplementation, po deklaracji zmiennej Form1: TForm1.

var

Form1: TForm1;

WYNIK: Integer; //zmienna przechowująca wynik działania

Poprawne: Integer; //zmienna przechowująca ilość poprawnych odpowiedzi

Niepoprawne: Integer; //zmienna przechowująca ilość niepoprawnych odpowiedzi

Wszystkie trzy zmienne będą przechowywać liczby, więc muszą być typu Integer.


2. Form Create

Poprawne:=0; //wyzeruj ilość poprawnych odpowiedzi

Niepoprawne:=0; //wyzeruj ilość niepoprawnych odpowiedzi

Label9.Caption:= „0”; //wyświetl „0” poprawnych odpowiedzi

Label10.Caption:= „0”; //wyświetl „0” niepoprawnych odpowiedzi

Procedura Form Create wykonuje napisany przez nas kod w chwili uruchomienia programu, więc w miejscu tym wyzerujemy tabelę wyników i wyświetlimy oba wyniki jako zerowe.

Aby utworzyć procedurę Form Create, klikamy na puste miejsce naszej formy, a następnie w Inspektorze Obiektów przechodzimy do zakładki Events i obok zdarzenia OnCreate klikamy dwa razy. Zostaniemy automatycznie przeniesieni do kodu z nowo utworzoną procedurą.


3. Form Close

if (Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then

begin

ShowMessage(„Musisz jeszcze trochę potrenować”);

end

else

ShowMessage(„Gratuluję! Uzyskałeś dobry wynik”);

Procedura Form Close realizowana jest w momencie zamykania programu i tworzymy ją tak samo, jak poprzednią, wybierając jednak zdarzenie OnClose. W sekcji tej umieściliśmy możliwość oceny naszych wyników w zabawie.

Na początku mamy instrukcję warunkową if...then (jeżeli…, to…) oraz warunek do spełnienia. Cały kod możemy przetłumaczyć następująco: Jeżeli (if) Ilość poprawnych odpowiedzi (Poprawne) jest mniejsza (<) od Ilości niepoprawnych odpowiedzi (Niepoprawne) lub (or) Ilość poprawnych (Poprawne) jest taka sama (=) jak Ilość niepoprawnych odpowiedzi (Niepoprawne) to wtedy (then) wyświetl komunikat (ShowMessage) o treści: „Musisz jeszcze trochę potrenować”, w przeciwnym razie (else) (czyli, gdy ilość poprawnych odpowiedzi jest większa od niepoprawnych) wyświetl komunikat: „Gratuluję! Uzyskałeś dobry wynik”.


W tego typu konstrukcji, gdzie używamy operatora else, pamiętajmy o tym, że przed nim polecenie występuje bez zwyczajowo wymaganego średnika (w tym przypadku słowo end). To częsty błąd początkujących programistów.

Kolejne niedopatrzenie, które często staje się udziałem początkujących programistów, jest podawanie warunku. W prostym przypadku instrukcji warunkowej wystarczy napisać tak:

if Poprawne < Niepoprawne then

(kod do wykonania)

Jeżeli jednak chcemy, aby zostało spełnionych kilka warunków, wtedy każdy z nich musimy ująć w nawias, na przykład tak:

if (Poprawne < Niepoprawne) and (Liczba1 = 5) then

(kod do wykonania)

4. Procedura Edit1KeyPress

if not (Key in [„0”. . „9”, #45,#8]) then

begin

Key:=#0;

ShowMessage(„To nie jest liczba”); //wyświetl komunikat o błędzie

end;

Aby utworzyć tę procedurę, klikamy na komponent Edit1, a następnie w Inspektorze Obiektów, w zakładce Events wybieramy zdarzenie OnKeyPress i otwieramy je podwójnym kliknięciem.

Jak sama nazwa wskazuje, procedurę tę wykorzystamy do kontroli wpisywania znaków w polu edycyjnym. Zgodnie z naszymi założeniami chcemy, aby była możliwość wpisywania tylko liczb, minusa i, aby aktywny był klawisz Backpace do kasowania źle wpisanych liczb.

Cały kod odczytamy tak: Jeżeli (if) naciśnięty klawisz (Key) nie jest (not) klawiszem liczb („0”.. „9”), minusem (#45- kod klawisza „minus”), ani Backpace (#8- kod klawisza Backpace), wtedy (then) nie reaguj (Key:#0) tylko wyświetl komunikat (ShowMessage) „To nie jest liczba”.

Z punktu widzenia programu procedura ta nie jest konieczna. Jest to tylko udogodnienie dla nas eliminujące pomyłki.


5. Gdy naciśniesz przycisk START

var

Liczba1: Integer; //zmienna przechowująca pierwszą liczbę

Liczba2: Integer; //zmienna przechowująca drugą liczbę

Dzialanie: Integer; //zmienna pomocnicza do losowania znaku działania

Znak: String; //zmienna przechowująca znak działania

Na początku procedury definiujemy zmienne lokalne, które będą nam potrzebne. Przede wszystkim musimy przygotować dwie zmienne na dwie liczby, które zostaną użyte w działaniu. Za każdym razem program będzie sobie jakieś dwie liczby losowo wybierał, musi więc mieć gdzie je zapisać. Stąd umieszczone zmienne Liczba1 i Liczba2 są typu Integer, a więc typu liczbowego.

Poza liczbami program będzie losował także znak działania (dodawanie, odejmowanie, mnożenie), który następnie będzie mógł wyświetlić w pytaniu. To implikuje użycie zmiennej typu String, a więc typu tekstowego. Zmiennej tej nadaliśmy nazwę „Znak”.

Ostatnia zmienna, czyli „Dzialanie” (nie możemy nadać nazwy „Działanie”, ponieważ Delphi nie używa polskich znaków dialektycznych) służy do wylosowania rodzaju działania (dodawanie, odejmowanie, mnożenie). Jest ona typu liczbowego, ponieważ za jej pomocą będziemy losowali liczbę, do której przypiszemy jedno z tych trzech działań:

Edit1.Clear; //wyczyść pole edycyjne (do podawania Odpowiedzi)

Randomize; //uruchom maszynę losującą

Liczba1:=Random(21); //losuj pierwszą liczbę

Liczba2:=Random(21); //losuj drugą liczbę

Dzialanie:=Random(3); //losuj znak działania matematycznego

case Dzialanie of //gdy zostanie wylosowana dana liczba to…

0: WYNIK:= Liczba1+Liczba2; //…wykonaj dodawanie

1: WYNIK:= Liczba1-Liczba2; //…wykonaj odejmowanie

2: WYNIK:= Liczba1*Liczba2; //…wykonaj mnożenie

Przechodząc do kodu wykonywalnego, po naciśnięciu przycisku START, następuje wyczyszczenie pola edycyjnego (Edit1.Clear), a następnie uruchomienie maszyny losującej (Randomize). Po jej uruchomieniu losujemy potrzebne nam elementy, a więc obie liczby z zakresu od 0 do 20 (Liczba:= Random(21)), oraz rodzaj działania (Dzialanie:=Random(3)). Delphi liczy liczby od zera, stąd też przy Random mamy liczbę 21, a nie 20, tak samo, jak w przypadku zmiennej Dzialanie mamy trzy liczby, ale liczone od zera, a więc: 0, 1, 2.

Dalsza część kodu informuje program, co ma zrobić, gdy zostanie wylosowana odpowiednia liczba dla zmiennej Dzialanie: Jeżeli zostało wylosowane zero, wtedy do zmiennej globalnej WYNIK ma zapisać wynik dodawania obu wcześniej wylosowanych liczb (Liczba1 i Liczba2). Gdy wylosowano 1 lub 2 to, odpowiednio, ma zapisać w zmiennej WYNIK wynik odejmowania lub mnożenia tychże liczb. W ten oto prosty sposób uzyskujemy dużą nieprzewidywalność kolejnego działania, jaki program wygeneruje.

Przypominamy, że przy mnożeniu wykorzystujemy klawisz „gwiazdka”, a przy dzieleniu „ukośnik”.

if Dzialanie=0 then

Znak:= '+'; //jeżeli wylosowano dodawanie to pokaz znak '+”

if Dzialanie=1 then

Znak:= '-'; //jeżeli wylosowano odejmowanie to pokaz znak '-”

if Dzialanie=2 then

Znak:= „x”; //jeżeli wylosowano mnożenie to pokaz znak „x”

W tej sekcji realizujemy dalszą procedurę związaną ze zmienną Dzialanie opartą na instrukcji warunkowej if...then, czyli: Jeżeli dla zmiennej Dzialanie wylosowano zero, wtedy do zmiennej Znak przypisz znak „+”. W podobny sposób odczytujemy informacje dla pozostałych wylosowanych możliwości.

Informacje powyższe potrzebne są nam do wyświetlenia odpowiedniego znaku na etykiecie Label6: Label6.Caption:=(„Ile jest: ' + IntToStr(Liczba1) + ' ' + znak + ' ' +IntToStr(Liczba2) + ”? ”);


Ponieważ etykieta Label6 musi przedstawić wiele różnych informacji, stąd też jest ona zbiorem tekstu i zmiennych. Jako że etykieta służy do wyświetlenia krótkiego tekstu, stąd też informacje wyświetlamy z pozycji kodu, zmieniając jej właściwość Caption. To samo robiliśmy wcześniej, przygotowując projekt z pozycji Inspektora Obiektów (Caption).

Ponieważ nazwa jest zbiorem różnych elementów, więc całość musimy ująć w nawias. W jego środku zwykły tekst umieszczamy w apostrofie, a zmienne dokładamy za pomocą znaku „+”. Gdybyśmy chcieli wyświetlić taki plus, musielibyśmy go także zawrzeć w apostrofie. Z uwagi na to, że liczby nie są typu tekstowego (string), tylko liczbowego (integer), musimy je przekonwertować do postaci string, stosując konwersję typu IntToStr. W ten sposób liczby będą mogły zostać wyświetlone, gdyż zostaną potraktowane jako znaki tekstowe. Proszę nie zapomnieć o spacji po słowie „jest” ani przed znakiem zapytania. To samo tyczy się pustych miejsc ujętych w apostrofy przed i za zmienną „Znak”. Są one potrzebne do tego, aby porobić odstępy między słowami i liczbami.

Na zakończenie kodu umieszczamy polecenie: Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

Ta linia nie jest konieczna, ale jest użyteczna, ponieważ po wyświetleniu działania umieszcza kursor w polu edycyjnym. Bez tego kodu, po każdorazowym naciśnięciu przycisku START i wyświetleniu działania, musielibyśmy myszką klikać w pole edycyjne, aby wpisać wynik. Rozwiązanie, które tu stosujemy, umożliwia po wyświetleniu działania od razu wpisać z klawiatury wynik bez użycia myszki. To duże udogodnienie przy zabawie.


6. Gdy naciśniesz przycisk Sprawdź

Label KONIEC; //Etykieta do przechodzenia w inne miejsca kodu

var

Odp: String; //zmienna przechowująca naszą odpowiedź

Zanim zadeklarujemy zmienną Odp, deklarujemy element Label. Nie jest to jednak komponent Label służący do wyświetlania napisów, co widać w innym pokolorowaniu składni w kodzie. Element ten jest częścią instrukcji goto, przy pomocy której możemy przenieść się w inne miejsce kodu i służy do zadeklarowania nazwy, która będzie ten punkt określała. Może być ona dowolna. Starajmy się wybierać takie nazwy, które będą nas informowały o przeznaczeniu tych instrukcji. W późniejszym czasie, gdyby zaistniała potrzeba modyfikacji kodu, odpowiednie nazwy ułatwią nam rozeznanie się w tych tysiącach linii kodu.

Zadeklarujemy teraz zmienną, która będzie przechowywać naszą odpowiedź. Teoretycznie powinna być typu liczbowego (Integer), ponieważ w pole edycyjne Edit1 wpisujemy z klawiatury liczby. Niestety, pomimo wpisywania do komponentu Edit cyfr są one traktowane jako znaki tekstowe, a nie liczbowe, ponieważ komponent ten służy do wyświetlania znaków tekstowych. Nie jest to problem, ponieważ w dalszej części kodu będziemy mogli przekonwertować te wartości. Mając tę wiedzę, deklarujemy więc zmienną „Odp” typu tekstowego (String).

Odp:= Edit1.Text; //odczytaj podaną odpowiedź i przypisz ją do zmiennej

if Odp=„” then //gdy nie podano odpowiedzi monituj o wpisaniu wyniku

begin

ShowMessage(„Wpisz najpierw wynik”); //wyświetl komunikat informujący

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

goto KONIEC; //pomiń poniższy kod i przejdź od razu na koniec procedury

W pierwszej części kodu przypisujemy podaną przez nas odpowiedź (wpisaną do pola Edit) do zmiennej „Odp”. Tutaj wprowadzamy jedno z naszych wcześniejszych założeń, mianowicie chcemy, aby program informował nas o sytuacji, gdy naciśniemy przycisk „Sprawdź”, a w polu edycyjnym nie będzie wpisana żadna liczba. Jest to zadanie opcjonalne, niewpływające na poprawną pracę samej zabawy, ale warto zaopatrzyć w nie nasz program na wszelki wypadek. W sytuacji, gdy naciśniemy przycisk „Sprawdź”, a w polu edycyjnym nie będzie wpisana żadna liczba, bez tego kodu, program uzna to za błędną odpowiedź, ponieważ puste pole nie będzie pasowało do poprawnego wyniku.

Aby zrealizować nasze założenie, wprowadzamy instrukcję warunkową if: Jeżeli zmienna „Odp” nie zawiera żadnej wartości (if Odp = „” — normalnie, pomiędzy apostrofami powinien znaleźć się jakiś znak lub tekst), wtedy (then) wykonaj następujące instrukcje (begin… end): Wyświetl komunikat informujący o tym (ShowMessage), ustaw kursor (focus) ponownie na polu edycyjnym, oraz przejdź do punktu „KONIEC:”, aby pominąć wykonywanie dalszych instrukcji (goto KONIEC). Bez tego przejścia program, po wyświetleniu komunikatu zrealizowałby kolejne linie kodu, czyli porównałby naszą odpowiedź z poprawnym wynikiem i uznał ją za błędną.

W przypadku jakiejkolwiek instrukcji warunkowej, jeżeli chcemy, aby program wykonał kilka różnych operacji, musimy je wszystkie zawrzeć w bloku „begin… end”. Podobnie, jak w poprzednim przypadku, ustawiamy kursor na polu edycyjnym dla naszej wygody, aby nie trzeba było klikać na nie myszką.

if Odp= (IntToStr(WYNIK)) then //jeżeli odpowiedź jest poprawna to …

begin

ShowMessage(„Bardzo dobrze!”); //wyświetl komunikat o poprawnej odpowiedzi

Label11.Caption:= „Ile jest: '; //wyczyść działanie

Poprawne:= Poprawne +1; //dodaj punkt do poprawnych odpowiedzi

end //bez średnika

else //w przeciwnym wypadku …

begin

ShowMessage(„Niestety źle”); //wyświetl komunikat o złej odpowiedzi

Niepoprawne:= Niepoprawne +1; //dodaj punkt do niepoprawnych odpowiedzi

end;

Czas najwyższy ocenić naszą odpowiedź. W tym celu stosujemy instrukcję warunkową if...then: Jeżeli udzielona przez nas odpowiedź (Odp) jest taka sama (=) jak wynik działania (WYNIK), wtedy (then) wykonaj następujące instrukcje (begin… end): Wyświetl komunikat (ShowMessage) informujący o poprawnej odpowiedzi, pozostaw tylko napis „Ile jest:” (Label6.Caption) oraz zwiększ zmienną przechowującą ilość poprawnych odpowiedzi o 1 (Poprawne:= Poprawne+1), w przeciwnym wypadku (else) (czyli, gdy nasza odpowiedź będzie się różniła od poprawnego wyniku), wykonaj następujące instrukcje (begin… end): wyświetl komunikat o błędnej odpowiedzi (ShowMessage) oraz zwiększ zmienną przechowującą ilość niepoprawnych odpowiedzi o 1.

Konstrukcja typu Zmienna:=Zmienna+1 pozwala nam zapamiętywać wynik i powiększać go lub pomniejszać w trakcie działania programu. W ten sposób program „pamięta” nasz wynik.

Aby dopasować typy danych, wynik ze zmiennej WYNIK (typu Integer) konwertujemy do typu String za pomocą konwersji IntToStr.

Edit1.Clear; //wyczyść pole do podawania Odpowiedzi

Edit1.SetFocus; //ustaw focus w Polu do Odpowiedzi

Label9.Caption:= IntToStr(Poprawne); //wyświetl ilość poprawnych odpowiedzi

Label10.Caption:= IntToStr(Niepoprawne); //wyświetl ilość niepoprawnych odpowiedzi

KONIEC

Bez względu na udzieloną przez nas odpowiedź, po jej ocenie, wymazujemy ją z pola edycyjnego (Edit1.Clear) i ustawiamy na nim kursor (focus), przygotowując program na przyjęcie kolejnej odpowiedzi.

Na koniec wyświetlamy podsumowanie naszych wyników. W tym celu w komponencie Label4 wyświetlamy ilość poprawnych odpowiedzi, zmieniając jego nazwę (Caption) na wartość odpowiadającą zmiennej Poprawne. Ponieważ zmienna ta jest typu Integer, więc musimy zastosować konwersję, aby dostosować ją do charakteru tekstowego, jakim jest nazwa komponentu Label.

Powyższe zadanie powtarzamy dla komponentu Label5 wyświetlającego ilość niepoprawnych odpowiedzi, wiążąc jego nazwę (Caption) z wartością zmiennej Niepoprawne.

Na samym końcu umieszczamy etykietę KONIEC, czyli miejsce, do którego przechodzi instrukcja goto. Jest ona na samym końcu, więc cały kod pomiędzy instrukcjami „goto KONIEC” a „KONIEC” jest przez nią pomijany.

Zaprezentowany przez nas przykład prostej zabawy matematycznej możemy traktować jako punkt wyjścia dla bardziej rozbudowanych rozwiązań. Aby dać tego przykład, w dwóch kolejnych propozycjach rozwiniemy tę zabawę w dwóch różnych obszarach: w jednym, utrudnimy sobie liczenie, dokładając kolejne dwie liczby, a w drugim, zamiast wyświetlać komunikaty, program będzie je wypowiadał. Po zastosowaniu dodatkowych rozwiązań z tej książki możemy nawet sprawić, aby całkiem wyłączyć monitor i bawić się z komputerem tak, jak z żywym człowiekiem. To naprawdę zależy tylko od naszej inwencji.

Policz, ile to jest — wersja trudniejsza

Poniższy przykład jest trudniejszą wersją poprzednio zaprezentowanej gry. W tamtej działania odbywały się z użyciem dwóch liczb, a w tej, z użyciem aż czterech, na przykład: „Ile to jest: 2 +8 x 11 — 7?”. Wszystkie inne nasze założenia i rozwiązania pozostają bez zmian.

Kod programu

unit Unit1;

interface

uses

Przeczytałeś bezpłatny fragment.
Kup książkę, aby przeczytać do końca.
E-book
za 17.75
drukowana A5
za 64.58
drukowana A5
Kolorowa
za 102.74