TN035: Przy użyciu wielu plików zasobów i nagłówka, w języku Visual C++

Uwaga ta opisuje, jak edytor zasobów Visual C++ obsługuje wiele plików zasobów i nagłówek pliki udostępnione w jednym projekcie lub współużytkowane przez wiele projektów i w jaki sposób można wykonać zaletą tego wsparcia. Ta Uwaga te pytania:

Należy pamiętać, że jeśli dodać plik dodatkowych zasobów do projektu ClassWizard będzie nie rozpoznaje zasobów w pliku dodanej.

Niniejsza uwaga ma strukturę do udzielenia odpowiedzi na powyższe pytania w następujący sposób:

Omówienie sposobu języka Visual C++ zarządza pliki zasobów i pliki nagłówkowe

Program Visual C++ zarządza jednym.Plik zasobów RC i odpowiadającego.H nagłówka pliku jako ściśle powiązaną para plików. Kiedy edytować i zapisywać zasobów.RC pliku, można pośrednio edytowanie i zapisywanie symbole w odpowiednich.H pliku. Chociaż można otwierać i edytować wiele.RC pliki w czasie (za pomocą interfejsu użytkownika MDI Visual C++), o danym.RC pliku pośrednio edycji dokładnie jeden odpowiedni plik nagłówka.

Symbolu nagłówka pliku

Domyślnie Visual C++ zawsze nazwy odpowiedni plik nagłówka zasobów.H, niezależnie od nazwy pliku zasobów (np. MOJAAPL.RC). Za pomocą polecenia zawiera zestaw plików w programie Visual C++, można zmienić nazwę tego pliku nagłówka aktualizując symbolu nagłówka pliku w oknie dialogowym Ustaw obejmuje.

Tylko do odczytu dyrektyw Symbol

Chociaż Visual C++ edytuje tylko jeden plik nagłówkowy na danym.Plik RC, Visual C++ obsługuje odwołania do symboli zdefiniowanych w dodatkowym nagłówkiem tylko do odczytu plików. Za pomocą polecenia zawiera zestaw plików w programie Visual C++ można określić dowolną liczbę dodatkowym nagłówkiem tylko do odczytu plików w trybie Symbol dyrektyw. Ograniczenie „tylko do odczytu"oznacza, że podczas dodawania nowego zasobu w.RC pliku, można użyć symbolu zdefiniowane w pliku tylko do odczytu nagłówka; ale jeśli usuniesz zasobu, symbol nadal pozostaje zdefiniowane w pliku tylko do odczytu nagłówka. Nie można zmienić wartość liczbowa przypisany symbol tylko do odczytu.

Podczas kompilacji dyrektyw

Visual C++ obsługuje również zagnieżdżanie plików zasobów, gdy jedna.RC pliku jest # include'd w innym. Podczas edycji danego.RC pliku przy użyciu języka Visual C++, wszystkie zasoby w plikach # include'd nie są widoczne. Jednak podczas kompilacji.Plik RC, również są kompilowane pliki # include'd. Za pomocą polecenia zawiera zestaw plików w programie Visual C++ można określić dowolną liczbę # include'd.RC pliki w czasie kompilacji dyrektyw.

Należy zauważyć, co się dzieje, jeśli czytasz w Visual C++.RC plik, który zawiera # jest inny.RC jest plik nie określono jako dyrektywy w czasie kompilacji. Taka sytuacja może powstać po przywróceniu do programu Visual C++.RC plik, który użytkownik miał zostały wcześniej utrzymania ręcznie przy użyciu edytora tekstu. Kiedy Visual C++ odczytuje # include'd.RC pliku, to łączy zasoby # include'd do obiektu nadrzędnego.Plik RC. Po zapisaniu obiektu nadrzędnego.Plik RC, # include instrukcji, w rezultacie, zostaną zastąpione przez zasoby # include'd. Jeśli nie chcesz, aby to scalenie zdarza się, należy usunąć # zawierać oświadczenie z obiektu nadrzędnego.RC pliku przed do czytania w Visual C++; następnie przy użyciu języka Visual C++, dodać ponownie to samo # zawierać oświadczenie jako dyrektywy w czasie kompilacji.

Program Visual C++ zapisuje w.RC pliku trzy rodzaje powyżej zestaw zawiera informacje (Symbol nagłówka pliku, otwieraniu Symbol dyrektywy i dyrektyw kompilacji) # obejmować dyrektyw i TEXTINCLUDE zasobów. TEXTINCLUDE zasobów, szczegółowa implementacja, której nie można normalnie konieczne dla przeciwdziałania, są wyjaśnione w Sposób Visual C++ zarządza zestaw zawiera informacje.

Analiza utworzone przez AppWizard.RC i.H plików

Badanie kodu aplikacji, wyprodukowany przez AppWizard zapewnia wgląd jak Visual C++ zarządza wieloma pliki zasobów i plików nagłówkowych. Fragmenty kodu poniżej przebadane są z aplikacji MYAPP, wyprodukowany przez AppWizard za pomocą opcji domyślne.

Aplikacja utworzona AppWizard używa wielu plików zasobów i wiele plików nagłówkowych, jak w poniższym diagramie:

nbsp;  ZASÓB.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC                               
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Można przeglądać te wiele relacji pliku za pomocą polecenia programu Visual C++ pliku/zestaw zawiera.

MOJAAPL.RC

Plik zasobów aplikacji, który można edytować za pomocą programu Visual C++.

ZASÓB.H jest plik nagłówkowy specyficzne dla aplikacji. Ma zawsze nazwę zasobu.H przez AppWizard, zgodne z Visual C++ domyślnej nazwy pliku nagłówka. # Include dla tego pliku nagłówka jest pierwsza instrukcja w pliku zasobów (MOJAAPL.RC):

//Microsoft visual C++ generowane zasobu skryptu
//
# include "resource.h"

RES\MYAPP.RC2

Zawiera zasoby, które nie będą edytowane przez Visual C++, ale zostaną uwzględnione w finale skompilowany.Plik EXE. AppWizard tworzy żadnych takich zasobów domyślnie, ponieważ języka Visual C++ można edytować wszystkie standardowe zasobów, w tym zasobów wersji (nową funkcję w tej wersji). Pusty plik jest generowana przez AppWizard, w przypadku, gdy chcesz dodać własne niestandardowe zasobów sformatowany do tego pliku.

Jeśli używasz niestandardowego zasobów sformatowany, można dodać je do RES\MYAPP.RC2 i edytować za pomocą edytora tekstu języka Visual C++.

AFXRES.RC i AFXPRINT.RC zawiera standardowe zasoby wymagane przez niektórych cech ram. Jak RES\MYAPP.RC2, te dwa pliki zasobów dostarczanych do ram są # include'd na końcu MOJAAPL.RC i są określone w dyrektywach kompilacji, w oknie dialogowym Ustaw obejmuje. W związku z tym nie jest bezpośrednio wyświetlania lub edytowania tych zasobów ramy podczas edycji MOJAAPL.RC w Visual C++, ale są kompilowane do pliku binarnego aplikacji.RES pliku i wersja ostateczna.Plik EXE. Więcej informacji na temat zasobów standardowych ram, w tym procedur modyfikacji, zobacz technicznych przypis 23.

AFXRES.H definiuje standardowy symbole, takie jak ID_FILE_NEW, używane w ramach i specjalnie używane w AFXRES.RC. AFXRES.H, również # include w WINRES.H, który zawiera podzbiór systemu Windows.H, które są wymagane przez Visual C++ generowane.RC pliki jak również AFXRES.RC. Symbole zdefiniowany w AFXRES.H są dostępne podczas edycji pliku zasobu zastosowanie (MOJAAPL.RC). Na przykład ID_FILE_NEW jest używany do nowego pliku elementu menu w katalogu MYAPP.RC w menu zasobów. Nie można zmienić ani usunąć te określone ramy symbole.

Dołączanie plików dodatkowych nagłówków

Aplikacja utworzona AppWizard zawiera tylko dwa pliki nagłówkowe: zasób.H i AFXRES.H. tylko zasobów.H jest specyficzny dla aplikacji. Może zajść potrzeba włączenia dodatkowym nagłówkiem tylko do odczytu plików w następujących przypadkach

Plik nagłówka jest dostarczana przez zewnętrznego źródła lub chcesz udostępnić plik nagłówkowy wśród wielu projektów lub wielu części tego samego projektu.

Plik nagłówkowy ma formatowania oraz komentarze, że nie chcesz Visual C++ zmienić lub odfiltrować podczas zapisywania pliku. Na przykład, być może należy zachować # zdefiniować jego używający takich jak arytmetyka symboliczne:

# define RED 0
# define BLUE 1
# define GREEN 2
# define ID_COLOR_BUTTON 1001
# define ID_RED_BUTTON (ID_COLOR_BUTTON + RED)
# define ID_BLUE_BUTTON (ID_COLOR_BUTTON + BLUE)
# define ID_GREEN_BUTTON (ID_COLOR_BUTTON + zielony)

Może zawierać dodatkowe nagłówka tylko do odczytu plików za pomocą polecenia plik zestaw zawiera określenie # include instrukcji jako druga dyrektywa Symbol otwieraniu, jak w:

# include "afxres.h"
# include "second.h"

Jak to wygląda teraz nowy diagram relacji pliku:

nbsp;                  AFXRES.H ZASOBÓW.H SEKUNDY.H                    
          \       /                              
           \     /                                
          MYAPP.RC   
              |                                
              |                              
        RES\MYAPP.RC2 AFXRES.RC AFXPRINT.RC & nbsp
 

Udostępnianie pliku nagłówkowym między dwoma.Pliki RC

Może chcesz udostępnić plik nagłówkowy między dwoma.RC plików, które znajdują się w różnych projektach, lub tego samego projektu. Aby to zrobić, po prostu zastosować opisanej powyżej zarówno techniki otwieraniu dyrektyw.Pliki RC. W przypadku gdy dwa.RC pliki są do różnych zastosowań (różnych projektów), wynik jest przedstawione na poniższym diagramie:

nbsp;    ZASÓB.H AFXRES.H ZASOBÓW.H (za MYAPP1) drugi.H   (for MYAPP2)             
          \       /     \       /           
           \     /       \     /             
          MYAPP1.RC MYAPP2.RC                 
           /    \        /     \                   
          /      \      /       \            
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2 AFXPRINT.RC & nbsp
 

Przypadek, gdy drugi plik nagłówka jest współużytkowana przez dwa.Poni˝ej RC pliki w tej samej aplikacji (projekt).

Korzystanie z wielu plików zasobów w tym samym projekcie

Visual C++ i kompilatora zasób obsługi wielu.RC pliki w tym samym projekcie poprzez # należą do jednej.RC plik w innym. Zagnieżdżanie wielu jest dozwolone. Istnieją różne powody aby podzielić zasoby projektu na wielu.Pliki RC:

Możesz # zawierać sekundy.RC w dyrektywach kompilacji, w oknie dialogowym Ustaw obejmuje:

# i&nclude "res\myapp.rc2"nbsp; / / nie - Visual C++ edytować zasoby
# include "second.rc" / / drugi.RC PLIKU

# include "afxres.rc" / / standardowe składniki
# include "afxprint.rc" / / drukowanie i wydruku podgląd zasobów

Wyniki przedstawiono na poniższym diagramie:

nbsp;  ZASÓB.H AFXRES.H                    
          \       /                              
           \     /                                
          MYAPP.RC
              |                                
              |                              
        RES\MYAPP.RC2
        DRUGI.RC AFXRES.RC AFXPRINT.RC & nbsp
 

Za pomocą dyrektyw kompilacji, możesz organizować zasoby Visual C++-edytowalne i nieedytowalne w wielu.Pliki RC, gdzie MYAPP "kapitan".RC does, ale # obejmować inne.Pliki RC. Jeśli używasz projektu Visual C++.MAK pliku, możesz powinny obejmować "wzorzec".RC plików w projekcie tak, aby wszystkie zasoby # include'd są opracowywane z aplikacji.

Stosowanie plików nieedytowalne języka Visual C++

Utworzone przez AppWizard RES\MYAPP.Plik RC2 jest przykładowy plik zawierający zasoby, które można wykonać nie chcieć przypadkowo odczytu w Visual C++ i następnie napisać go z powrotem utraty informacje o formatowaniu. Do ochrony przed tym, musimy umieścić następujące wiersze w początku RES\MYAPP.Plik RC2:

#ifdef APSTUDIO_I&NVOKED
 nbsp;  użytkownika tego pliku nie jest edytowalny przez Visual C++
#ENDIF //APSTUDIO_INVOKED

Kiedy kompiluje Visual C++.Plik RC, definiuje APSTUDIO_INVOKED , a także RC_INVOKED. Jeśli struktura AppWizard utworzony plik jest uszkodzony i Visual C++ odczytuje powyżej linii użytkownika, zgłasza błąd krytyczny i przerwać odczyt.Plik RC.

Zarządzanie symbole współużytkowane przez wiele Visual C++ edytowane.Pliki RC

Dwie kwestie powstają, gdy użytkownik podziału zasobów w wielu.RC pliki, które chcesz edytować osobno w Visual C++:

Poniższy diagram ilustruje organizacji.RC i.Pliki H, które zajmuje się pierwsze wydanie:

nbsp;             MOJAAPL.RC
             /         \
            /           \
MYSTRS.H / MYSHARED.H \ MYME&NUS.H
     \    /    /      \   \    \
      \  /    /        \   \    \
   MYSTRS.RC MYMENUS.RC

W tym przykładzie ciąg zasobów są przechowywane w jednym pliku, MYSTRS.RC i menu są przechowywane w innym MYMENUS.RC. Niektóre symbole, takie jak w przypadku polecenia, może być dzielony między tymi dwoma plikami. Na przykład ID_TOOLS_SPELL może być Identyfikatorem polecenia menu dla elementu pisowni, w menu Narzędzia; i może być również identyfikator ciąg wiersza polecenia wyświetlane w ramach na pasku stanu okna głównego aplikacji.

ID_TOOLS_SPELL symbol jest przechowywana w pliku nagłówkowym udostępnionego, MYSHARED.H. można utrzymać ten plik nagłówka udostępnionego ręcznie za pomocą edytora tekstów; Program Visual C++ nie bezpośrednio go edytować. W dwóch zasobów plików MYSTRS.RC i MYMENUS.RC, można określić # obejmują MYSHARED.H w dyrektywach tylko do odczytu dla MOJAAPL.RC, za pomocą polecenia plik zestaw zawiera, zgodnie z wcześniejszym opisem.

Jest najbardziej odpowiednim do przewidzenia symbol będzie udostępniać przed próbą użycia go do identyfikacji każdego zasobu. Dodać symbol do pliku udostępnionego nagłówka i, jeśli jeszcze tego nie zrobiono # include'd pliku nagłówkowym udostępniony w trybie dyrektyw dotyczących.RC pliku, to zrobić przed użyciem symbolu. Jeśli przewidujesz nie, udostępnianie symbol w ten sposób, a następnie trzeba będzie ręcznie (przy użyciu edytora tekstu) przenieś # definiowanie instrukcji dla symbolu, powiedzieć, MYMENUS.H do MYSHARED.H przed użyciem go w MYSTRS.RC.

Kiedy można zarządzać symbole wielokrotności.RC pliki, możesz również musi pomóc Visual C++ należy unikać przypisywania ten sam identyfikator wartości numeryczne do zasobów (symbole). Dla dowolnego, biorąc pod uwagę.Plik RC, Visual C++ stopniowo przypisuje identyfikatory w każdej z czterech identyfikator domeny. Między edycji sesje, Visual C++ przechowuje informacje o ostatnio identyfikator przypisany w każdej z domen w pliku nagłówka symbolu.Plik RC. Oto, co wartości APS_NEXT są puste (nowe).Plik RC:

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 101
# define _APS_NEXT_COMMAND_VALUE 40001
# define _APS_NEXT_CONTROL_VALUE 1000
# define _APS_NEXT_SYMED_VALUE 101

_APS_NEXT_RESOURCE_VALUE jest następna wartość symboli, używanego do okna dialogowego zasobu, menu zasobów i tak dalej. Prawidłowy zakres dla wartości symboli zasobu jest 1 do 0x6FFF.

_APS_NEXT_COMMAND_VALUE jest następna wartość symboli, używany do identyfikacji polecenia. Prawidłowy zakres dla wartości symboli polecenia jest 0x8000 do 0xDFFF.

_APS_NEXT_CONTROL_VALUE jest następna wartość symboli, używany do sterowania okno dialogowe. Prawidłowy zakres dla okna dialogowego Sterowanie symbolu wartości jest 8 do 0xDFFF.

_APS_NEXT_SYMED_VALUE jest wartością symbolu dalej, że zostanie wydane, gdy ręcznie przypisać wartość symboli przy użyciu nowego polecenia w przeglądarce Symbol.

Program Visual C++ zaczyna się nieco wyższe wartości najniższej prawnych wartość, gdy tworzenia nowego.Plik RC. AppWizard będzie również zainicjowanie tych wartości do czegoś bardziej odpowiednie dla MFC aplikacjach. Aby uzyskać więcej informacji na temat zakresy wartości identyfikatorów zobacz technicznych 20 Uwaga.

Obecnie za każdym razem, aby utworzyć nowy plik zasobów, nawet w tym samym projekcie Visual C++ definiuje te same wartości _APS_NEXT_ . Oznacza to, że jeśli dodasz, powiedzmy wielu dialogs w dwóch różnych.Pliki RC, jest bardzo prawdopodobne, że tym samym # zdefiniować wartości zostaną przypisane do różnych okien dialogowych. Na przykład IDD_MY_DLG1 w pierwszym.RC pliku może być przypisane tym samym numerem, 101, jako IDD_MY_DLG2 w drugiej.Plik RC.

Aby tego uniknąć, należy zarezerwować oddzielny zakres numeryczny dla każdego z czterech dziedzin identyfikatory w odpowiednich.Pliki RC. W tym celu ręczne aktualizowanie wartości _APS_NEXT w każdym.RC plików przed rozpoczęciem, dodawanie zasobów. Na przykład jeśli pierwszym.RC plik używa domyślnych wartości _APS_NEXT , a następnie można przypisać następujące wartości _APS_NEXT do drugiego.Plik RC:

# define _APS_&NEXT_RESOURCE_VALUEnbsp; 2000
# define _APS_NEXT_COMMAND_VALUE 42000
# define _APS_NEXT_CONTROL_VALUE 2000
# define _APS_NEXT_SYMED_VALUE 2000

Oczywiście jest nadal możliwe, że Visual C++ przypisze tak wiele identyfikatorów w akapicie pierwszym.RC pliku, że wartości liczbowe zacząć nakładają się te, które są zastrzeżone dla drugiego.Plik RC. Należy zarezerwować wystarczająco duże zakresy, tak, że tak nie.

Zarządzanie zależnościami między.RC.CPP i.H plików

Gdy zapisywany jest Visual C++.Plik RC, również zapisuje zmiany symbolu do odpowiednich zasobów.H pliku. Z sieci.Pliki CPP, które odwołują się do zasobów.RC pliku musi # zawiera zasób.Plik H, zazwyczaj z poziomu projektu głównego nagłówka pliku. Prowadzi to do niepożądane działania uboczne z powodu do zarządzania projektami wewnętrzne środowisko programistyczne, które skanuje pliki źródłowe dla nagłówka zależności. Za każdym razem, aby dodać nowy symbol w Visual C++, wszystkie.Plik CPP # include zasobów.H musi zostać zrekompilowane.

Program Visual C++, celu obejścia zależności zasobu.H przez zawierające następujące uwagi jako pierwszy wiersz zasobu.H pliku:

 //{{NO_DEPENDENCIES}}

Środowisko programistyczne interpretuje komentarz, odrzucając zmiany zasobów.H tak że zależnych.CPP pliki nie muszą zostać zrekompilowane.

Visual C++ zawsze dodaje //{{NO_DEPENDENCIES}} komentarz linii.RC pliku podczas zapisywania pliku. W niektórych przypadkach obejścia kompilacji zależności zasobu.H może prowadzić do błędów czasu wykonywania pozostał niezauważony w czasie łącze. Na przykład jeśli używasz przeglądarki Symbol zmienić wartość liczbowa przypisany symbol dla zasobu, zasób będzie nie być poprawnie znaleziono i załadowany w aplikacji wykonywalnej jeżeli.CPP pliku odnoszące się do zasobu nie jest ponownie kompilowana. W takich przypadkach należy wyraźnie kompilować dowolny.Pliki CPP, które znasz mają wpływ zmiany symbolu w ZASOBIE.H lub wybierz odbudować wszystkie. Jeśli masz potrzebę często zmieniać wartości symboli dla pewnej grupy zasobów, prawdopodobnie znajdziesz go bardziej wygodne i bezpieczniejsze z tych symboli do pliku oddzielnym nagłówka tylko do odczytu, zgodnie z opisem w sekcji wyżej w tym dodatkowe pliki nagłówkowe.

W jaki sposób program Visual C++ zarządza zestaw zawiera informacje

Zgodnie z powyższym opisem, w menu Plik polecenie Zestaw zawiera pozwala można określić trzy rodzaje informacji:

Poniżej opisano, jak Visual C++ przechowuje te informacje w.Plik RC. Nie trzeba te informacje za pomocą programu Visual C++, ale może zwiększyć zrozumienie tak, aby bardziej zwracali można ustawić zawiera funkcję.

Każda z powyższych trzech typów zestaw zawiera informacje są przechowywane w.RC plików w dwóch formach: (1) jak # obejmują lub innych dyrektyw interpretable przez kompilator zasobów i (2) jako specjalne TEXTINCLUDE zasoby interpretable tylko przez Visual C++.

Celem zasobu TEXTINCLUDE jest bezpiecznie przechowywać ustawić zawierają informacje w formie, która jest łatwo presentable okno dialogowe zestaw zawiera Visual C++. TEXTINCLUDE jest Typ zasobu określonego przez Visual C++. Program Visual C++ rozpoznaje trzech określonych środków TEXTINCLUDE, które zasobu, numery identyfikacyjne 1, 2 i 3:

TEXTINCLUDE zasobów i.d. Zestaw zawiera informacje typu
1 Symbolu nagłówka pliku
2 Tylko do odczytu dyrektyw Symbol
3 Podczas kompilacji dyrektyw

Każdy z trzech rodzajów zestaw zawiera informacje ilustruje domyślnie MOJAAPL.RC i zasobów.H pliki utworzone przez AppWizard, jak opisano poniżej. Dodatkowe \0 i „"tokeny między blokami BEGIN i END są wymagane przez RC składni do określania zerowej zakończonych ciągi i znak podwójnego cudzysłowu odpowiednio.

Symbolu nagłówka pliku

Forma informacji symbolu nagłówka pliku interpretowane przez kompilator zasobu jest po prostu # zawierać oświadczenie:

# include "resource.h"

Jest odpowiednich zasobów TEXTINCLUDE:

1 TEXTINCLUDE DISCARDABLE
BEGIN
   # resource.h\0 "
KONIEC

Tylko do odczytu dyrektyw Symbol

Tylko do odczytu dyrektyw Symbol znajdują się w górnej części MOJAAPL.RC w następującej formie interpretable przez kompilator zasobów:

# include "afxres.h"

Jest odpowiednich zasobów TEXTINCLUDE:

2 TEXTINCLUDE DISCARDABLE
BEGIN
   "# include" "afxres.h""\r\n"
   "\0"
KONIEC

Podczas kompilacji dyrektyw

Podczas kompilacji dyrektyw są dołączane na końcu MOJAAPL.RC w następującej formie interpretable przez kompilator zasobów:

#ifndef APSTUDIO_I&NVOKED
///////////////////////
//
/ Z TEXTINCLUDE 3
//
# include "res\myapp.rc2"nbsp; / / nie - Visual C++ edytować zasoby

# include "afxres.rc" / / standardowe składniki
# include "afxprint.rc" / / drukowanie i wydruku podgląd zasobów
#ENDIF / / nie APSTUDIO_INVOKED

Dyrektywa APSTUDIO_INVOKED #ifndef nakazuje Visual C++, aby pominąć kompilacji dyrektyw.

Jest odpowiednich zasobów TEXTINCLUDE:

3 TEXTI&NCLUDE DISCARDABLE
BEGIN
"# include" "res\myapp.rc2""nbsp; / / nie - Visual C++ edytowane resources\r\n "
"\r\n"
"# include""afxres.rc" "/ / standardowe components\r\n"
"# include""afxprint.rc" "/ / drukowanie i wydruku podgląd resources\r\n"
"\0"
KONIEC

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index