Показ документа Ms Word в приложении в Readonly

Тема в разделе "Delphi - СОМ", создана пользователем Barmutik, 13 сен 2005.

Статус темы:
Закрыта.
  1. Barmutik

    Barmutik Гость

    Репутация:
    0
    Вопрос следующий:

    Каким образом можно показать документ внутри программы только в режиме просмотра?

    Желательно бы конечно следующее .. открыть документ.. сделать там изменения для показа и показывать пользователю, но что бы он изменить ничего не мог!
     
  2. zubr

    zubr Гость

    Репутация:
    0
    Дык а через OLE контейнер?
     
  3. Barmutik

    Barmutik Гость

    Репутация:
    0
    Ну дык и объяните как его можно открыть .. изменить потом что-то .. потом показать пользователю и что б он был РидОнли в этом OLE контейнере ?
     
  4. zubr

    zubr Гость

    Репутация:
    0
    1. Окрыть документ через OLE в режиме Visible=False
    2. Внести программно изменения
    3. Сохранить программно документ
    4. Закрыть документ
    5. Открыть документ в OleContainer в режиме внедрения (без связывания) + OleContainer.Enabled:=False
     
  5. Barmutik

    Barmutik Гость

    Репутация:
    0
    А вот мне надо изменения не сохранять...

    Задача следующего рода:

    1. Открываем документ
    2. Ищем в нём требуемые врагменты
    3. Перекрашиваем0выделяем их
    4. Показываем всё это человеку
    5. Он иммет возможность ходить к пред и след выделнным фрагментам
    6. Документ НЕ должен сохранить никаких изменений...
     
  6. zubr

    zubr Гость

    Репутация:
    0
    Используем не OleContainer, а RichEdit, где RichEdit.ReadOnly:=True
    1. Открываем документ
    2. Ищем в нём требуемые врагменты
    3. Перекрашиваем0выделяем их
    4. Сохраняем во временный файл в RTF-формате
    5. Загружаем временный файл в RichEdit
    6. После окончания работы программы удаляем временный файл
     
  7. Barmutik

    Barmutik Гость

    Репутация:
    0
    Вариант конечно нормальный ... но .. надо что бы полностью сохранился формат документа .. а при конверте в РТФ этого не происходит .. опять же эти операции на больших фалах займут очень много времени .. а это критично ...
     
  8. zubr

    zubr Гость

    Репутация:
    0
    Ну а попроще варианты:
    1. ActiveDocument.ReadOnly = True
    2. Установить атрибут файла только для чтения
     
  9. Barmutik

    Barmutik Гость

    Репутация:
    0
    В качестве попроще вариантов ответы :

    1. ReadOnly - совйство только по чтению
    2. Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.

    Спасибо за попытки помочь, я уже перепробовал кучи способов ... простые варианты не подходят .. просто я думаю вдруг кто обладает тайными знаниями :)
     
  10. zubr

    zubr Гость

    Репутация:
    0
    Так а что мешает менять этот атрибут программно. Перед изменениями снять его, затем опять поставить.
     
  11. Barmutik

    Barmutik Гость

    Репутация:
    0
    Не совсем понял ..

    1. Снял аттрибут
    2. Внёс изменения
    3. Поставил ... но документ то уже открыт в ворде ???


    Что надо переоткрывать ? Если да то это не вариант .. для больших объёимов ..
     
  12. zubr

    zubr Гость

    Репутация:
    0
    Сохранить то юзверь свои изменения не сможет, вернее сможет но в другой файл. Согласен, решение не очень красивое, так как изменения юзверь все таки может делать, сохранять не может. Вот еще вариант:
    1. Создаете поток, отслеживающий окно документа. Если оно появилось и активно, подменяете процедуру окна, в которой разрешаете только сообщения WM_SCROLL.
    Остальная последовательность действий.
     
  13. Barmutik

    Barmutik Гость

    Репутация:
    0
    Вроде как вариант нашёлся ... использования Protect

    Но ... в ворде он работает .. а когда использую его как сервер но протектит нормально .. а вот распротектить уже не хочет :D

    Глюки какие-то ... нифига нормально не работает ...

    Ещё глюкан вылез .. если прячеш тулбары в окне где показывается ворд то если потом вне программы открываеш Ворд то там тоже нет тулбаров :(

    Куда не кинь .. всё не так... :D
     
  14. zubr

    zubr Гость

    Репутация:
    0
    Проверил, у меня снимает защиту нормально. Вот код:
    Код (Text):
    procedure TForm1.Button3Click(Sender: TObject);
    var
    ev:variant;
    begin
    W:=CreateOleObject('Word.Application');
    W.visible:=True;
    W.Documents.open('MyFile.doc');
    ev:=wdAllowOnlyFormFields;
    W.Documents.Item('MyFile.doc').Protect(ev);
    end;

    procedure TForm1.Button4Click(Sender: TObject);
    begin
    W.Documents.Item('MyFile.doc').Unprotect;
    end;
     
  15. Barmutik

    Barmutik Гость

    Репутация:
    0
    Так да!

    Может я что криво делаю ... можно попросить пример такой же когда Ворд открывается в TIOleContainer !

    Может у меня уже глаза замылились ...
     
  16. zubr

    zubr Гость

    Репутация:
    0
    Вот сделал по простому, вроде работает:
    Код (Text):
    procedure TForm1.Open2Click(Sender: TObject);
    begin
    OLEContainer1.CreateObjectFromFile('MyFile.doc', False);
    OleContainer1.DoVerb(ovPrimary);
    end;

    procedure TForm1.Protect1Click(Sender: TObject);
    var
    ev, w:variant;
    begin
    ev:=wdAllowOnlyFormFields;
    w:=OleContainer1.OleObject;
    w.Protect(ev);
    end;

    procedure TForm1.Unprotect2Click(Sender: TObject);
    var
    w:variant;
    begin
    w:=OleContainer1.OleObject;
    w.Unprotect;
    end;
     
  17. Barmutik

    Barmutik Гость

    Репутация:
    0
    Так что-то я не догоняю ...

    Какое Дельфи ? Какой Ворд?

    У меня такой код вообще при попытке протекта вываливает ошибку...

    Можно экзешник .. которуму указываеш путь какой файл гузить ... потом две кнопки протект и анпротект ...

    Ну и с исходниками можно :D)

    Бо что-то я видать или конкретно туплю .. или где-то тут собака зарыта всё таки ...
     
  18. zubr

    zubr Гость

    Репутация:
    0
    Delphi5, WordXP.
    Куда сбросить экзешник с исходником?
     
  19. zubr

    zubr Гость

    Репутация:
    0
    Да, проверил, в Delphi7 при установке Protect выбрасывает ошибку сервера. Delphi7 вообще с вордом глючно работает, я помню как то задавал вопрос на эту тему. Ну еще может быть, так как в Delphi5 делалось, используется модуль Word97 вместо WordXP в Delphi7. А экзешник скомпилированный в Delphi5 работает корректно, тестировал в WinXP и Win98, WordXP.
     
  20. Barmutik

    Barmutik Гость

    Репутация:
    0
    Так .. у меня Д7... само по себе не важно какой модуль .. мы ж используем поздне связывание...

    И что интересно это глюк 7 Дельфи .. пора на C# сваливать .. устал я от таких глюков .. :D
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей