Thread View: pl.comp.lang.delphi
5 messages
5 total messages
Started by Pancio
Tue, 27 Nov 2018 19:08
Odczyt tablicy z DLL
Author: Pancio
Date: Tue, 27 Nov 2018 19:08
Date: Tue, 27 Nov 2018 19:08
44 lines
2608 bytes
2608 bytes
Witam,
Mam pewien problem i z wielka nadzieja pisze ten post, bo moze ktos moglby mi pomoc.
Mam do napisania mini gre w ktorej jedna plansza ma wymiar 20x20. Utworzylem plik z planszami i wszystko bylo w porzadku, dopoki plansze wczytywalem w ten sposob:
type
Poziom = record
Plansza : array[1..20] of string[20];
end;
var
f : file;
p : Poziom;
begin
AssignFile(f, 'nazwa pliku');
Reset(f, SizeOf(p));
Seek(f, nr_planszy);
BlockRead(f, p, 1);
CloseFile(f);
end;
Teraz jednak mam potrzebe, aby plik z planszami umiescic w wiekszym pliku z innymi zasobami DLL. No i tutaj pojawia sie problem z odczytem, bo dziala on jedynie w przypadku pierwszej planszy. Innych za diabla nie moge wczytac. Robie to tak:
var H : THandle;
Stream : TResourceStream;
mStream : TMemoryStream;
begin
H := LoadLibrary('nazwa_pliku_z_zasobami.dll');
mStream := TMemoryStream.Create;
try
Stream := TResourceStream.Create(H, 'PLANSZE', RT_RCDATA);
mStream.LoadFromStream(Stream);
mStream.Seek(SizeOf(Poziom), 0);
mStream.ReadBuffer(p, SizeOf(Poziom));
Stream.Free;
finally
mStream.Free;
FreeLibrary(H);
end;
end;
Czy moge prosic "ludzi dobrej woli" o pomoc i podpowiedz, co mam poprawic w kodzie. Wedlug mnie problem lezy w procedurze Seek, ale nie wiem, jak ustawic kursor, aby poprzez ReadBuffer wczytaj N-ty poziom gry.
--
Pancio
Re: Odczyt tablicy z DLL
Author: konsul41
Date: Wed, 28 Nov 2018 07:01
Date: Wed, 28 Nov 2018 07:01
5 lines
1091 bytes
1091 bytes
> mStream.Seek(SizeOf(Poziom), 0); > mStream.ReadBuffer(p, SizeOf(Poziom)); A gdzie masz czytanie pozostałych plansz?
Re: Odczyt tablicy z DLL
Author: Roman Tyczka
Date: Wed, 28 Nov 2018 07:35
Date: Wed, 28 Nov 2018 07:35
15 lines
1228 bytes
1228 bytes
On Tue, 27 Nov 2018 11:08:55 -0800 (PST), Pancio wrote: > Poziom = record > Plansza : array[1..20] of string[20]; > end; Taka uwaga na marginesie. Jeśli kombinujesz z zapisem do pliku to lepiej używaj packed record, co prawda dla tego rekordu to nic nie zmieni, ale pozwoli Ci to uniknąć problemów na dalszym etapie rozwoju programu i struktur danych. -- pozdrawiam Roman Tyczka
Re: Odczyt tablicy z DLL
Author: zpksoft
Date: Wed, 28 Nov 2018 08:29
Date: Wed, 28 Nov 2018 08:29
53 lines
3059 bytes
3059 bytes
W dniu wtorek, 27 listopada 2018 20:08:56 UTC+1 użytkownik Pancio napisał:
> Witam,
> Mam pewien problem i z wielka nadzieja pisze ten post, bo moze ktos moglby mi pomoc.
> Mam do napisania mini gre w ktorej jedna plansza ma wymiar 20x20. Utworzylem plik z planszami i wszystko bylo w porzadku, dopoki plansze wczytywalem w ten sposob:
>
> type
> Poziom = record
> Plansza : array[1..20] of string[20];
> end;
>
> var
> f : file;
> p : Poziom;
> begin
> AssignFile(f, 'nazwa pliku');
> Reset(f, SizeOf(p));
> Seek(f, nr_planszy);
> BlockRead(f, p, 1);
> CloseFile(f);
> end;
>
> Teraz jednak mam potrzebe, aby plik z planszami umiescic w wiekszym pliku z innymi zasobami DLL. No i tutaj pojawia sie problem z odczytem, bo dziala on jedynie w przypadku pierwszej planszy. Innych za diabla nie moge wczytac. Robie to tak:
>
> var H : THandle;
> Stream : TResourceStream;
> mStream : TMemoryStream;
> begin
> H := LoadLibrary('nazwa_pliku_z_zasobami.dll');
> mStream := TMemoryStream.Create;
> try
> Stream := TResourceStream.Create(H, 'PLANSZE', RT_RCDATA);
> mStream.LoadFromStream(Stream);
> mStream.Seek(SizeOf(Poziom), 0);
> mStream.ReadBuffer(p, SizeOf(Poziom));
> Stream.Free;
> finally
> mStream.Free;
> FreeLibrary(H);
> end;
> end;
>
> Czy moge prosic "ludzi dobrej woli" o pomoc i podpowiedz, co mam poprawic w kodzie. Wedlug mnie problem lezy w procedurze Seek, ale nie wiem, jak ustawic kursor, aby poprzez ReadBuffer wczytaj N-ty poziom gry.
>
> --
> Pancio
To chyba powinno być jakoś tak:
mStream.Seek(SizeOf(Poziom)*(nrPlanszy-1), soFromBeginning);
Jeśli numerujesz plansze od 0 to bez -1
Paweł
Re: Odczyt tablicy z DLL
Author: Pancio
Date: Wed, 28 Nov 2018 16:38
Date: Wed, 28 Nov 2018 16:38
7 lines
1626 bytes
1626 bytes
> mStream.Seek(SizeOf(Poziom)*(nrPlanszy-1), soFromBeginning); Ju ar emejzing. Wlasnie tego rozwiazania potrzebowalem. Jeszcze raz stokrotne dzięki. -- Pancio
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads