wkompilowanie pliku ini do programu/biblioteki

0

mam plik o strukturze ini który ładowany jest do programu przy starcie. program jest teraz przerabiany na bibliotekę i chcę wszystko wepchnąć do dll-ki. jedyne rozwiązanie jakie mi przychodzi do głowy to wrzucenie tego ini np. do ukrytego memo. tylko chcę aby ta biblioteka była jak najmniejsza więc wszelkie komponenty nie wchodzą w grę. biblioteka jest jedynie obliczeniowa, nie posiada żadnych formatek itp. najlepszym rozwiązaniem byłoby wrzucenie zawartości ini do zmiennej. zrobiłem sobie zmienną tekstową w którą powrzucałem wszytko jak należy wstawiając odpowiednio nowe linie (#13). tylko teraz problem jak to przerzucić do zmiennej TIniFile?
a może jest jeszcze jakiś inny sposób na wrzucenie tych danych do programu i odczytanie jako ini po sekcjach?
z góry dzięki za pomoc. ja na razie na nic nie mogę wpaść

0

że tak zapytam - jeśli wrzucasz to do dll to znaczy, że zawartość się nie zmienia - jak się nie zmienia to po kiego chcesz trzymać to jako ini - nie prościej zadeklarować to jako stałe (ew. resourcestring jeśli to są wszystko napisy)?

0

głównie dlatego że jest tego 673 linie w ini. ponad 50 sekcji z ok. 12 parametrami. a potem to i tak jest sczytywane jako ini. nie chcę przerabiać tego za bardzo i bawić się z pojedynczymi zmiennymi.

0

jeśli chcesz to trzymać w pliku ini i odczytywać przez TIniFile to musisz mieć fizycznie plik na dysku. Wyjęcia są dwa

  1. zostawiasz plik ini jak jest
  2. pakujesz go do zasobów i przed każdym odczytaniem wypakowywujesz, a po odczycie usuwasz
0

Z punktu widzenia to dobre rozwiązanie, za wyjątkiem usuwania po każdym wypakowaniu.

Nie ma potrzeby tego usuwać za każdym razem i znowu tworzyć.

0

A ja bym pytającemy polecił wyedytować moduł z http://www.torry.net/vcl/system/registry/ini32.zip i w
nim dodać jakiś drugi konstruktor CreateFromStream i wposodować że zmienna FFileBuffer załąduje się
ze Streama. Dzięki temu powinieneś bez problemów dodać plik ini do zasobów dllki, a następnie móc go
załądować do ResourceStreama, po czym wywołać dodatkowy (dopisany przez Ciebie - do pliku modułu
inifiles32.pas) CreateStream. Przyznam że piszę póki co bez przetestowania tego rozwiązania, ale myślę
że powinno zadziałać. Oczywiście pozowli to tylko na odczyt danych, dlatego procedury do zapisu oraz do
usuwania danych z ini - spokojnie usunąć. I przy takim rozwiązaniu odpada Ci tymczasowy zapis do pliku.

EDIT: przetestowałem i działa ok. Wprawdzie wywoływałem kod w głownym programie a nie z dllki, ale i z
dllki jak wkompilujesz do niej zasoby powinno działać poprawnie. Poniżej wygląd przykładowego pliku *.ini:

[cosik]
a=testowy napis

Wygląd pliku zasoby.rc dodanego później przy użyciu brcc32.exe

pliczek_ini  rcdata  "test.ini"

Kod modułu streaminifiles.pas jest na http://pastebin.pl/12426 dodajesz go do uses, a w dalej programie:

{$R zasoby.res}
var
  Stream : TResourceStream;
  ResIni : TStreamIniFile;
begin
  Stream := TResourceStream.Create(HInstance, 'pliczek_ini', RT_RCDATA);
  ResIni := TStreamIniFile.Create(Stream);
  Edit1.Text := ResIni.ReadString('cosik', 'a', '');
  ResIni.Free;
end;
0

super. dzięki olesio. jutro to przetestuję bo dzisiaj już nie mam siły. te dane nie będą w żaden sposób edytowanie tylko odczytywane więc nie przeszkadza brak możliwości edycji czy usuwania.

0

Prosze bardzo, tylko zapomniałem dodać że jak wczytujesz zasoby z biblioteki dll, to zamiast Hinstance - w
kopnstruktorxze ResourceStreama musisz podać uchwyt biblioteki dll zwrócony przez LoadLibrary('plik.dll');

0

Ja osobiscie z zaspobami mialem kiedys klopot z nieznanych powodow odczytac sie dane z zasobow za dzialania kompputera dalo raz potem komputer zwracal puste bloki danych z nieznanych mi powodow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1