🚀 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 11:08
Odczyt tablicy z DLL
#294464
Author: Pancio
Date: Tue, 27 Nov 2018 11:08
43 lines
1397 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
#294468
Author: zpksoft
Date: Wed, 28 Nov 2018 00:29
61 lines
1771 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
#294466
Author: "konsul41@wp.pl"
Date: Wed, 28 Nov 2018 08:01
4 lines
130 bytes
>      mStream.Seek(SizeOf(Poziom), 0);
>      mStream.ReadBuffer(p, SizeOf(Poziom));

A gdzie masz czytanie pozostałych plansz?
Re: Odczyt tablicy z DLL
#294467
Author: Roman Tyczka
Date: Wed, 28 Nov 2018 08:35
14 lines
414 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
#294469
Author: Pancio
Date: Wed, 28 Nov 2018 08:38
6 lines
165 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