Strona 1 z 1

Jak umieścić *.INI w zasobach programu

Nowy postNapisane: poniedziałek, 28 grudnia 2009, 15:16
przez husky83
Witam :)
Chcę mieć możliwość wybrania wersji językowej programu. W tym celu stworzyłem sobie plik lang.ini, w którym przechowuję teksty w poszczególnych językach. Chciałbym ten plik zaszyć w zasobach programu. Czy jest to możliwe? program nie będzie go modyfikował, chcę jedynie z niego odczytywać. Proszę o wskazówki :)

Będę próbował oprzeć się na tej metodzie:
http://cyfbar.republika.pl/differ3.html#differ3
Ale nie wiem czy mi się to uda :) Jest może jakiś inny sposób?

Re: Jak umieścić *.INI w zasobach programu

Nowy postNapisane: poniedziałek, 28 grudnia 2009, 16:08
przez Lamek
Ja to bym to zrobił tak, że użytkownik wybierałby język np. w ComboBoxie czy jak tam chcesz i pod każdy bym oddzielny plik *.ini podpiął. I wtedy np. najpierw bym zapisał:

Kod: Zaznacz cały
{
FILE *FSave;
string nazwa;
char x[30],y[30];

strcpy(x, Label1->Caption.c_str());
strcpy(y, Label2->Caption.c_str());

SaveDialog->Filter = "Config Files (*.ini)|*.ini|";
SaveDialog->FileName = (ComboBox1->Text); //tutaj dajesz możliwość wyboru np. "polski", "angielski" i w efekcie czego tworzysz 2 pliki: "polski.ini" i "angielski.ini"

   if( SaveDialog->Execute() )
   {
      FSave = fopen(SaveDialog->FileName.c_str(), "w");
   }

nazwa = ( SaveDialog->FileName.c_str() );

        {
                fstream outfile;
                outfile.open(nazwa.c_str(), ios::out | ios::binary | ios::app);
                outfile << x << endl;
                outfile << y << endl;
                outfile.close();
        }
fclose(FSave);
}


I potem usuwasz możliwość zapisywania i dodajesz:

Kod: Zaznacz cały
{
string plik;
char x[30],y[30];

plik = (ComboBox1->Text.c_str() )
{
   fstream infile;
   infile.open(plik.c_str(), ios::in | ios::binary);
        {
           infile >> x;
           infile >> y;

           Label1->Text = x;
           Label2->Text = y;
        }
   infile.close();
   }
}


Oczywiście wiadomo, że mnie się nie słucha i ta metoda pewnie by się nie zdała na dłuższą metę, ale ja bym tak kombinował hehe

pozdrawiam

EDIT// No chyba, że Ty już masz plik lang.ini i wtedy Ci nie pomogę, bo najwyraźniej nie doczytałem :P

Re: Jak umieścić *.INI w zasobach programu

Nowy postNapisane: poniedziałek, 28 grudnia 2009, 16:20
przez husky83
Lamek napisał(a):EDIT// No chyba, że Ty już masz plik lang.ini i wtedy Ci nie pomogę, bo najwyraźniej nie doczytałem :P

No to mi nie pomożesz, bo nie doczytałeś drugiego zdania ;) Na upartego mogę to zrobić z 'zewnętrznymi' plikami, ale wolałbym żeby wszystko było w jednym pliku *.exe (na upartego plik ini mogę 'rozpakować' przy uruchomieniu programu i wtedy z niego korzystać, ale wolałbym, żeby wszystko było schowane) :)

Re: Jak umieścić *.INI w zasobach programu

Nowy postNapisane: poniedziałek, 28 grudnia 2009, 21:09
przez Cyfrowy Baron
Z plikami INI to niestety nie da się tego zrobić, ale można by posłużyć się czymś na wzó plików INI, czyli klasą StringList, która to potrafi czytać zapis z pliku zawierający nazwę i wartość do niej przypisaną, czyli coś takiego:


nazwa1=wartość
nazwa2=wartość
nazwa3=wartość




jak widzisz jest to podobne do plików ini, brakuje tylko podziału na sekcje. Więcej o tym przeczytasz w serwisie Cyfrowy Baron w dziale: porady -> TStringList -> Tworzenie listy zawierającej nazwy i wartości przypisane do nazw.

Tak spreparowany plik można umieścić w zasobach programu i czytać z niego bezpośrednio do pamięci, więc bez wypakowywania. Taki plik oczywiście zamiast do obiektu klasy TIniFile musiałbyś wczytywać do obiektu klasy TStringList i z niego dalej pobierać dane.

O umieszczaniu plików tekstowych w zasobach programu (bo to jest plik tekstowy) przeczytasz w serwisie Cyfrowy Baron w dziale: porady -> różne -> Umieszczanie plików tekstowych w zasobach programu. Znajdziesz tam przykład czytania takiego pliku z zasobów do obiektu klasy TStringList.

Re: Jak umieścić *.INI w zasobach programu

Nowy postNapisane: wtorek, 29 grudnia 2009, 15:43
przez husky83
Po małej przeróbce (żeby funkcja LoadTxtFromResource pobierała wg. nazwy zasobu, a nie jego numeru - bo po numerze nie chciało mi zaskoczyć) programik działa :) Wrzucam kilka osobnych plików językowych i pięknie gra i buczy (póki co dwa języki, aktualnie dorabiam wszędzie wyświetlanie poprawnego języka oraz tłumaczę na potrzebne mi języki). Więc po raz kolejny dzięki :)
Pozdrawiam :)