🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
5 messages
5 total messages Started by Pancio Tue, 27 Nov 2018 19:08
Odczyt tablicy z DLL
#346884
Author: Pancio
Date: Tue, 27 Nov 2018 19:08
44 lines
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
#346887
Author: konsul41
Date: Wed, 28 Nov 2018 07:01
5 lines
1091 bytes
>      mStream.Seek(SizeOf(Poziom), 0);
>      mStream.ReadBuffer(p, SizeOf(Poziom));

A gdzie masz czytanie pozostałych plansz?
Re: Odczyt tablicy z DLL
#346888
Author: Roman Tyczka
Date: Wed, 28 Nov 2018 07:35
15 lines
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
#346885
Author: zpksoft
Date: Wed, 28 Nov 2018 08:29
53 lines
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
#346886
Author: Pancio
Date: Wed, 28 Nov 2018 16:38
7 lines
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