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

Вниз

Как записать метафайл в нетипизированный файл?   Найти похожие ветки 

 
Navi   (2004-12-13 08:34) [0]

Здравствуйте!
Как записать метафайл из памяти в текущую позицию нетипизированного файла,
а затем прочитать его оттуда?
Пишу так:
var
 hFile: Integer;  // Handle of File
 Header: THeader; // File Header that contains size of stored metafile
 wmf: TMetaFile;
 mfc: TMetaFileCanvas;
 ms: TMemoryStream;
begin
 ...
 ms:= TMemoryStream.Create;
 try
   ms.Position:= 0;
   wmf:= TMetaFile.Create;
   try
     wmf.Width:= 100;
     wmf.Height:= 100;
     mfc:= TMetaFileCanvas.Create(wmf, 0);
     try
       mfc.Ellipse(25, 25, 75, 75);
     finally
       mfc.Free;
     end;
     wmf.SaveToStream(ms);
   finally
     wmf.Free;
   end;
   Header.MetaFileSize:= ms.Size;
   FileWrite(hFile, Header, SizeOf(THeader));
   FileWrite(hFile, ms, ms.Size);
 finally
   ms.Free;
 end;
 ...
end;

Читаю так:
var
 hFile: Integer;  // Handle of File
 Header: THeader; // File Header that contains size of stored metafile
 Size: Integer;
 Buffer: Pointer;
 ms: TMemoryStream;
begin
 ...
 ms:= TMemoryStream.Create;
 try
   Size:= Header.MetaFileSize;
   GetMem(Buffer, Size);
   try
     FileRead(hFile, Buffer^, Size);
     ms.Position:= 0;
     ms.WriteBuffer(Buffer, Size);
     Image1.Picture.Metafile.LoadFromStream(ms); <-- MetaFile is not valid!
   finally
     FreeMem(Buffer);
   end;
 finally
   ms.Free;
 end;
 ...
end;
Спасибо.


 
Navi   (2004-12-13 15:42) [1]

Никто не знает?


 
Leonid Troyanovsky ©   (2004-12-13 16:29) [2]


> Navi   (13.12.04 15:42) [1]

>      FileRead(hFile, Buffer^, Size);
>      ms.Position:= 0;
>      ms.WriteBuffer(Buffer, Size);
>      Image1.Picture.Metafile.LoadFromStream(ms); <-- MetaFile
> is not valid!


Станешь тут инвалидом, через такие увечья.
Сохрани в FileStream, и читай соответственно.

--
С уважением, LVT.


 
pusrg   (2004-12-13 16:31) [3]

Сразу предупрежу, я никогда с метафайлами не работал, но есть несколько замечаний к коду:

1. Зачем ты уничтожаешь канву, еще до сохранения файла в поток?
2. Переменная hFile: Integer; - глобальная или передается в качестве параметра? Если нет, то где CreateFile или OpenFile.
3. Cтрока
FileWrite(hFile, ms, ms.Size);
ИМХО должна выглядеть
FileWrite(hFile, ms.memory, ms.Size);
4. Не совсем понял строки:
 Header.MetaFileSize:= ms.Size;
  FileWrite(hFile, Header, SizeOf(THeader));
Если ты хочешь записать предварительно размер, записываемого потока, ты должен создать буфер (выделив под него память), записать в него нужное значение, и передать указатель на этот буфер в FileWrite.


 
Navi   (2004-12-18 09:18) [4]

Спасибо всем. Сделал через 2 часа после того как вопрошал.
Для pusrg:
п. 1. Потому, что если help почитать то наросиванное на канве метафайла записывается в него только при уничтожении этой канвы.
пп. 2, 4. В моих отрывках кода стоят ..., там и идет и CreateFile и CloseFile и запись заголовка, в комментарии к обявлению которого я написал, что в него пишется размер метафайла.
п. 3. И ЭТО точно! После того как я выкинул промежуточный буфер все заработало.

НО странная вещь. Смотрю нормальный метафайл (созданный Image1.Picture.Metafile.SaveToFile) WinHex-ом: там первые символы ЧНЖ (формат файла не знаю, но похоже это сигнатура), а внутри файла, который содержит встроенный мной метафайл и прекрасно грузится НЕТ такой сигнатуры.



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

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

Наверх




Память: 0.48 MB
Время: 0.047 c
1-1103388317
Ivolg
2004-12-18 19:45
2005.01.02
Компоненты


14-1102889376
марсианин
2004-12-13 01:09
2005.01.02
Медиачасы


8-1096567161
suharew
2004-09-30 21:59
2005.01.02
Как сделать уменьшенный вариант фотки??


1-1103537255
tarasik
2004-12-20 13:07
2005.01.02
Есть ли встроеная функция которая возвращала бы количество


1-1103144883
Zilog
2004-12-16 00:08
2005.01.02
Нужен хендл окна, на который плюхнули компонент