Delphi


Delphi. Ósmy cud świata

Witam ponownie. W tej części napiszemy sobie prościutką i beznadziejną bazę danych w sposób, w który się nie powinno tworzyć programów tego typu.

Ale mam w tym swój ukryty cel. Chodzi po prostu o to, aby pokazać kilka rzeczy i być może niektóre z nich dopiero po tej części się rozjaśnią...

Tak więc zaczynamy. Utwórzmy nowy projekt. Dodajmy na niego 12 komponentów typu TEdit(kliknij na palecie komponentów komponent TEdit mając wciśnięty SHIFT, a wtedy nie będziesz musiał klikać na ten komponent 12 razy, tylko raz).

Ustaw je w dwóch kolumnach po 6 w każdej. Lewa kolumna będzie odpowiadała za imiona, a prawa za nazwiska. Na razie tyle wystarczy. Połóż na formie 3 komponenty TButton. Zmień ich właściwość caption na kolejno: Otwórz, Zapisz, Czyść. A ich nazwy(właściwość NAME) na kolejno: openButton, SaveButton, ClearButton.

Dobrym nawykiem jest nazywanie komponentów od czynności jaką mają wykonywać. Każdy z Was może opracować sobie swój własny system nazewnictwa. Dlaczego? Bo tak się łatwiej pisze. Powiedzmy, że wracacie do jakiegoś projektu po miesiącu. I chcecie dopisać kawałek jakiegoś kodu, z użyciem pewnego komponentu. Normalnie oczywiście należy odszukać ten komponent i odczytać jego nazwę, ale programiści są zazwyczaj zbyt leniwi, więc po prostu nazwę można "odgadnąć" (niby samemu się ją nadawało, ale po miesiącu może wylecieć z głowy).A mając własny system nazewnictwa, łatwo taką nazwę odgadnąć.

Na przykład ja nazywam komponenty w taki sposób: zadanieTypKomponentu, np. OpenButton - przycisk będzie coś otwierał... No, ale po tej małej dygresji, bierzmy się dalej do roboty...

Zadeklaruj sobie nowy typ rekordowy. Powiedzmy TCzlowiek. Nie będzie miał dwa pola(bo w tym przykładzie więcej nie trzeba): IMIE i NAZWISKO:

type
    TCzlowiek = record
    imie: string[15];
    nazwisko: string[30];
end;

Tworzenie typów rekordowych (i plików typowanych) omawiałem w części 4 (Czwarty Jeździec Apokalipsy), więc nie będę do tego teraz wracał. Teraz zadeklaruj sobie zmienną tablicową dla tego typu i zmienną plikową:

var
    osoba: array[0..5] of TCzlowiek
    plik: file of TCzlowiek;

Dlaczego dałem zakres w tablicy od 0 do 5? Bo większego nie potrzebujemy, jako, że będziemy zapisywać 6 osób do naszej bazy.

Teraz zajmiemy się najłatwiejszą czynnością... Aczkolwiek wykonam tutaj pewien trik, w którym użyję operatorów AS i IS. Może będzie ciężko zrozumieć, ale myślę, że przy przykładzie wszystko się wyjaśni. Mianowicie chodzi o wyczyszczenie wszystkich editów przyciskiem ClearButton.

Można to zrobić dwojako - prościej, ale mniej elegancko, narobić się i tak dalej, lub troszkę trudniej, ale za to jak! ;) Najprościej zrobić to tak:

edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
edit6.text:='';
edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';
edit11.text:='';
edit12.text:='';

Mamy 12 linijek... A gdyby tych editów do wyczyszczenia było powiedzmy 50? Bez sensu. Więc oto dużo fajniejszy sposób - wystarczy tak naprawdę jedna linijka:

var
    i: integer //zmienna sterująca pętlą

begin
    for i:=0 to ComponentCount-1 do
    if (components[i] is TEdit) then (components[i] as TEdit).Text:='';
end;

Wyjaśnienie:

ComponentCount - jak sama nazwa wskazuje jest to ilość komponentów dzieci(tzn. np. rodzicem komponenta TEdit w tym przypadku jest nasza forma. Ale gdyby np. na formie był komponent TPanel, a na nim TEdit, to wtedy rodzicem Edita byłby ten Panel, a rodzicem Panela nasza forma).

A teraz co oznacza warunek... No mniej więcej coś takiego:

"Jeżeli komponent numer i jest typu TEdit, to potraktuj komponent numer i jako TEdit i zmień jego właściwość TEXT na ''"

Słowo kluczowe AS każe jakby potraktować jakiś komponent jako jakiś typ. Słowo IS przeważnie sprawdza, czy komponent jest jakiegoś typu, lub, czy np. co jest zagadkowym pewnie dla Ciebie Senderem.

Nie chce namieszać, więc na razie nie wykraczajmy. Więc kod do czyszczenia wszystkich editów na tej formie już mamy. Teraz otworzymy sobie bazę:

Najpierw połż na formie komponent OpenDialog i SaveDialog, i zmień im właściwości wg własnych potrzeb(filtr, opcje i.t.d.).

Wpisz takie zdarzenie onClick przycisku openButton(wyjaśnienie na koniec):

var
    i, z: integer;

begin
    if openDialog1.Execute then
    begin
        assignFile(plik, openDialog1.FileName);
        reset(plik);
        for i:=0 to 5 do read(plik, osoba[i]);
        closeFile(plik);

        //wypełnienie editów danymi:
        edit1.Text:=osoba[0].imie;
        edit2.Text:=osoba[0].nazwisko;
        edit3.Text:=osoba[1].imie;
        edit4.Text:=osoba[1].nazwisko;
        //tutaj pozostałe osoby
        edit12.Text:=osoba[5].nazwisko;
    end;
end;

Oczywiście wypełnienie danymi można zrobić krócej (za pomocą operatorów AS i IS), ale wtedy należałoby zastosować kilka warunków co do nazw komponentów, a to byłoby trochę pokomplikowane. Tzn. mogłoby się takie wydawać. ;)

Dobrze, więc teraz zapiszmy sobie naszą bazę danych. Zrobimy to tak, że wymagane będzie wpisanie wszystkich danych(tzn. gdy choć jeden z editów będzie pusty, baza nie zapisze się).

var
    i: integer;

begin
    for i:=0 to ComponentCount-1 do
    begin
        if (components[i] is TEdit) then
        if length((components[i] as TEdit).Text)=0 then
        begin
            ShowMessage('Wypełnij wszystkie pola edycyjne');
            Exit;
        end;
    end;

    if OpenDialog1.Execute then
    begin
    //przypisanie wartości zmiennej tablicowej osoba z editów
        osoba[0].imie:=edit1.Text;
        osoba[0].nazwisko:=edit2.text;
        //i tak przypisujemy wszystkie edity
        osoba[5].nazwisko:=edit12.text;

        assignFile(plik, openDialog1.FileName);
        rewrite(plik);
        for i:=0 to 5 do write(plik, osoba[i]);
        CloseFile(plik);
    end;
end;

Pojawiła się nowa funkcja - length. Funkcja length zwraca nam ilość znaków w jakimś łańcuchu tekstowym.

Na przykład:

length('Papa') zwróci 4.

var
    zmienna: string;

begin
    zmienna:='Jakiś tekst';
end;

W powyższym przypadku length(zmienna) zwróci 11.

I w tym warunku sprawdzamy, czy długość tekstu w komponencie Edit jest większa od zera (czyli po prostu, czy jest wpisany jakiś tekst), jeśli jest równa zeru, wtedy wyświetla się komunikat.

Instrukcja EXIT powoduje wyjście z procedury, w której została wywołana.

Reszta powinna być zrozumiała, bo była tłumaczona we wcześniejszych częściach kursu.

To już jest koniec

Mam nadzieję, że napisany przeze mnie cykl artykułów podobał się Wam i że udało mi się zachęcić Was do programowania w języku jakim jest Delphi... Niestety to już ostatnia część kursu, więc nie pozostało mi nic innego jak się pożegnać - do zobaczenia!

Dodał: Adam​Jachocki
Dział: Delphi


 

ComputerSun.pl na FaceBooku
Polecamy lekturę:

Fotografia cyfrowa. Pierwsza pomoc