[Delphi] TStreams, memory naar stream

Pagina: 1
Acties:

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:57
Hallo,
Via een reeks bewerkingen genereer ik een compleet geheugenblok met data. In dit geval betreft het een gifje. Nu wil ik dit gifje tonen. Nu doe ik dat op de volgende manier:
Delphi:
1
2
3
4
5
6
7
8
9
  Buffer:array[0..8191] of byte;
  TmpBestand:file;
  ...
  assignfile(TmpBestand,'e:\test.gif');
  rewrite(TmpBestand,1);
  BlockWrite(TmpBestand,Buffer[0],Lengte);
  closeFile(TmpBestand);

  gif.LoadFromFile('e:\test.gif');


Iets in mij zegt dat dat efficienter kan via TStreams, maar daarvoor geldt het verhaal van de klok en de klepel.
Na een hoop help-files en internetpagina's te hebben doorlopen, denk ik gebruik te moeten maken van TMemorystream, setpointer. Maar hoe daar kom ik niet uit.

Ik denk dat het iets moet worden van:
Delphi:
1
2
3
4
5
6
7
8
9
  TmpStream:TMemorystream;
  ...
  TmpStream:=TmemoryStream.create;
  TmpStream.SetPointer:=@Buffer;
  TmpStream.Size:=Lengte;
  
  gif.LoadFromStream(TmpStream);
  
  TmpStream.Free;

Maar dat werkt niet. En TStreams is slecht gedocumenteerd, kan iemand mij helpen?

  • CyeZ
  • Registratie: September 2001
  • Laatst online: 22:06

CyeZ

Vroem vroem!!!

Probeer eens (uit m'n hoofd):

Delphi:
1
2
3
4
5
6
7
8
  msTmpStream := TMemoryStream.Create;
  try
    msTmpStream.WriteBuffer(Buffer,Lengte);

    gif.LoadFromStream(msTmpStream); 
  finally
    FreeAndNil(msTmpStream);
  end;

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:57
WriteBuffer heb ik over heen gekeken, maar de oplossing die jij noemt geeft een:
GifException "Premature end of data".

terwijl ik zeker weet dat alle data in het buffer staat.
Dus iets werkt er niet goed met WriteBuffer en LoadFromString;

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Voordat je de loadfromstream doet moet je niet vergeten de positie pointer in de buffer terug aan het begin te zetten m.b.v. seek()

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 22:06

CyeZ

Vroem vroem!!!

Hmm stom dat ik daar niet aan heb gedacht ja |:(

Delphi:
1
2
3
4
5
6
7
8
9
  msTmpStream := TMemoryStream.Create;
  try
    msTmpStream.WriteBuffer(Buffer,Lengte);
    msTmpStream.Seek(soFromBeginning,0);

    gif.LoadFromStream(msTmpStream); 
  finally
    FreeAndNil(msTmpStream);
  end;


Zoiets zal het dan worden.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:57
CyeZ schreef op 10 April 2003 @ 09:57:
Hmm stom dat ik daar niet aan heb gedacht ja |:(

...

Zoiets zal het dan worden.
Dit werkt inderdaad, bedankt. Ik ga zeker kijken of ik nog meer prachts kan vinden in TStreams.
Pagina: 1