Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование ZLib [D7, WinXP]


Виталий Панасенко ©   (2007-03-22 15:45:00) 

Вот мой тестовый код:
procedure TForm1.Button1Click(Sender: TObject);
var
InStream,
OutStream : TMemoryStream;
Z : TCompressionStream;
Size : Int64;
begin
 InStream := TMemoryStream.Create();
 RichEdit1.Lines.SaveToStream(InStream);
 if InStream.Size<>0 then
   begin
     OutStream := TMemoryStream.Create();
     Z := TCompressionStream.Create(clMax, OutStream);
     InStream.Position := 0;
     Size := Z.CopyFrom(InStream, 0);
     Form1.Caption := IntToStr(Size);
     Z.Free;
     //OutStream.SaveToFile('c:\stream');
     RichEdit.Lines.LoadFromStream(OutStream);
     OutStream.Free;
   end;
 InStream.Free;
end;


Это из фирменного модуля intrcptu.pas.
Отличия только в том, что OutStream пишет в IDataBlock
{
 DataOut is called whenever data is leaving the client or server.  Use this
 procedure to compress or encrypt data.
}
procedure TDataCompressor.DataOut(const Data: IDataBlock);
var
 InStream, OutStream: TMemoryStream;
 ZStream: TCompressionStream;
 Size: Integer;
begin
 InStream := TMemoryStream.Create;
 try
   { Skip BytesReserved bytes of data }
   InStream.Write(Pointer(Integer(Data.Memory) + Data.BytesReserved)^, Data.Size);
   Size := InStream.Size;
   if Size = 0 then Exit;
   OutStream := TMemoryStream.Create;
   try
     ZStream := TCompressionStream.Create(clFastest, OutStream);
     try
       ZStream.CopyFrom(InStream, 0);
     finally
       ZStream.Free;
     end;
     { Clear the datablock, then write the compressed data back into the
       datablock }
     Data.Clear;
     Data.Write(Size, SizeOf(Integer));
     Data.Write(OutStream.Memory^, OutStream.Size);
   finally
     OutStream.Free;
   end;
 finally
   InStream.Free;
 end;
end;

Но мне так и не удалось в моем примере упаковать данные - получаю пустой поток. В Сети находил примеры - вроде как все с моим сходится.. А не работает...


Johnmen   (2007-04-13 14:58:00) [1]

Чё за НеХитрый реаниматор?
:)


НеХитрый   (2007-04-13 14:24:00) [2]

попробуй такой код

procedure TForm1.Button1Click(Sender: TObject);
var
InStream,
OutStream : TMemoryStream;
Z : TCompressionStream;
Size : Int64;
begin
InStream := TMemoryStream.Create();
RichEdit1.Lines.SaveToStream(InStream);
if InStream.Size<>0 then
  begin
    OutStream := TMemoryStream.Create();
    Z := TCompressionStream.Create(clMax, OutStream);
    InStream.Position := 0;
    Size := Z.CopyFrom(InStream, 0);
    Form1.Caption := IntToStr(Size);
    Z.Free;
    //OutStream.SaveToFile('c:\stream');
    //Вот эту строчку добавь:
    OutStream.Seek(0, soFromBeginning);
   
    RichEdit.Lines.LoadFromStream(OutStream);
    OutStream.Free;
  end;
InStream.Free;
end;


Виталий Панасенко(дом)   (2007-03-22 23:12:00) [3]


> umbra ©   (22.03.07 17:25) [9]
>
>
> > >      RichEdit.Lines.LoadFromStream(OutStream);
> >
> > Файл нулевой длинны, в RichEdit тоже пусто...
> >
>
> дело может быть в том, что Lines в RichEdit имеют тип TRichEditStrings,
>  а не Tstrings
>

Но я то пакую поток данных. Архиватору пофиг, что это: документ, картинка или текст. Я то решение нашел в сети(от Devrace) но все равно, интересно было бы самому решить...:-)


umbra   (2007-03-22 17:25:00) [4]


> >      RichEdit.Lines.LoadFromStream(OutStream);
>
> Файл нулевой длинны, в RichEdit тоже пусто...
>

дело может быть в том, что Lines в RichEdit имеют тип TRichEditStrings, а не Tstrings


Сергей М.   (2007-03-22 16:36:00) [5]


> нашу ветку можно перенести в раздел "Потрепаться" - очень
> информативная


Каков вопрос, такова и "информативность")


Виталий Панасенко   (2007-03-22 16:35:00) [6]

Вообще, мне БЛОБ сжать нужно... А нашу ветку можно перенести в раздел "Потрепаться" - очень информативная..:-)


Сергей М.   (2007-03-22 16:22:00) [7]


> Виталий Панасенко ©   (22.03.07 16:16) [5]


> Экспериментировал...


"Есть/нет данные" и "непустой/пустой поток" - две разнве разницы)


Виталий Панасенко   (2007-03-22 16:16:00) [8]


> А почему комментарий ?

Экспериментировал...


Виталий Панасенко   (2007-03-22 16:11:00) [9]

Странно. использую мемо вместо RichEdit - есть данные...


Сергей М.   (2007-03-22 16:11:00) [10]


> На основании данных, полеченных этими двумя методами
>
> >       //OutStream.SaveToFile('c:\stream');


А почему комментарий ?


Виталий Панасенко   (2007-03-22 16:06:00) [11]


> Сергей М. ©   (22.03.07 15:56) [1]
>
> > получаю пустой поток
>
>
> На основании чего такие утверждения ?

На основании данных, полеченных этими двумя методами

>      //OutStream.SaveToFile('c:\stream');
>      RichEdit.Lines.LoadFromStream(OutStream);

Файл нулевой длинны, в RichEdit тоже пусто...


Сергей М.   (2007-03-22 15:56:00) [12]


> получаю пустой поток


На основании чего такие утверждения ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо