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 aż do miejsca, w którym napotka na pusta linie ( Readln ). Wszystkie linie pliku tekstowego są 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. Pę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 są konwersja dwóch typów. Zmienne X i Y są 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