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

Вниз

TStream   Найти похожие ветки 

 
Anonimus   (2003-06-22 15:28) [0]

var img: TPicture; Stream: TMemoryStream;
.....

begin
img := Image1.Picture;
Stream.Write(img, SizeOf(img));
end;

.....

begin
Stream.Read(img, Stream.Size);
Image2.Picture := img;
end;

Судя по всему, не происходит ни запись, ни чтение, почему? Точнее, как это правильно делается?


 
jack128 ©   (2003-06-22 15:44) [1]

img.Picture.Graphic.SaveToStream()


 
Anonimus   (2003-06-22 16:01) [2]

Дело в том, что в этом потоке будет не только img, но и текст, вообщем, разношерстные данные в одном stream.


 
jack128 ©   (2003-06-22 16:13) [3]

и что? пиши сначало текст, потом картинку, потом данные, или как ты там хочешь. в чем проблема?


 
Anonimus   (2003-06-22 17:00) [4]

Проблема в том, что не знаю как. Может пример какой-нибудь....


 
Palladin ©   (2003-06-22 17:08) [5]

повторю
"пиши сначала текст, потом картинку, потом данные"
картинку то записать сумел...


 
Тих   (2003-06-22 17:45) [6]

Вот это

img := Image1.Picture;
Stream.Write(img, SizeOf(img));

запишет в поток ровно 4 байта, т.е. sizeof(img)

Поток - всего лишь кучка байтов, а как ты эту кучку разгребать будешь - твоя воля. Хочешь - отделяй одну часть (картинка) от другой (текст) своими разделителями, хочешь - используй стандартные микрософтовские интерфейсы IStorage, IStream, IPersisitStream и методы доступа к данным в структурированных хранилищах (есть соотв. API), хочешь - используй XML, хочешь - СУБД.


 
VMcL ©   (2003-06-22 21:34) [7]

>Anonimus (22.06.03 15:28)

Стесняюсь спросить, а зачем в поток Stream: TMemoryStream записывать адрес экземпляра объекта TPicture?


 
VMcL ©   (2003-06-22 21:36) [8]

...в смысле экземпляра класса TPicture. Sorry.


 
jack128 ©   (2003-06-22 23:16) [9]

var
i : integer;
s : string[10];
ms : TmemoryStream;
begin
ms := TmemoryStream.Create();
try
ms.Write(i,sizeOf(i); //пишем число в поток
img.Picture.Graphic.SaveToStream(ms); //пишем картинку в поток
ms.Write(s,sizeof(s)); // пишем короткую строку
....
finally
ms.Free;
end;
end;


 
Ученик ©   (2003-06-22 23:27) [10]

>Anonimus (22.06.03 15:28)

type
TStreamProc = procedure (Stream: TStream) of object;

procedure WriteStream(Stream: TStream; SaveToStream: TStreamProc);
var
MemoryStream: TStream;
begin
MemoryStream := TMemoryStream.Create;
try
SaveToStream(MemoryStream);
WriteStream(Stream, MemoryStream)
finally
MemoryStream.Free
end
end;

procedure ReadStream(Stream: TStream; LoadFromStream: TStreamProc); overload;
var
MemoryStream: TStream;
begin
MemoryStream := TMemoryStream.Create;
try
ReadStream(Stream, MemoryStream);
MemoryStream.Position := 0;
LoadFromStream(MemoryStream)
finally
MemoryStream.Free
end
end;

WriteStream(Stream, img.Picture.Graphic.SaveToStream);

ReadStream(Stream, img.Picture.Graphic.LoadFromStream)


 
Тих   (2003-06-22 23:28) [11]

jack128 © (22.06.03 23:16)
А как прикажете потом этот поток разгребать? %-)
Как я узнаю при разборе потока, где закончилась картинка и где началась строка? (можно, конечно, 10(14) байт с конца отсчитать, но это не универсально).


 
Ученик ©   (2003-06-22 23:31) [12]

Сорри, еще

----- interface -------------
procedure ReadStream(Stream: TStream; ToStream: TStream; Clear: Boolean = True); overload;
procedure ReadStream(Stream: TStream; LoadFromStream: TStreamProc); overload;

procedure WriteStream(Stream: TStream; FromStream: TStream); overload;
procedure WriteStream(Stream: TStream; SaveToStream: TStreamProc); overload;
-------------------------------


procedure ReadStream(Stream: TStream; ToStream: TStream; Clear: Boolean = True);
var
iSize: Integer;
begin
if Clear then ToStream.Size := 0;
iSize := ReadInteger(Stream);
if iSize > 0 then
ToStream.CopyFrom(Stream, iSize)
end;

procedure WriteStream(Stream: TStream; FromStream: TStream);
begin
FromStream.Position := 0;
WriteInteger(Stream, FromStream.Size);
Stream.CopyFrom(FromStream, FromStream.Size)
end;


 
jack128 ©   (2003-06-22 23:40) [13]


> Тих (22.06.03 23:28)

Пример был по поводу сохранения в поток.
Я все токи надеюсь, что более менее нормальный формат файла наш анонимный друг сумеет придумать ;-)


 
Johny B. ©   (2003-06-23 04:43) [14]


> Anonimus (22.06.03 15:28)
> var img: TPicture; Stream: TMemoryStream;
> .....
>
> begin
> img := Image1.Picture;
> Stream.Write(img, SizeOf(img));
> end;
>
> .....
>
> begin
> Stream.Read(img, Stream.Size);
> Image2.Picture := img;
> end;
>
> Судя по всему, не происходит ни запись, ни чтение, почему?
> Точнее, как это правильно делается?


ЕСЛИ ТАК:

var img: TPicture;
Stream: TMemoryStream;
.....

begin
img := Image1.Picture;
//Stream.Write(img, SizeOf(img));
//ты записываешь текущий размер картинки
Stream.Write(Img, SizeOf(TPicture));
//а надо - размер типа
end;

Read и стрема точно такой же.
и не надо выдумывать проблем на зад ))


 
ЮЮ ©   (2003-06-23 05:35) [15]

>Johny B. © (23.06.03 04:43)
Неужели SizeOf(TPicture) окажется больше SizeOf(img) и сможет отразить длину данных, загруженных в конкретный экземляр? :-)

>и не надо выдумывать проблем на зад ))
Именно.
Graphic.SaveToStream - абстрактный метод, каждый наследник Graphic вправе по-своему сохранять себя в поток, а чтобы затем правильно считать из потока надо будет создать экземпляр именно этого класса, а уж затем он должен считать всё остальное из потока.

procedure TPicture.SaveToStream(Stream: TStream);
begin
Bitmap.SaveToStream(Stream);
end;
Итак, видим, что TPicture сохраняет в поток только Bitmap, невзирая какого типа изображение было загружено из файла gif, jpeg и т.п.

procedure TGIFImage.SaveToStream(Stream: TStream);
begin
WriteStream(Stream, False);
end;
А вот, например, GIFImage от Rx сохраняет в поток уже не битмэп, а всю необходимую для полного восстановления из потока объекта TGifImage, но только TGifImage сможет правильно считать инфу из потока. Этого не сможет сделать ни TBitmap, ни TPicture, ни TGraphic




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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
7-7729
mobilzero
2003-04-21 11:02
2003.07.03
Как научить программу на АСМ работать под виндами?


14-7654
Landgraph
2003-06-12 10:42
2003.07.03
BC++B и Delphi...


6-7584
Лана Розанова
2003-04-29 15:31
2003.07.03
Web


14-7629
سشصز
2003-06-16 12:53
2003.07.03
Математические фокусы…


1-7399
-=MAN=-
2003-06-23 06:48
2003.07.03
Вместо Sleep() есть что-нибудь?