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

  • Автор темы Автор темы Barmutik
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
B

Barmutik

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

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

Желательно бы конечно следующее .. открыть документ.. сделать там изменения для показа и показывать пользователю, но что бы он изменить ничего не мог!
 
Ну дык и объяните как его можно открыть .. изменить потом что-то .. потом показать пользователю и что б он был РидОнли в этом OLE контейнере ?
 
1. Окрыть документ через OLE в режиме Visible=False
2. Внести программно изменения
3. Сохранить программно документ
4. Закрыть документ
5. Открыть документ в OleContainer в режиме внедрения (без связывания) + OleContainer.Enabled:=False
 
А вот мне надо изменения не сохранять...

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

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

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

Спасибо за попытки помочь, я уже перепробовал кучи способов ... простые варианты не подходят .. просто я думаю вдруг кто обладает тайными знаниями :)
 
Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.
Так а что мешает менять этот атрибут программно. Перед изменениями снять его, затем опять поставить.
 
Не совсем понял ..

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


Что надо переоткрывать ? Если да то это не вариант .. для больших объёимов ..
 
1. Снял аттрибут
2. Внёс изменения
3. Поставил ... но документ то уже открыт в ворде ???
Сохранить то юзверь свои изменения не сможет, вернее сможет но в другой файл. Согласен, решение не очень красивое, так как изменения юзверь все таки может делать, сохранять не может. Вот еще вариант:
1. Создаете поток, отслеживающий окно документа. Если оно появилось и активно, подменяете процедуру окна, в которой разрешаете только сообщения WM_SCROLL.
Остальная последовательность действий.
 
Вроде как вариант нашёлся ... использования Protect

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

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

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

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

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

Может у меня уже глаза замылились ...
 
Вот сделал по простому, вроде работает:
Код:
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;
 
Так что-то я не догоняю ...

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

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

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

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!