Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.10;
Скачать: CL | DM;

Вниз

TCompressionStream не возвращает поток в TMemoryStream - почему?   Найти похожие ветки 

 
koha ©   (2007-05-17 13:23) [0]

TCompressionStream не возвращает поток в TMemoryStream - почему?
Хочу написать функцию: CompressStrToStr(StrInp: String): String; , которая на входе принимала строку несжатую на выходе давала сжатую строку. Проблема в том, что использовал поток приемник TMemoryStream, но почему то TCompressionStream ни чего в него не пишет, а если взять TFileStream в место TMemoryStream, то пищет.

Можно ли какую-нибудь штуку придумать за место TFileStream но только в память?


 
Сергей М. ©   (2007-05-17 13:42) [1]

Показывай код ..


 
Reindeer Moss Eater ©   (2007-05-17 13:54) [2]

но почему то TCompressionStream ни чего в него не пишет, а если взять TFileStream в место TMemoryStream, то пищет.

Это еще один "оптический обман".


 
koha ©   (2007-05-17 13:57) [3]

Function CompressStrToStr(StrInp: String; N: Integer): String;
Var
 OutStrm  : TMemoryStream;
 CompStrm : TCompressionStream;
 Count    : Integer;
begin
 if N > 3 then N:=3;  // Степень сжатия
 if N < 0 then N:=0;
 OutStrm := TMemoryStream.Create;
 CompStrm := TCompressionStream.Create(TCompressionLevel(N),OutStrm);
 try
   Count:=CompStrm.Write(StrInp[1],Length(StrInp));
   If Count = 0 then exit;
   OutStrm.Seek(0,soFromBeginning);
   OutStrm.Read(Result[1],OutStrm.Size);
 finally
   CompStrm.Free;
   OutStrm.Free;
 end;
end;


 
koha ©   (2007-05-17 14:05) [4]

- Я так думаю, что это наверно проблема в том, что для TMemoryStream не определен размер буфера, т.е. не выделена память или я ошибаюсь? Но ведь заранее как узнать, что вернет TCompressionStream?


 
MBo ©   (2007-05-17 14:19) [5]

А где задается размер выходной строки?


 
koha ©   (2007-05-17 14:27) [6]

> [5] MBo ©   (17.05.07 14:19)
> А где задается размер выходной строки?


Эту строчку я пропустил, просто забыл когда писал, но всего скорей после этой строки:
//..........    
Count:=CompStrm.Write(StrInp[1],Length(StrInp));
If Count = 0 then exit;
if OutStrm.Size = 0 then exit;
SetLength(Result,OutStrm.Size);
//........................


 
Сергей М. ©   (2007-05-17 14:29) [7]

Function CompressStrToStr(StrInp: String; ALevel: TCompressionLevel): String;
Var
OutStrm  : TMemoryStream;
CompStrm : TCompressionStream;
Count    : Integer;
begin
OutStrm := TMemoryStream.Create;
CompStrm := TCompressionStream.Create(ALevel, OutStrm);
try
  CompStrm.WriteBuffer(StrInp[1],Length(StrInp));
  if OutStrm.Size > 0 then begin
    SetLength(Result, OutStrm.Size);
    Move(OutStrm.Memory^, PChar(Result)^, OutStrm.Size);
  end;
finally
  CompStrm.Free;
  OutStrm.Free;
end;
end;


 
koha ©   (2007-05-17 14:29) [8]

- дело в том, что OutStrm.Size всегда остается в нулевом состоянии так же как и OutStrm.Position


 
Сергей М. ©   (2007-05-17 14:40) [9]

Да и вообще - нет никакого резона заморачиваться именно со стримами, если все гораздо проще:

Function CompressStrToStr(StrInp: String; ALevel: TCompressionLevel): String;
var
 OutBuf: Pointer;
 OutSize: Integer;
begin
 CompressBuf(PChar(StrInp), Length(StrInp), OutBuf, OutSize);
 if OutSize > 0 then
   try
     SetLength(Result, OutSize);
     Move(OutBuf, PChar(Result)^, OutSize);
   finally
      FreeMem(OutBuf);
   end;
end;



 
koha ©   (2007-05-17 15:24) [10]

> [9] Сергей М. ©   (17.05.07 14:40)
Да и вообще - нет никакого резона заморачиваться именно со стримами, если все гораздо проще:


- И то правильно. Как же я сразу не догнал.


 
Сергей М. ©   (2007-05-17 15:31) [11]


> koha ©   (17.05.07 15:24) [10]


Но тут единственное ограничение - невозможность  задать уровень компрессии.

Но и его можно обойти, скопировав код ф-ции CompressBuf (и еще минимально необходимые куски кода, от которых зависит работа этой ф-ции) в код своего приложения и подправить как нужно.



Страницы: 1 вся ветка

Текущий архив: 2007.06.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
2-1178640857
Санёк77
2007-05-08 20:14
2007.06.10
Помогите, пожалуйста, разобраться!


1-1176292741
MVA`
2007-04-11 15:59
2007.06.10
События на кнопках


15-1179214417
iXT
2007-05-15 11:33
2007.06.10
Delphi 10 or TD (TMemo)


2-1179794600
Riply
2007-05-22 04:43
2007.06.10
Объявление variant Record.


5-1155721962
vodvorezlaya
2006-08-16 13:52
2007.06.10
помогите найти компоненты для пработы с USB