2014-08-26 11 views
0

Delphi XE6. У меня есть приложение для текстовых фрагментов, которые хранятся в локальной базе данных (DB DB). Некоторые фрагменты могут быть прямым текстом, другие могут включать форматирование. Если фрагменты включают форматирование, фрагменты представляют собой формат MS Word.Delphi - Использование OLE вызывает ошибку в Word

Пользователь может просматривать фрагменты двумя способами, в мое приложение, или позвонив по телефону MS-Word, и имеющий фрагмент кода загружается там автоматически, - ЭТО ЖЕ SNIPPET ..

Проблема: Если фрагмент кода загружается в TOLEContainer в моем приложении, он отлично отображается без проблем ... Если фрагмент будет выведен в MSWord, я получаю сообщение об ошибке ...

«Извините, мы не можем открыть, потому что мы обнаружили проблему с ее содержанием ». Я нажимаю «ОК», а затем «Word нашел нечитаемый контент». Вы хотите восстановить содержимое этого документа? ... «Я клик в порядке, и все выглядит нормально.

Мой общий поток обработки для «икру от MS WORD» является ...

  // FN is a temp file name   
      FileStream := TFileStream.Create(FN, fmCreate); 
      BlobStream := dm_text.tEntries.CreateBlobStream(dm_text.tEntries.FieldByName('ANSWER_FMT'), bmRead); 
      FileStream.CopyFrom(BlobStream, BlobStream.Size); 
      BlobStream.Free; 
      FileStream.Free; 
      // Now open default association, which will be Word 
      ShellExecute(Handle, 'open', PWideChar(FN), nil, nil, SW_SHOWNORMAL); 

Этот поток практически идентичен для просмотра места В ... кроме нескольких команд для TOleContainer.

OleWord.Enabled := True; 
    FileStream := TFileStream.Create(FN, fmCreate); 
    BlobStream := tEntries.CreateBlobStream(tEntries.FieldByName('ANSWER_FMT'), bmRead); 
    FileStream.CopyFrom(BlobStream, BlobStream.Size); 
    BlobStream.Free; 
    FileStream.Free; 

    OleWord.LoadFromFile(FN); 
    OleWord.DoVerb(ovInPlaceActivate); 

Любые идеи, почему это происходит? Это происходит в MULTIPLE версиях MSWord.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Обе программы просматривают одни и те же данные, вытаскиваемые из одной и той же строки/столбца в моей БД. Я создаю файл TEMP, а затем загружаю либо через TOleContainer, который загружает его, либо через ShellExecute, что дает ошибку. Однако, если я вручную загружаю файл TEMP для контейнера OLE в MSWord, я получаю ту же ошибку.

So - возможности ... 1). Мои данные повреждены, т. Е. Как я спасую это неправильно ... но Word может исправить это. 2). У меня есть настройка так или иначе, что OLEContainer не показывает ошибку, но Word делает.

+0

Я добавил дополнительную информацию в вопрос ... но да, загрузка этого через Ole Automation может «скрыть» ошибку. по какой-то причине – user1009073

+0

Как разместить двоичный файл (т.е. файл * .docx) – user1009073

+0

Какой метод вы используете для сохранения файла. OleContainer.SaveToFile или OleContainer.SaveToDocument или что-то еще? –

ответ

2

Это связано с тем, что при использовании OleContainer.SaveToFile или SaveAsDocument вы не создаете файл docx, а OleObject, содержащий файл docx. При использовании OleContainer.SaveToFile с UseOldStreamFormat = True добавляется даже специальный заголовок Delphi. Слово удачно обнаруживает это и дает вам возможность восстановить файл.

Если вы хотите действительный слово-документ, а затем активировать OleContainer (OleContainer.DoVerb (ovPrimary), а затем сохраните документ через сам Word (OleContainer.OleObject.SaveAs (MyFileName, wdFormatDocument, EmptyParam, EmptyParam, False). После этого вы можете сохранить полученный файл в своей базе данных.

+0

Это, казалось, сделало это ... Я ИМЕЛСЯ t o измените способ загрузки, иначе я получу «Ошибка недопустимого потока». Новый способ: OleWord.AutoActivate: = aaManual; OleWord.CreateObjectFromFile (FN, False); Единственная странность в том, что MsWord, кажется, мигает в фоновом режиме при его активации. Могу ли я предотвратить это? – user1009073

+0

Я использую Application.MainForm.BringToFront сразу после CreateObjectFromFile. Это предотвращает деактивацию приложения. У меня нет ничего другого, чтобы предотвратить вспышку. –

Смежные вопросы