Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.037 c
14-1102669788
REA
2004-12-10 12:09
2005.01.02
Модератору


14-1102642007
Пострадавший
2004-12-10 04:26
2005.01.02
инет карточка


14-1102681639
Dmitriy O.
2004-12-10 15:27
2005.01.02
Сколько кому удавалось написать сразу правильно коду ?


1-1103368258
dazimir
2004-12-18 14:10
2005.01.02
Фйл.zzz (текстовый) запускал мою прогу и грузился в Memo1


14-1103133821
Чеширский_Кот
2004-12-15 21:03
2005.01.02
Болельщики Зенита сегодня молятся на греков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский