Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
1 / 1 / 1
Регистрация: 20.02.2012
Сообщений: 89
Записей в блоге: 1

Отсутствие Office

22.09.2012, 03:32. Показов 4440. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите пожалуйста, как при запуске программы на Delphi можно проверить установлен ли Office, и если не установлен то проинформировать пользователя?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2012, 03:32
Ответы с готовыми решениями:

Ошибка про отсутствие компонентов
Помогите, пожалуйста, выдает ошибку требует какой то Скин возможно Bussiness (иллюстрация №1), если игнорировать то выдает такую ошибку...

Запрос в базу и отсутствие ответа
select * from orders where ORDER_STATE = 0 Делаю запрос в настройках SimpleDataSet (CommandSet) в базу с целью получения полей со...

В компоненте IBDatabase отсутствие коннекта с виртуальной машиной
Здравствуйте! Мне нужно создать клиент-серверную базу данных с помощью компонента IBDatabase. Для этого я установил виртуальную машину...

29
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
22.09.2012, 03:37
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
uses ActiveX, ComObj;
 
// *****
 
function GetOleObject(name:string):variant;
begin
  result:=null;
  if IsOLEObjectInstalled(name) then begin
     try
        result:=GetActiveOleObject(name); // пытаемся найти  запущенный объект
        exit;
     except
        result := CreateOleObject(name);
     end;
  end else begin
    raise Exception.Create('Интерфейс '+name+' не обнаружен в системе');
    Abort;
  end;
end;
 
// ** пример
var w: variant;
begin
w:=GetOleObject('Word.Application');
//если что, тут все и обломается :D
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 12:42
Цитата Сообщение от Alex_pac Посмотреть сообщение
IsOLEObjectInstalled
в какой версии Делфи эта функция? у меня 7, не находит
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
26.09.2012, 12:44
Самописная:
Delphi
1
2
3
4
5
6
7
8
9
function IsOLEObjectInstalled(Name: String): boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
  // Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID);
  result := (Rez = S_OK)
end;
1
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 12:51
блин забыл ее написать

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
uses ActiveX, ComObj;
 
///***
 
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;
 
function GetOleObject(name:string):variant;
begin
  result:=null;
  if IsOLEObjectInstalled(name) then begin
     try
        result:=GetActiveOleObject(name); // пытаемся найти  запущенный объект
        exit;
     except
        result := CreateOleObject(name);
     end;
  end else begin
    raise Exception.Create('Интерфейс '+name+' не обнаружен в системе');
    Abort;
  end;
end;
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 13:38
Цитата Сообщение от Alex_pac Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function GetOleObject(name:string):variant;
begin
 result:=null;
 if IsOLEObjectInstalled(name) then begin
 try
 result:=GetActiveOleObject(name); // пытаемся найти запущенный объект
 exit;
 except
 result := CreateOleObject(name);
 end;
 end else begin
 raise Exception.Create('Интерфейс '+name+' не обнаружен в системе');
 Abort;
 end;
end;
мне непонятно, зачем в блоке try вызов метода exit? если выполнение дойдет до этого места, то далее уже ничего не будет выполняться, т.к. except не будет выполнен. аналогичный вопрос по методу Abort.

вот, я набросал свой тестовый код
Delphi
function TForm1.GetOLEObject(name: string): Variant;
begin
  Result:= Null;
  if IsOLEObjectInstalled(name) then
    try
      Result:= GetActiveOleObject(name);
      ShowMessage('Объект ' + name + ' найден');
    except
      Result:= CreateOleObject(name);
      Result.Visible:= true;  // показываем приложение
      ShowMessage('Объект ' + name + ' создан');
    end
  else raise Exception.Create('Интерфейс ' + name + ' не обнаружен в системе');
end;
 
function TForm1.IsOLEObjectInstalled(name: string): boolean;
var
  ClassID: TCLSID;
  Rez: HRESULT;
begin
  // Ищем CLSID OLE-объекта
  Rez:= CLSIDFromProgID(PWideChar(WideString(name)),ClassID);
  Result:= (Rez = S_OK)
end;
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 13:43
DenNik, код верный у меня. Не надо велосипедов писать типа Result.Visible:= true;

ИМХО гибкость теряется.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 13:50
Цитата Сообщение от Alex_pac Посмотреть сообщение
DenNik, код верный у меня. Не надо велосипедов писать типа Result.Visible:= true;

ИМХО гибкость теряется.
без Result.Visible:= true; процесс word.exe будет висеть в памяти и удалять его придется через диспетчер - это раз.

2. я считаю, что вызывать Exit в том месте процедуры, где она и так завершает выполнение - глупость
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 13:54
без Result.Visible:= true; процесс word.exe
ИМХО нет

Узри код модуля MSWord2MHT

https://www.cyberforum.ru/blog... og445.html

и пойми что visible ваще не обязателен. А ссылку на объект возвращает как раз result функции GetOLEObject

2. я считаю, что вызывать Exit в том месте процедуры, где она и так завершает выполнение - глупость
Логически да. Но наличие или отсутвие exit никак не влияет на работу в данном случае
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 13:59
Цитата Сообщение от Alex_pac Посмотреть сообщение
и пойми что visible ваще не обязателен. А ссылку на объект возвращает как раз result функции GetOLEObject
а я Visible пишу, если ты заметил, после вызова CreateOLEObject, который просто создает процесс winword.exe со СКРЫТЫМ ГЛАВНЫМ ОКНОМ ПРИЛОЖЕНИЯ. или на твоем компе не так?
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 14:04
CreateOLEObject не проверяет есть ли интефейс в системе

еще раз узри код

Delphi
1
2
3
4
5
6
7
8
9
function WordToMHT(const msdocfile, mhtfile: string):boolean;
var w, doc : variant; i: integer; ok: boolean;
begin
  result:=false;
  w:=GetOleObject('Word.Application'); // << 100% объект содается иначе Exception
// никаких проверок тут писать не надо вообще!
// если нужен visible то  w.visible:=true;
  ok:=false;
  for i:=1 to w.Documents.Count do begin
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 14:04
вот тебе результат выполнения без вызова Visible
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 14:05
сам узри СВОЙ ЖЕ КОД. ничего похожего на CreateOLEObject не замечаешь?

Цитата Сообщение от DenNik Посмотреть сообщение
Delphi
1
2
3
4
5
6
try
 result:=GetActiveOleObject(name); // пытаемся найти запущенный объект
 exit;
 except
 result := CreateOleObject(name);
 end;
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 14:07
Логически да. Но наличие или отсутвие exit никак не влияет на работу в данном случае
............
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 14:08
в результате выполнения твоего кода, если участок
Цитата Сообщение от Alex_pac Посмотреть сообщение
result:=GetActiveOleObject(name); // пытаемся найти запущенный объект
вызовет исключение, будет создан новый объект со скрытым окном
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 14:13
Цитата Сообщение от DenNik Посмотреть сообщение
вот тебе результат выполнения без вызова Visible
Вложение 185456
И? ..............

вызовет исключение, будет создан новый объект со скрытым окном
Если было исключение класса "интерфейса нет в системе" то объекта там не будет

Добавлено через 4 минуты
без Result.Visible:= true; процесс word.exe будет висеть в памяти и удалять его придется через диспетчер - это раз.
а вот и не раз.

Созданный "невидимый для тебя обеъкт" удаляется оттуда через msword.quit;
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 14:16
Цитата Сообщение от Alex_pac Посмотреть сообщение
Если было исключение класса "интерфейса нет в системе" то объекта там не будет
а если интерфейс в системе есть, но он НЕ ЗАПУЩЕН, то как раз и будет создан новый объект с пресловутым скрытым окном! еще раз узри...

Добавлено через 2 минуты
Цитата Сообщение от Alex_pac Посмотреть сообщение
Созданный "невидимый для тебя обеъкт" удаляется оттуда через msword.quit;
ну так это же другой вопрос. ТС вообще хотел только проверить, установлен ли Ворд. Зачем вообще было включать сюда GetActiveOLEObject и CreateOLEObject??? если проверка нужной информации происходит здесь:
Цитата Сообщение от UI Посмотреть сообщение
Самописная:
Delphi
1
2
3
4
5
6
7
8
9
function IsOLEObjectInstalled(Name: String): boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
  // Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID);
  result := (Rez = S_OK)
end;
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 14:19
ОНО НЕ СКРЫТОЕ. ФУКНЦИЯ ПЕРЕДАЕТ УКАЗАТЕЛЬ, И ТЫ КАК ПРОГРАММИСТ ДОЖЕН С ЭТИМ УКАЗАТЕЛЕМ ЧТОТО СДЕЛАТЬ. А НЕ ВЫКИНУТЬ ЕГО ИЗ ПАМЯТИ.

В ДАННОМ СЛУЧАЕ ДЛЯ "УНИЧТОЖЕНИЯ ОБЪЕКТА" НАДО ВЫЗВАТЬ

Delphi
1
2
3
4
5
6
var w: variant;
begin
w:=GetOleObject('Word.Application');
//
w.quit; // ОБЪЕКТ УНИЧТОЖЕН
end;
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.09.2012, 14:21
Цитата Сообщение от Alex_pac Посмотреть сообщение
ОНО НЕ СКРЫТОЕ. ФУКНЦИЯ ПЕРЕДАЕТ УКАЗАТЕЛЬ, И ТЫ КАК ПРОГРАММИСТ ДОЖЕН С ЭТИМ УКАЗАТЕЛЕМ ЧТОТО СДЕЛАТЬ. А НЕ ВЫКИНУТЬ ЕГО ИЗ ПАМЯТИ.
я согласен и я знаю, что с ним делать. но ведь ТС не заказывал это а я просто дополнил функцию GetOleObject, чтобы она показывала окно. для наглядности, так сказать
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
26.09.2012, 14:22
ну так это же другой вопрос. ТС вообще хотел только проверить, установлен ли Ворд. Зачем вообще было включать сюда GetActiveOLEObject и CreateOLEObject??? если проверка нужной информации происходит здесь:
GetOleObject позволяет не думать открыт ворд, не открыт, установлен, не установлен. ВСЕ ОЧЕНЬ ПРОСТО.
ОНА просто возвращает объект ворда и все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2012, 14:22
Помогаю со студенческими работами здесь

Отсутствие CommandHandler
Привет=) Вот в Delphi 7 компонент idTCPCServer имеет CommandHandlers: а когда я работаю в RAD XE2 их нету: Вопрос: в 7-ой части...

Определить отсутствие рисунка в Image
чепуха вроде, а запутался. нужно: нажимая на кнопку определяем, загружен ли рисунок в существующий image1, и, в случае если нет,...

Отсутствие точки входа DLL
Написал небольшую библиотечку для 1С, но когда попытался ее зарегать в regsvr32 то получил вот такое послание &quot;Модуль...

Отсутствие ввода данных в компонент StringGrid.
Подскажите пожалуйста. Как сделать так, чтобы в ячейки компонента StringGrid можно было вводить числа кроме нуля и отрицательных....

Отсутствие ввода данных в компонент StringGrid.
Как сделать так, чтобы при не вводе данных в компонент StringGrid при нажатии кнопки &quot;Вычислить&quot; выдавалось следующее сообщение:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru