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óryDo 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 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óryPliki 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:
W treści pliku RC mogą się znaleźć komentarze: /* komentarz */. Przykład pliku RC:
Typ zasobu określa format włączanego pliku. Najważniejsze typy:
Typ zasobu | Opis |
---|---|
BITMAP | bitmapa - plik typu BMP |
CURSOR | kursor - plik typu CUR |
ICON | ikona - plik typu ICO |
RCDATA | Plik innego typu (dowolny) |
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:
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.
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):
Włączenie pliku RES następuje w momencie kompilacji programu.
do góryDostę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.
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łania | opis | typy obiektów |
---|---|---|
obrazek.LoadFromResourceID(HInstance,123); | Ładowanie zasobu o podanym numerze | TBitmap |
obrazek.LoadFromResourceName(HInstance,'foto3'); | Ładowanie zasobu o podanej nazwie | TBitmap |
Screen.Cursors[12]:=LoadCursor(HInstance,'kur5'); | Ładowanie kursora | TScreen |
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óryDruga 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
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).
Funkcja | Opis |
---|---|
FindResource | zwraca identyfikator zasobu |
SizeOfResource | na podstawie identyfikatora zasobu zwraca jego rozmiar |
LoadResource | na podstawie identyfikatora zasobu umieszcza zasób w pamięci dostępnej dla programu |
LockResource | blokuje pamięć w której umieszczono zasób i zwraca wskaźnik do tego obszaru |
UnLockResource | odblokowuje pamięć zablokowaną przy pomocy LockResource |
FreeResource | zwalnia pamięć przydzieloną przez LoadResource |