![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование 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]
> получаю пустой поток
На основании чего такие утверждения ?