czwartek, 13 sierpień 2020
 
Strona główna Języki programowania Zasoby aplikacji

Zasoby aplikacji


  1. Wstęp
  2. Tworzenie pliku RES przy pomocy Image Editor
  3. Tworzenie pliku RES przez kompilację
    - Składnia plików RC
    - Kompilacja RC do RES
  4. Włączanie do aplikacji pliku RES
    - Dostęp do zasobów: [Sposób 1 - Wykorzystanie specjalnych funkcji lub metod odczytu zasobów] [Sposób 2 - Wykorzystanie strumieni.] [Sposób 3 - Wykorzystanie wskaźników do zasobów.]

  1. Wstęp

    Zasoby aplikacji (ang. resource) są wygodnym miejscem do przechowywania różnego rodzaju danych (np. ikony, kursory myszki, bitmapy, teksty itd..). Istotną cechą zasobów jest to, że w procesie kompilacji zostają one "wbudowane" w plik programu (EXE). Dzięki temu zamiast wielu plików mamy do czynienia z jednym.

    Zasoby umieszcza się w plikach nazwa.res. Sposoby ich tworzenia i wykorzystania opisałem niżej.

    do góry
  2. Tworzenie pliku RES przy pomocy Image Editor

    Do Delphi dołączono prosty edytor graficzny “Image Editor” (podobny do Painta). Pozwala on na bezpośrednie tworzenie zasobów z grafikami (typu BITMAP, ICON i CURSOR). Poza tym można te obrazki tworzyć jako odrębne pliki.

    do góry
  3. Tworzenie pliku RES przez kompilację

    Do Delphi, C++Builder i innych podobnych systemów producent dołącza zwykle program komilatora zasobów. W Delphi jest to plik brcc32.exe. Znajduje się on w podkatalogu bin. Jest to program pracujący w trybie konsolowym, dlatego do jego uruchomienia najwygodniej jest utworzyć odpowiedni plik wsadowy *.bat.

    Dane dla brcc32 stanowi plik nazwa.rc oraz oczywiście pliki z zasobami (BMP, JPG, ICO, CUR, itp). Najwygodniej jest zgromadzić wszystkie te pliki (brcc32.exe, RC, BAT, BMP, JPG, ICO, CUR, ...) w jednym miejscu.

    do góry

    Składnia plików RC

    Pliki RC są zwykłymi plikami tekstowymi. Zawierają listę zasobów, które należy włączyć do pliku RES.
    Podstawowy element składni wygląda następująco:

    NazwaZasobu  TypZasobu  NazwaPliku
    

    W treści pliku RC mogą się znaleźć komentarze: /* komentarz */. Przykład pliku RC:

    obraz  RCDATA  obrazek.jpg   /* Tło aplikacji */
    /* Obrazy przycisków */
    btak   BITMAP  Yes.bmp
    bnie   BITMAP  No.bmp
    /* kursory */
    K1     CURSOR  kursor1.cur
    K2     CURSOR  kursor2.cur
    K3     CURSOR  kursor3.cur
    IKONA  ICON    Icon1.ico
    

    Typ zasobu określa format włączanego pliku. Najważniejsze typy:

    Typ zasobuOpis
    BITMAPbitmapa - plik typu BMP
    CURSORkursor - plik typu CUR
    ICONikona - plik typu ICO
    RCDATAPlik innego typu (dowolny)
    do góry

    Kompilacja RC do RES

    Pliki zawierające zasoby (ikony, grafiki, itp), plik RC oraz program BRCC32.EXE należy zgromadzić w jednym katalogu. Następnie należy stworzyć plik wsadowy BAT o przykładowej treści:

    brcc32.exe mojezasoby.rc

    Teraz wystarczy ten plik uruchomić (jak zwykły program). Jeżeli wszystko było w porządku to powstanie plik mojezasoby.res.
    Wykorzystanie pliku wsadowego BAT jest wygodne, ale można również wywołać program BRCC32.EXE w trybie konsolowym (tryb MS-DOS). Jednak wykorzystanie pliku wsadowego jest wygodniejsze, zwłaszcza gdy dokonujemy modyfikacji pliku zasobów.

    do góry
  4. Włączanie do aplikacji pliku RES.

    Mamy już stworzony plik RES. Należy go skopiować do katalogu z naszym programem źródłowym.

    W kodzie źródłowym programu należy wpisać dyrektywę kompilatora (np. na początku sekcji implementacji):

    {$R mojezasoby.res}

    Włączenie pliku RES następuje w momencie kompilacji programu.

    do góry
  5. Dostęp do zasobów.

    Dostęp do zasobów programu można osiągnąć na kilka sposobów. Można wyróżnić trzy najczęściej wykorzystywane:
    1. Wykorzystanie specjalnych procedur (metod) odczytu zasobów,
    2. Wykorzystanie strumieni,
    3. Wykorzystanie wskaźników do zasobów.

    do góry

    Sposób 1 - Wykorzystanie specjalnych funkcji API lub metod do odczytu zasobów.

    Metoda ta jest zdecydowanie najprostsza, jednak wymaga, aby komponent (obiekt) miał odpowiednie metody umożliwiające odczyt zasobów. Zwykle nazwa tych metod ma postać Load...

    Najczęściej wykorzystywane metody:

    Przykład wywołaniaopistypy obiektów
    obrazek.LoadFromResourceID(HInstance,123);Ładowanie zasobu o podanym numerzeTBitmap
    obrazek.LoadFromResourceName(HInstance,'foto3');Ładowanie zasobu o podanej nazwieTBitmap
    Screen.Cursors[12]:=LoadCursor(HInstance,'kur5');Ładowanie kursoraTScreen
    LoadAcceleratorsŁadowanie DestroyAcceleratorTable
    LoadBitmapŁadowanie obrazka
    LoadIcon Ładowanie
    LoadMenuŁadowanie
    LoadStringŁadowanie tekstu

    Metody LoadFromResourceName i LoadFromResourceID są najwygodniejsze dla obrazków. Przy ich użyciu nie ma potrzeby deklarowania żadnych dodatkowych obiektów.

    Zmienna HInstance występująca w parametrach wywołania jest identyfikatorem całego zbioru zasobów dla aktualnej aplikacji.

    do góry

    Sposób 2 - Wykorzystanie strumieni.

    Druga metoda traktuje zasób jako strumień (typu TStream), dzięki czemu można wykorzystać operacje strumieniowe. Ich cechą charakterystyczną jest traktowanie zasobu jak ciągu bajtów bez określonej struktury, dzięki czemu można ich używać do zasobów dowolnych typów. Oczywiście obiekt musi posiadać metody strumieniowe!

    Aby odczytać zasób w ten sposób należy zadeklarować i utworzyć strumień typu TResourceStream podając nazwę i typ zasobu. Następnie wykonać operacje strumieniowe i na końcu zamknąć strumień i usunąć obiekt:

    potok := TResourceStream.Create(hInstance, 'foto5', RT_BITMAP);
    Image1.Picture.Graphic.LoadFromStream(potok);
    potok.Free;
    
    do góry

    Sposób 3 - Wykorzystanie wskaźników do zasobów.

    Ostatnia metoda jest najbardziej uniwersalna, ponieważ umożliwia uzyskanie wskaźnika do obszaru pamięci, w którym umieszczono zasób. Jednak wymaga ona wykonania kilku dodatkowych kroków i jest dosyć uciążliwa w użyciu.
    Z tego względu ograniczę się jedynie do krótkiego opisu procedur, które należy użyć. (Dokładny opis w helpie).

    FunkcjaOpis
    FindResourcezwraca identyfikator zasobu
    SizeOfResourcena podstawie identyfikatora zasobu zwraca jego rozmiar
    LoadResourcena podstawie identyfikatora zasobu umieszcza zasób w pamięci dostępnej dla programu
    LockResourceblokuje pamięć w której umieszczono zasób i zwraca wskaźnik do tego obszaru
    UnLockResourceodblokowuje pamięć zablokowaną przy pomocy LockResource
    FreeResourcezwalnia pamięć przydzieloną przez LoadResource
© mgr inż. Piotr Kotarski, Kalety