delphi kurs Lekcja03

Delphi, cz. 3


Czy aby nie za szybko tłumaczę? Czy kurs jest dla Was zrozumiały? Jeżeli macie jakieś uwagi lub pytania to piszcie - postaram się je uwzględnić podczas pisania kolejnej części kursu.

Dzisiaj kolejne pętle:


Pętla "repeat"


Pętla ta sprawdza warunek zakończenia po wykonaniu pętli. Pętla ta jest często używana w Turbo Pascalu - w Delphi rzadziej. Na początek przykładzik, a później objaśnienie:


var

I : Integer;

begin

I := 10;

Memo1.Clear; // wyczysc zawartosc komponentu Memo

repeat

Sleep(500); // czekaj pol sekundy

Memo1.Lines.Add(' Pozostalo sekund do zakończenia programu: ' + IntToStr(i)); // dodaj ciag znakow

Dec(i); // zmniejsz wartosc I o jeden

until I := 0; // warunek zakoczenia pętli: Jeżeli wartosc I wyniesie 0 to zakoncz dzialanie pętli....

Sleep(1000); // ... odczekaj sekunde

Close; // zamknij program

end;



Warunek zakończenia pętli następuje po słowie "until". W tym wypadku, jeżeli zmienna I osiągnie wartość 0 to zakończ działanie pętli. Funkcja "Dec" została już wcześniej omówiona ( zmniejsza zmienna "i" o jeden ). Funkcja "Clear" komponentu Memo czyści jego zawartosc.

Teraz cos trudniejszego z pętla "repeat" - wczytanie pliku tekstowego:

Umieść komponent "Button" na formularzu i kliknij na niego dwukrotnie ( zakładam, ze masz już na formie umieszczony komponent Memo? ). Wpisz taki kod po przeniesieniu do edytora kodu:


var

Plik : TextFile; // nowa zmienna

S : String;

begin

// otworz plik

AssignFile(Plik, 'C:\Moje dokumenty\plik.txt');

Reset(Plik);


repeat // petla

Readln(Plik, S); // odczytaj plik

Memo1.Lines.Add(S); // dodaj linie do komponentu Memo

until S = ''; // jeżeli napotkasz na pusta linie zakończ działanie pętli

CloseFile(Plik); // zamknij plik


Taka metodę stosowali programiści Turbo Pascala. Pojawia się tutaj nowa zmienna, która umożliwia operacje na plikach. Na razie nie będziemy o tym mówić.

Na samym początku ze zmienna "Plik" zostaje skojarzony plik tekstowy ( "AssignFile" ). Później następuje jego otwarcie "Reset". Następnie działa pętla, która ma za zadanie wczytywać wszystkie linie pliku do miejsca, w którym napotka na pusta linie ( Readln ). Wszystkie linie pliku tekstowego zapisywane w zmiennej "S", a następnie dodawane do komponentu Memo przy pomocy funkcji "Add". Na samym końcu ( po wykonaniu pętli ) następuje zamkniecie pliku tekstowego.

Oczywiście istnieje prostsza metoda otwarcia pliku, ale zajmiemy się tym w dalszych rozdziałach ( podczas pisania edytora tekstu ).


Pętla "while"


W odróżnieniu od pętli "repeat" pętla "while" sprawdza warunek jej zakończenia przed samym rozpoczęciem działania pętli. :) No cóż, oto kolejny przykład:


var

I : Integer;

begin

I := 10;

Memo1.Clear;

while i > 0 do

begin

Sleep(500);

Memo1.Lines.Add(' Pozostalo sekund do zakończenia programu: ' + IntToStr(i));

Dec(i);

end;

Sleep(1000);

Close;


Prawda, ze ta pętla podobna jest do "repeat". Praktycznie zostały zastąpione tylko dwie linie kodu. tla rozpoczyna się od słowa "while"; następnie następuje warunek ( w tym wypadku, jeżeli zmienna "i" jest większa od zera ), a następnie słowo "do" i "begin", które rozpoczynają działanie pętli. "Serce" pętli jest takie samo jak w przypadku pętli "repeat". Pętla kończy swoje działanie słowem "end".


Konwersja typów


Nim zajmiemy się omawianiem tego tematu napiszemy prosty programik mający za zadanie dodawanie liczb.

1. Stwórz nowa aplikacje ( "File" -> "New Application" ).

2. Na formularzu umieść dwa komponenty typu "Edit" ( na zakladce "Additional" ).

3. Umieść komponent "Button;

4. Umieść komponent "Label";

5. Teraz kliknij dwukrotnie na komponencie "Button". Wpisz w procedurze taki tekst. Tak powinna wyglądać cala procedura:


procedure TForm1.Button1Click(Sender: Object);

var

X, Y, Z : Currency; // typy zmienno-przecinkowe

begin

X := StrToCurr(Edit1.Text); // konwersja

Y := StrToCurr(Edit2.Text); // konwersja


Z := X + Y; // dodanie 2-och zmiennych

Label1.Caption := CurrToStr(Z); // wyswietlenie wyniku

end;


Użyłem tutaj typów zmienno-przecinkowych, dlatego, ze możliwe będzie dodawanie cyfr po przecinku. Tak jak w poprzednim rozdziale mówiłem o funkcji "IntToStr", tak teraz powiem o "StrToCurr". Obie te funkcje konwersja dwóch typów. Zmienne X i Y typami "Currency", a tekst w komponencie "Edit" to typ "String". Konwersji typu "String" na "Currency" dokonuje funkcja "StrToCurr". Zmienna Z jest natomiast wynikiem dodawania dwóch typów: X i Y. Następnie wynik dodawanie wyświetlany jest na etykiecie "Label". Tutaj także należy dokonać konwersji gdyż wynik jest w postaci "Currency", a na Labelu tekst musi być wyświetlany w postaci zmiennej "String". Ufff, ale namotałem :) Mam nadzieje, ze wiecie, o co chodzi. Teraz możecie sprawdzić jak program będzie działał ( F9 ). W komponencie "Edit" możecie wpisywać typy zmiennoprzecinkowe - np.: 3,5 itp. Wynik dodawania zostanie przedstawiony na etykiecie.

Istnieją inne funkcje konwertujące:


StrPas konwertuje zmienna "PChar" na zmienna "String"

StrPCopy konwertuje "String" na "PChar"

XXXtoStr konwertuje XXX na "String", gdzie XXX to: Curr, Date, Time

StrToXXX konwertuje "String" na XXX, gdzie XXX to: Curr, Date, Time;


Tak możliwe jest tez wyświetlanie aktualnej godziny i daty. NP:


ShowMessage(

'Data: ' + DateToStr(Date) + ' Czas: ' + TimeToStr(Time));


Powyższe polecenie wyświetla okienko z informacja o dacie i czasie.


Teraz chciałem napisać o czymś innym. O operatorze kropki ( . ) Tak to tez operator! Podczas pisania poprzednich programów wielokrotnie go użyliśmy. Np. jeżeli chcesz zmienić tekst wyświetlany w komponencie "Label" piszesz:


Label1.Caption := 'Nowy tekst...';


Pole "Caption" widnieje również w Inspektorze Obiektów i możesz je modyfikować w trakcie pisania programu. Podczas pracy Twojej aplikacji także możesz zmieniać WSZYSTKIE parametry, które widnieją w Inspektorze Obiektów.


Label1.Font.Color := clBlue; // zmiana koloru czcionki na niebieski.


Jeżeli nie pamiętasz wszystkich tych właściwości możesz zastosować pewna "sztuczkę" :) Napisz nazwę komponentu, a następnie postaw kropkę, odczekaj chwile, a powinieneś ujrzeć listę wszystkich możliwych do zastosowanie właściwości. Możesz także skorzystać z pomocy Delphi. Wystarczy, ze klikniesz dwukrotnie na nazwę jakiejś funkcji i naciśniesz klawisz F1, a zobaczysz pomoc na temat zadanej funkcji lub właściwości.


Rzutowanie typów


W programowaniu ważną umiejętnością jest rzutowanie typów. Nie jestem pewien czy już teraz powinienem brać ten temat, ale...

Umieść na formularzu komponent "Button" i kliknij na niego dwukrotnie - wpisz poniższy tekst:


MessageBox(Handle, 'Hej, jak tam!', 'Okno', MB_OK);


Funkcja "MessageBox" także wyświetla okienko ( podobnie jak funkcja "ShowMessage" ), ale daje większe możliwości w operowaniu jego wyglądem. Pierwszym parametrem tej funkcji jest tzw. UCHWYT OKNA. Jest to pojecie dość skomplikowane wiec na razie nie zawracajcie sobie tym głowy ( omówię to kiedy indziej ). Powiedzmy, ze ma być to słowo "Handle". W kolejnym parametrze tej funkcji wpisujemy tekst, który ma być wyświetlany w oknie. Kolejny to tytuł okna, czyli tekst, który pojawi się na górnym pasku. Ostatnim parametrem będą przyciski, które wyświetlane będą w okienku. W tym wypadku jest to jedynie przycisk "OK". Oprócz tego może to być jeszcze:


MB_YES - przycisk "Tak"; MB_NO - przycisk "Nie"; MB_CANCEL - przycisk "Anuluj"; MB_YESNOCANCEL - przyciski "Tak, Nie, Anuluj",

Możesz przyciski ze sobą łączyć - np.: MB_YES + MB_NO itp., itd.


Dobra, ale nie o tym miałem mówić. Funkcja "MessageBox" jak już mówiłem wyświetla komunikat. A teraz wpisz taka linie:


var

Info : String;

begin

Info := 'Hej jak tam!';

MessageBox(Handle, Info, 'Okno', MB_OK);


Picas kompilacji ( "Project" -> "Build" ) wystąpi błąd: "Incompatible types: 'String' and 'PCHar'". Drugi parametr, czyli tekst jest typu PChar, a nasza zmienna, jest typu "String" stad ten błąd! Dla doświadczonego programisty nie stanowi on problemu ponieważ zastosuje rzutowanie typów:


var

Info : String;

begin

Info := 'Hej jak tam!';

MessageBox(Handle, PChar(Info), 'Okno', MB_OK);


Powyższy przykład się skompiluje i będzie działał poprawnie. Inaczej mówiąc rzutowanie to "oszukanie" kompilatora. A typ "PChar". To tez typ do przechowywania tekstu, lecz funkcjonuje on na innych zasadach dzięki czemu zajmuje on mniej pamięci. O tym typie powiem kiedy indziej.


Na tym kończę ten rozdział. Od następnego zaczniemy pisać już prawdziwe aplikacje. Te 3 rozdziały były jednak niezbędne, aby poznać język jakim operuje Delphi, czyli Object Pascal. W następnym rozdziale zaczniemy pisać już edytor tekstów. Tekst ten pisany jest w edytorze stworzonym w Delphi. Nie wierzysz? Odwiedź stronę:

www.programowanie.of.pl i ściągnij edytor tekstu o nazwie "Pad". Spróbuj odczytać za jego pomocą ten tekst, a zobaczysz, ze się uda :) Ty także taki edytor napiszesz już niebawem!


Adam Boduch dnia: 00-12-21

boduch@poland.com






Wyszukiwarka