Jak umieścić *.INI w zasobach programu

dział ogólny

Jak umieścić *.INI w zasobach programu

Nowy postprzez husky83 » poniedziałek, 28 grudnia 2009, 15:16

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?
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

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

Nowy postprzez Lamek » poniedziałek, 28 grudnia 2009, 16:08

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
Avatar użytkownika
Lamek
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): sobota, 19 grudnia 2009, 03:35
Podziękował : 3
Otrzymał podziękowań: 1
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 6
    NieznanyNieznana

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

Nowy postprzez husky83 » poniedziałek, 28 grudnia 2009, 16:20

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) :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

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

Nowy postprzez Cyfrowy Baron » poniedziałek, 28 grudnia 2009, 21:09

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

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

Nowy postprzez husky83 » wtorek, 29 grudnia 2009, 15:43

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 :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości

cron