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

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

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

    Barmutik Гость

    Вопрос следующий:

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

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

    zubr Гость

    Дык а через OLE контейнер?
     
  3. Barmutik

    Barmutik Гость

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

    zubr Гость

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

    Barmutik Гость

    А вот мне надо изменения не сохранять...

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

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

    zubr Гость

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

    Barmutik Гость

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

    zubr Гость

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

    Barmutik Гость

    В качестве попроще вариантов ответы :

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

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

    zubr Гость

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

    Barmutik Гость

    Не совсем понял ..

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


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

    zubr Гость

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

    Barmutik Гость

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

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

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

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

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

    zubr Гость

    Проверил, у меня снимает защиту нормально. Вот код:
    Код (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 Гость

    Так да!

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

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

    zubr Гость

    Вот сделал по простому, вроде работает:
    Код (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 Гость

    Так что-то я не догоняю ...

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

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

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

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

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

    zubr Гость

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

    zubr Гость

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

    Barmutik Гость

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

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

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