Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Доброе время суток!

такая проблема
если открываю word форматы то все нормально а если в ворд хочу открыть сторонний формат то вываливает вопрос открывать или нет и открывает в том приложении на которое настроено расширение в системе. А нужно именно в Word чтоб открылось.
Код: (oWord -> TOleContainer)
var lcFileName: string;
loInfo: TCreateInfo;
ClassID: TGUID;
begin
  lcFileName := 'C:\dbs\WORD.mht';    //если docx то все нормально
  if FileExists(lcFileName) then
    begin

      ClassID := ProgIdToClassId('Word.Document');

      loInfo.CreateType   := ctFromFile; //ctLinkToFile; // Wenn Readonly ohne Toolbars
      loInfo.ShowAsIcon   := False;
      loInfo.IconMetaPict := 0;
      loInfo.FileName     := lcFileName;
      loInfo.ClassID      := ClassID; // специально указал ClassId от Word но не помогает
      oWord.CreateObjectFromInfo(loInfo);
      oWord.Run;
      oWord.DoVerb(ovShow);
   end;

подозреваю что надо какое то свойство для аутоконвертации выставить (вроде даже когда то его видел).
Но как называется никак не найду/вспомню.
Напомните пожалуйста.

Спасибо.
7 авг 12, 13:25    [12974902]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 434
Mikhail Tchervonenko,

если открыть пустой Word и в нём выполнить "Открыть файл" что зарегистрирован за другой аппликацией - винда отправит открытие на ту аппликацию
7 авг 12, 13:32    [12974948]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Sergij Gromov,
хотелось бы автоматизировать сию процедуру т.к. у каждого клиента не будешь её выполнять в ручную.
7 авг 12, 13:37    [12974985]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5166
Mikhail Tchervonenko,

в Ворде есть совершенно потрясающий встроенный исследовательский инструмент.
Я имею ввиду:

1) начать запись макроса
2) <сделать интересующие действия>
3) закончить запись макроса
4) посмотреть код макроса

вот, что у меня получилось, когда я записал открытие Вордом ".mht"-файла

Sub Makro1()
    ChangeFileOpenDirectory "C:\MyTests\"

    Documents.Open FileName:= _
        """Sample.mht""", ConfirmConversions:= _
        False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
        PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
        WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""
End Sub


надеюсь, помог
7 авг 12, 13:42    [12975024]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Кроик Семён,
пробема в том что я работаю через TOleContainer
и воспользоваться в нем функцией Open не получилось.
Если документ и открывался то в отдельном приложении Word а не в TOleContainer.
см.(Топик1 и Топик2)

Самой удобной оказалася вариант с CreateObjectFromInfo функцией но возникла проблема с форматами.
А с макросами я уже играюсь давно, сей путь мне известен.

Спасибо.
7 авг 12, 14:39    [12975497]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 954
Mikhail Tchervonenko
Работаю через TDBOleContainer

очень схожая проблема: свежие сохраненные через TDBOleContainer картинки - показывает, а старые картинки - не показывает. Пробовал с biolife.db
Этот контейнер при сохранении пишет что-то в BLOB, чтоб потом при открывании подключить нужный exe.
Есть мысли как "считывать" формат файла, сидящего в BLOB?
7 авг 12, 21:40    [12977930]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Alexander2,

я когда рылся в сети на эту тему пару раз натыкался на работу с документами из BLOB но поскольку эта темя меня не интересовала ссылки не сохранил. Т.е. другими словами в сети что то есть на эту тему.
8 авг 12, 11:07    [12979795]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 954
Mikhail Tchervonenko,

Хотя бы узнать чем они откличаются - только что сохранил в Image поле PDF файл через OLE контейнер.
Все сработало и могу прочитать в том же контейнере.
Но вот другие записи (были созданы PDFViewer от Synactis) - не хочет - Incorrect Stream Format
У меня полна ж огурцов из-за того, что на прошлой неделе PDFViewer перестал запускаться, даже демка не запускается и ругается на аксесс к памяти. В итоге не могу даже отладить доступ к данным сохраненным через PDFViewer, чтобы перезаписать их через OLE.
8 авг 12, 11:29    [12980045]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
По аналогии с функцией Open хотел попробовать изменить свойство ConfirmConversions дабы открытие происходило таки в ворде
oWord.OleObject.Application.Options.ConfirmConversions := False;

но Word начинает ругаться что интерфейс не поддерживается. Хотя в сети пару таких примеров нарыл (не дельфийных). Непонятно. Возможно не в том месте поставил. Пробовал так:
      ClassID := ProgIdToClassId('Word.Document');

      loInfo.CreateType   := ctFromFile; //ctLinkToFile; // Wenn Readonly ohne Toolbars
      loInfo.ShowAsIcon   := False;
      loInfo.IconMetaPict := 0;
      loInfo.FileName     := lcFileName;
      loInfo.ClassID      := ClassID;

      oWord.CreateObjectFromInfo(loInfo);
      oWord.Run;
      oWord.OleObject.Application.Options.ConfirmConversions := False; // если :=0; то тоже ругается.
      oWord.DoVerb(ovShow);
8 авг 12, 13:24    [12981246]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Решение найдено,
как всегда все просто
создаётся ворд документ а потом в него импортируется тот же mht документ
так работает (параллельно решилась и проблема с сохранением в файл с тем же именем).
      oWord.CreateObject('Word.Document',False);
      oWord.OleObject.Application.Documents.Add('Normal');
      oWord.Run;
      oWord.DoVerb(ovShow);
      oWord.OleObject.Application.Selection.InsertFile(lcFileName,'',False, False, False);
8 авг 12, 14:01    [12981604]     Ответить | Цитировать Сообщить модератору
 Re: Открыть в TOleContainer в Word не Word документ.  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 678
Mikhail Tchervonenko,

сохраняю так
      oWord.OleObject.Application.ActiveDocument.SaveAs2('c:\dbs\WORD.mht', wdFormatWebArchive,
      False, '', True, '', False, False, False, False, False, 0);


или если хочется сначала спросить имя файла то например так

procedure Ttest_form.SaveAsClick(Sender: TObject);
const
 wdFormatWebArchive = 9;
var
SaveDialog: TSaveDialog;
begin
  //oWord.OleObject.Application.ActiveDocument.Save;
  SaveDialog := TSaveDialog.Create(test_form);
  SaveDialog.Title := 'Dateiname';
  SaveDialog.InitialDir := GetCurrentDir;
  SaveDialog.Filter := 'MHTML file|*.mht';
  SaveDialog.DefaultExt := 'mht';
  SaveDialog.FilterIndex := 1;
  if SaveDialog.Execute then
  begin
    //oWord.OleObject.Application.ActiveDocument.SaveAs(SaveDialog.FileName); //
    oWord.OleObject.Application.ActiveDocument.SaveAs2(SaveDialog.FileName, wdFormatWebArchive,
      False, '', True, '', False, False, False, False, False, 0);
  end;
end;


спасибо всем кто поучавствовал.
8 авг 12, 15:24    [12982402]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить