Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c