4. Aplikacja 1, czyli tradycyjne przywitanie z całym światem

Po tym dość długim wstępie i dywagacjach, czy programowanie pralki to programowanie, czas wreszcie dodać nowy element do tego świecącego pustkami menu “Programy”.

Najpierw warto zadać sobie pytanie, czym właściwie jest program, zwłaszcza w kontekście Eltena. W systemie operacyjnym potocznie program to narzędzie, które po uruchomieniu pozwala nam na wywołanie danej lub danych operacji. Technicznie programem jest praktycznie każdy plik wykonywalny na naszym dysku, czy to sterownik obsługi drukarki, czy Notatnik. W Eltenie programem nazywamy każdy dołączany kawałek kodu. Może to być gra audio, ale także dodatek dodający obsługę zapisywania audio w formacie mp3. Ten drugi rodzaj programu nie znajdzie się w menu, nie będzie miał także żadnego elementu interakcji z użytkownikiem. Oczywiście nam dzisiaj zależy na tym, by napisany przez nas kawałek kodu w jakiś sposób owemu użytkownikowi się ukazał.

Gdzie stworzyć naszą aplikację?

Elten swoje programy zapisuje w ścieżce “%appdata%\elten\apps”. Owo tajemnicze “%appdata%” to zmienna środowiskowa wskazująca na folder zawierający dane aplikacji, w większości instalacji systemów od Windowsa 7 będzie to c:\users\nazwa_uzytkownika\AppData\Roaming. Najłatwiej tam trafić, wciskając kombinację klawiszy Windows+R i wpisując “%appdata%”.

Jeśli już w Eltenie zainstalowano jakieś programy z repozytorium, można tu je zobaczyć. My stworzymy jednak nowy program. Nazwijmy go sample. Tworzymy więc nowy folder o nazwie “sample”, a w nim plik o nazwie “__app.rb”. To tutaj znajdzie się kod naszej aplikacji.

No właśnie, jaki kod?

W pliku “__app.rb” umieśćmy następujący kod:

=begin EltenAppInfo
Name=sample
Version=1.0
Author=pajper
=end EltenAppInfo

class Program_Sample < Program
  def main
    alert("Hello, world!")
    finish
  end
end

Teraz, gdy tylko Elten zostanie ponownie uruchomiony, w menu “Programy” pojawi się nowa aplikacja “Sample”, której egzystencja ma jedyny cel powitania się z całym światem.

Co właściwie napisaliśmy?

=begin EltenAppInfo
Name=sample
Version=1.0
Author=pajper
=end EltenAppInfo

Te wiersze zawierają informacje o naszym programie. Nie jest to właściwy kod, a seria informacji dla Eltena, że, owszem, to jest program i należy go załadować z następującymi atrybutami. Oczywiście nazwę autora możecie zmienić na waszą nazwę użytkownika.

class Program_Sample < Program

Tu definiujemy klasę o nazwie Program_Sample, dziedziczącą po klasie Program. O tym, jak dokładnie definiować klasy i jak grupować w nich funkcje i zmienne więcej napiszemy w następnych częściach tego kursu.

  def main

Tworzymy tu funkcję o nazwie “main”. To właśnie ta funkcja zostanie wywołana przez Eltena zaraz po wybraniu naszego programu z menu.

    alert("Hello, world!")

Ta linia wypowiada powitanie całemu światu.

    finish

W tym punkcie Elten jest informowany, że program może skończyć pracę. Gdybyśmy nie umieścili tego polecenia, program byłby wywoływany bez przerwy, zasypując cały świat miliardami pozdrowień.

  end
end

Zamykamy funkcję “main” oraz klasę “Program_Sample”.

Nie tak wyglądają programy

Programy mają zwykle przynajmniej jakieś okno czy menu. Na pewno nie zamykają się z jednym, surowym pozdrowieniem. Chcielibyśmy, by i nasza aplikacja wyglądała jakoś tak pełniej, miała jakieś opcje. Na szczęście nie jest to trudno osiągnąć.

Zmieńmy więc nieco nasz plik “__app.rb” i zamieńmy zawartość funkcji “main” na coś takiego:

    menu = Menu.new
    menu.option("Say hello to me") {
      alert("Hello!")
    }
    menu.option("Say bye to me") {
      alert("Bye!")
      finish
    }
    menu.show

No, teraz znacznie lepiej. Po przeładowaniu Eltena i ponownym uruchomieniu naszej aplikacji widzimy zgrabne, porządne menu.

I znowu, co myśmy właściwie zrobili?

Zastanówmy się, co właściwie spowodował nasz kod.

    menu = Menu.new

“menu” (pisane z małej litery) to nic innego, jak zmienna. Do tej pory nasze zmienne zawierały napisy lub liczby. W tym przypadku przypisujemy do niej nowo tworzony obiekt klasy Menu (z dużej litery). Jak zaznaczyłem na początku, szerzej klasami zajmiemy się później. W tej chwili wystarczy informacja, że tak w języku Ruby tworzymy wiele bardziej zaawansowanych elementów.

    menu.option("Say hello to me") {
      alert("Hello!")
    }
    menu.option("Say bye to me") {
      alert("Bye!")
      finish
    }

W tym miejscu definiujemy dwie opcje, które do naszego menu trafią. Dzięki przypisaniu obiektu do naszej zmiennej “menu”, doczekała się ona funkcji o nazwie “option”. Funkcja ta przyjmuje argument, którym jest nazwa naszego elementu. Następnie dzieje się coś dziwnego, pojawiają się nawiasy klamrowe. Między tymi nawiasami znajduje się kod, który zostanie wywołany przez tę opcję. Należy zauważyć, że tego segmentu kodu, w przeciwieństwie do definicji klas i funkcji, nie kończy “end”!

    menu.show

ta linia po prostu oznacza, że menu jest gotowe i można je wyświetlić.

Podsumowanie

Co uzyskaliśmy? Uzyskaliśmy co prawda prostą, ale już dostatecznie wypasioną aplikację, która pozwala się witać i żegnać, czyli jakby początek i koniec już jest, został tylko środek. 🙂 Oczywiście w komentarzach do tego wpisu zapraszam do zadawania pytań i dzielenia się waszymi uwagami.

Zadanie domowe

Nie ma dobrych lekcji bez pracy własnej, a więc jest i ona.

Zadanie 1

Czy można przerobić program, by dostosowywał pozdrowienie do dnia tygodnia, życząc na przykład miłego poniedziałku (o ile coś takiego istnieje)?

Zadanie 2

A czy da się sprawić, by jakaś opcja menu pojawiała się wtedy i tylko wtedy, gdy jest sobota?

Linki

Obydwie napisane dzisiaj aplikacje można pobrać tutaj:
Hello, world!
Simple Menu

11 komentarzy

  1. Składnia:
    =begin
    blablabla
    =end

    Jest standardowa dla Rubiego i służy przede wszystkim do tworzenia dodatkowych konfiguracji dla parsera, jak tutaj.

  2. Czym jest technicznie sekcja na początku programu

    Czy to jest jakiś obskurny feature w rubym, czy Elten bierze te pliki, wycina co na początku i przekazuje resztę do czegoś typu eval.

  3. great. and =begin EltenAppInfo… what is that? and what is EltenAppInfo? is it an object? or what is it? and what is =begin, and when it works? can you explain it technically

  4. Znowu jak poprzednio, brakuje w klasie programu definicji metody main.
    I alert się pojawia w definicji dayName.
    Zresztą wywołany z błędem, bo mówi o funkcji dayNumber, a nie dayName.

    Gdyby w definicji funkcji f pojawiało się wywołanie funkcji f, np.:
    def f(x)
    alert(f(3)
    end

    to mielibyśmy do czynienia z nieskończoną rekurencją, czyli wywoływaniem funkcji przez samą siebie.

    Fragment poprawionego kodu, który powinien działać, poniżej.
    Dodałem komentarze, żeby było wiadomo, który end jest od czego.
    … tak jak w oryginale …
    res="sobota"
    end #case
    return res
    end #dayName
    def main
    alert(dayName(3))
    finish
    end# main
    end# class

  5. eh w teorii to co poniżej, powinno po otworzeniu programu powiedzieć wtorek, albo ewentualnie to co wpiszę zamiast nazwy wtorek, czyli np. hej, co słychać?
    W ten sposó mógł bym stosunkowo prosto ustawić na każdy dzień inny tekst, testowałem czy nie robię czegoś źle z metodą time.now.wday, ale to nie to.
    Konsola błędu nie zwraca, a program milczy.
    ELTEN dialog Script 'Main’ line 112: NoMethodError occurred.
    undefined method `main’ for #<Program_Sample:0xfce7098>
    Jakiś problem z def main, ale chyba zamiast main mogę wrzucić inną nazwę funkcji i parametr do niej.
    Oto kod mojego programu, tak wiem, da się prościej 😛

    =begin EltenAppInfo
    Name=sample
    Version=1.0
    Author=pajper
    =end EltenAppInfo

    class Program_Sample < Program
    def dayName(dayNumber)
    case dayNumber
    when 0
    res="niedziela"
    when 1
    res="poniedziałek"
    when 2
    res="wtorek"
    when 3
    res="środa"
    when 4
    res="czwartek"
    when 5
    res="piątek"
    when 6
    res="sobota"
    end
    return res
    alert(dayNumber(3))
    finish
    end
    end

  6. yy, u mnie po restartach już też, jak jeszcze raz zaobserwuje problem to zgłoszę, ja jakoś wychwytuję ostatnio takie rzeczy, że coś jest gdzieś a potem tego nie ma 😛
    Tak czy tak dzięki za odpowiedzi.

  7. Nie rozumiem, na czym polega problem. Skopiowałem do siebie i działa zgodnie z oczekiwaniami.
    A jak na pierwszym programie a1test dam strzałkę w górę, to mi mówi "Programy".

  8. Czyli teoretycznie wygląda to tak jak poniżej, teoretycznie działa, tylko, że jak wchodzę w programy to jak stojęna programie sample i dam strzałkę w górę to słyszę dźwięk przesunięcia strzałki, ale żadnej nazwy, jak dam enter to program się normalnie otwiera, jak bym dał enter na sample.
    =begin EltenAppInfo
    Name=sample
    Version=1.0
    Author=pajper
    =end EltenAppInfo

    class Program_Sample < Program
    def main
    menu = Menu.new
    menu.option("Say hello to me") {
    alert("Hello!")
    }
    menu.option("Say bye to me") {
    alert("Bye!")
    finish
    }
    menu.show
    end
    end

  9. Problem w tym, że tworzenie i wyświetlanie menu od menu.new do menu.show masz w definicji klasy, a powinno być w metodzie main.
    Czyli trzeba obudować def main

    end

  10. Coś źle zrobiłem. Jak odpalam eltena to mówi mi say hello to me.
    Jak wchodzę w program sample to mam błąd:
    ELTEN dialog Script 'Main’ line 112: NoMethodError occurred.

    undefined method `main’ for #<Program_Sample:0xfd713b8>

    Gdzieś coś źle zrobiłęm, ale nie wiem co…. Podmieniłem zamiast funkcji def, funkcję menu.

    =begin EltenAppInfo
    Name=sample
    Version=1.0
    Author=pajper
    =end EltenAppInfo

    class Program_Sample < Program
    menu = Menu.new
    menu.option("Say hello to me") {
    alert("Hello!")
    }
    menu.option("Say bye to me") {
    alert("Bye!")
    finish
    }
    menu.show
    end

    ELTEN dialog Script 'Main’ line 112: NoMethodError occurred.

    undefined method `main’ for #<Program_Sample:0xfd713b8>

    Gdzieś coś źle zrobiłęm, ale nie wiem co….

    =begin EltenAppInfo
    Name=sample
    Version=1.0
    Author=pajper
    =end EltenAppInfo

    class Program_Sample < Program
    menu = Menu.new
    menu.option("Say hello to me") {
    alert("Hello!")
    }
    menu.option("Say bye to me") {
    alert("Bye!")
    finish
    }
    menu.show
    end

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *