Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-7414
Oleg
2003-06-23 09:50
2003.07.03
Аварийное завершение программы


1-7486
McSimm2
2003-06-19 12:52
2003.07.03
---|Ветка была без названия|---


4-7758
Dmk
2003-05-02 18:09
2003.07.03
hInstance


14-7698
vidiv
2003-06-16 10:31
2003.07.03
Где лучше хранить данные в INI или во многих TXT.


4-7763
BJValentine
2003-04-29 17:43
2003.07.03
DeleteFile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский