Главная страница
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.025 c
1-1103385462
sloug
2004-12-18 18:57
2005.01.02
Криво работает ColorBox


1-1103184634
aleshap
2004-12-16 11:10
2005.01.02
Каким образом можно сбросить буфер нажатых клавиш


14-1102684509
Чеширский_Кот
2004-12-10 16:15
2005.01.02
Чему доверять?


1-1103201990
SbtON
2004-12-16 15:59
2005.01.02
Можно ли добавить в процесс компонент NMFTP?


6-1097940533
Kross
2004-10-16 19:28
2005.01.02
Оперделение доступных ресурсво по названию компьютера