Czy jest jakaś opcja żeby przechowywac plik w programie? i jesli to możliwe wgrać go do pamięci lub mieć dostęp tam gdzie jest przechowywany. Chce żeby ten plik był razem z programem.
To zależy do czego Ci on potrzebny;
Jeżeli plik potrzebny jest tylko do odczytu danych, możesz go umieścić w zasobach pliku wykonywalnego oraz ładować do programu na podstawie jego nazwy lub identyfikatora liczbowego; Więcej na ten temat możesz wyczytać w dokumentacji i w materiałach w sieci;
Jeżeli plik ma służyć także do zapisu danych (modyfikacji) to zasoby odpadają, bo póki proces aplikacji działa, blokuje możliwość modyfikacji pliku wykonywalnego, który ten proces uruchomił; W takim przypadku dane będziesz musiał trzymać w zewnętrznym pliku dyskowym i taszczyć go za plikiem exe; Nie jest to złe rozwiązanie, o ile weźmiesz pod uwagę np. ograniczenia narzucone przez UAC lub typ nośnika, z którego uruchamiany jest program;
Tak więc jeśli potrzebujesz konkretnej porady to podaj więcej szczegółów na temat tego programu.
Plik ma służyć tylko do odczytu. Są to pewne dane do których muszę mieć dostęp. Jak załądować taki pik za pomocą identyfikatora liczbowego? oraz jak go załączyć.
Poczytaj o klasie TResourceStream
. W Google jak wspominał @babubabu jest mnóśtwo przykładów. Jeżeli chodzi o identyfikator liczbowy, to za pewne chodzi Ci o konstruktor CreateFromID
tej klasy.
@piter2004 - w dalszym ciągu nie podałeś jaki to plik, więc nie wiadomo którą klasę wykorzystać; Poza tym, jeżeli ładowanie na podstawie ID zasobu nie jest wymagane to skorzystaj z ładowania na podstawie nazwy (czyli TResourceStream.Create
) - będzie czytelniej; Nie wiemy też której wersji Delphi używasz, bo tego też nie podałeś; A różne wersje środowiska posiadają różne RTL i VCL, więc i różne klasy z różną ilością metod są możliwe do wykorzystania;
Niektóre klasy do obsługi plików mogą posiadać w sobie metody ładujące kontent z zasobów; Gdybyś używał Free Pascala, a tym plikiem był konfig w formacie TreeStructInfo, zawartość mógłbyś załadować jedną metodą, bez zbędnych pierdół, strumieni itd.:
var
tsiConfig: TTSInfoTree;
begin
tsiConfig := TTSInfoTree.Create();
try
tsiConfig.LoadFromResource(HInstance, 'ResConfig', 'RT_TSINFO'); // tyle wystarczy
{..}
Ale nie korzystasz ani z jednego, ani z drugiego, więc albo podaj bardziej szczegółowe informacje na temat środowiska i tego magicznego pliku, albo sam poszukaj odpowiedniej klasy i sposobu na załadowanie zawartości pliku z zasobu.
Używam delphi 2009. Plik to zwykły plik binarny gdzie sa zapisane tylko dane hexadecymalnie. Ma on rozmiar $22000 bajtów.
Nie ma czegoś takiego jak "zwykły plik binarny" - każdy plik to plik binarny, Twój co najwyżej jest amorficzny;
Podaj strukturę tego pliku i typy danych, które wymagane są do odczytu informacji.
Plik jest typem amorficznym. Jest to program wsadowy do układu scalonego który programuje przez usb. Czyli jak go odczytam musze go załadowaywac do pamięci skąd go wyśle poprzez usb.
Nie, plik jest amorficzny lub jego zawartość - nie typ :]
W takim razie dane w postaci końcowej jakiego mają być typu? Chodzi o to, jaki typ danych ma być wykorzystany do transmisji; Jeżeli ma to być po prostu ogólny bufor danych (po prostu przesyłasz oryginalną zawartość pliku) to skorzystaj z klasy TResourceStream
oraz jej właściwości Memory
- ona zwróci wskaźnik na bufor.
To jest ogólny bufor danych. Tylko zastanawiam się jak ja mam połaczyć ten plik z moim plikiem wynikowym exe.
No to najpierw poczytaj na ten temat, bo wszystko jest w kursach; Nie wiem czy Delphi w wersji którą posiadasz, ma jakieś do tego narzędzie - pod Delphi7 można zrobić to w ten sposób (sposob uniwersalny dla Delphi i Lazarusa):
- tworzysz plik .rc z informacjami dla kompilatora zasobów (sprawdź w sieci jak wygląda składnia tych plików),
- odpalasz z konsoli kompilator brcc32.exe, podając w argumencie przygotowany plik .rc, w wyniku czego kompilator zasobów tworzy plik z rozszerzeniem .res,
- ten plik (.res) dołączasz w kodzie któregoś modułu, przykład:
{$RESOURCE MyResource.res}
;
Ja to robiłem w ten sposób, ale Delphi które posiadasz może mieć do tego lepsze mechanizmy, niż ręczne tworzenie takich plików; Być może można od razu dołączyć plik .rc, a Delphi go skompiluje i dołączy do programu - nie wiem, FPC posiada taką funkcję (autokompilacji plików .rc przy kompilowaniu całego projektu).
No faktycznie jest taka opcja projekt/resources...
Jeszcze muszę się dowiedzieć jak skopiować plik pod określony adres w pamięci lub jak odczytać plik odczytujac jak zwykły bajt po bajcie.
Zrobiłem :)
RS := TResourceStream.Create(HInstance,'Resource_1', RT_RCDATA);
RS.Read(MemoryPointer^,rs.Size);
RS.Free;
Polecam link do tematu resources:
http://lukashp.pl/Artykul/Programowanie/Delphi/delphi-strumienie-tresourcestream
Dziekuję szczególnie furious programming za zaangażowanie w pomoc początkowo byłem przerażony dołaczonym zdjęciem ale faktycznie masz dużą wiedze i chętnie się z nia dzielisz:).
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.