
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.26] |
![]() |
|
Сообщ.
#1
,
|
|
|
Надо открыть документ в MS-Word из Delphi корректно.
Хотелось бы предумотреть возможные ошибки и устранить их на этапе разработки приложения: 1. Проверить есть ли MS Word на машине вообще, и если нет...то поругаться корректно. 2. Предусмотреть возможность того, что MS Word стоит не в каталоге по умолчанию(если это может помешать работе) и если их стоит 2 и более...И вообще зависит ли работа используемого мной кода от версии MS Office? ![]() ![]() Var APP : variant; old_Text,new_text, SS:string; begin //создали новый документ APP:= CreateOleObject('Word.Application'); APP.Visible := False; APP.Documents.Add; // Вставляем файл SS:=WebBrowser1.LocationURL; APP.Selection.InsertFile(SS ,'',false,false,false); // Меняем old_Text на new_Text APP.Selection.Find.Execute(old_Text, False, False, False, False, False, True, 0, False, new_Text, 2, EmptyParam, EmptyParam, EmptyParam, EmptyParam); APP.Selection.MoveDown; APP.Visible := true; Пожалуйста помогите кто чем может! ![]() |
![]() |
Сообщ.
#2
,
|
|
В реестре искать номер версии ворда. Delphi Russian Knowledge Base
Или Word.Application.9 - это 2000 |
Сообщ.
#3
,
|
|
|
А так не проще???
![]() ![]() try APP:= CreateOleObject('Word.Application'); APP.Visible := False; APP.Documents.Add; // Вставляем файл SS:=WebBrowser1.LocationURL; APP.Selection.InsertFile(SS ,'',false,false,false); // Меняем old_Text на new_Text APP.Selection.Find.Execute(old_Text, False, False, False, False, False, True, 0, False, new_Text, 2, EmptyParam, EmptyParam, EmptyParam, EmptyParam); APP.Selection.MoveDown; APP.Visible := true; except Application.MessageBox('Нет Word-a','Error!!!'); end; |
Сообщ.
#4
,
|
|
|
Цитата SergSW @ 24.08.04, 14:32 А так не проще??? ![]() ![]() try APP:= CreateOleObject('Word.Application'); APP.Visible := False; APP.Documents.Add; // Вставляем файл SS:=WebBrowser1.LocationURL; APP.Selection.InsertFile(SS ,'',false,false,false); // Меняем old_Text на new_Text APP.Selection.Find.Execute(old_Text, False, False, False, False, False, True, 0, False, new_Text, 2, EmptyParam, EmptyParam, EmptyParam, EmptyParam); APP.Selection.MoveDown; APP.Visible := true; except Application.MessageBox('Нет Word-a','Error!!!'); end; Интересно....может так и проще... ![]() А ещё я нашла такой способ: ![]() ![]() uses Registry; function IsWordInstalled: Boolean; var Reg: TRegistry; s: string; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CLASSES_ROOT; Result := Reg.KeyExists(' Word .Application'); finally Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if IsWordInstalled then ShowMessage('MS Word is installed.'); end; И поди разбери, что лучше??? ![]() |
Сообщ.
#5
,
|
|
|
что 100%-но работает - то и лучше
![]() на мой взгляд (не проверял), работают оба варианта, но удобней и наглядней второй. Только по-моему в строке ![]() ![]() Reg.KeyExists(' Word .Application'); пробелов много (может, так и должно быть) |
![]() |
Сообщ.
#6
,
|
|
Корректно из Delphi откроется документ ворда при помощи shellExecute()
![]() Если ворд никак не установлен (а бывает, что он не установлен, но есть! и пользователь знает, где его найти), винда корректно спросит, с помощью чего юзер хочет корректно открыть документ. И смысла ругаться из Дельфи на отсутствие ворда я в данном случае не вижу. Хотя, хозяин - барин... |
Сообщ.
#7
,
|
|
|
2 Mischka
в этом топике имелась в виду автоматизация с OLE, т.е. работа с самим вордом. А без его установки этого нельзя сделать |
![]() |
Сообщ.
#8
,
|
|
Цитата DELPHIna, 24.08.04, 14:05 Надо открыть документ в MS-Word из Delphi корректно. Хотелось бы предумотреть возможные ошибки и устранить их на этапе разработки приложения Где тут написано про автоматизацию OLE? ![]() |
Сообщ.
#9
,
|
|
|
Я лично пользуюсь следующим методом:
![]() ![]() procedure OpenWordFiles(FileName: String); var FilePath : OleVariant; WApp : variant; IsRunning : boolean; OnlyRead : Olevariant; WordApp : TWordApplication; begin if not IsOLEObjectInstalled('Word.Application') then raise Exception.Create('На компьютере не установлен Word !'); // проверка запущен ли уже Word IsRunning:=True; try WApp:=GetActiveOleObject('Word.Application'); // пытаемся найти запущенный объект except IsRunning:=False; end; if (not IsRunning) or not Assigned(WordApp) then begin WordApp := TWordApplication.Create(nil); // если не запущен, то создаём WordApp.ConnectKind := ckRunningOrNew; end; WordApp.Connect; FilePath := FileName; WordApp.Documents.Open(FilePath,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); // отобразим word правильно WordApp.Visible := true; if WordApp.WindowState = TOLEEnum(wdWindowStateMinimize) then WordApp.WindowState := TOLEEnum(wdWindowStateNormal); WordApp.ScreenUpdating := true; end; |
Сообщ.
#10
,
|
|
|
Цитата Voice @ 24.08.04, 15:25 ![]() ![]() Reg.KeyExists(' Word .Application'); пробелов много (может, так и должно быть) не...так не должно быть...пробелы лишние ![]() Добавлено в : Цитата <Dron> @ 25.08.04, 09:18 Я лично пользуюсь следующим методом: ![]() ![]() procedure OpenWordFiles(FileName: String); var FilePath : OleVariant; WApp : variant; IsRunning : boolean; OnlyRead : Olevariant; WordApp : TWordApplication; begin if not IsOLEObjectInstalled('Word.Application') then raise Exception.Create('На компьютере не установлен Word !'); ********************* end; Упустил наверное...: ![]() ![]() function IsOLEObjectInstalled(Name: String): boolean; var ClassID: TCLSID; Rez : HRESULT; begin // Ищем CLSID OLE-объекта Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID); if Rez = S_OK then // Объект найден Result := true else Result := false; end; |