Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оцените код, для сосздания/удаления COM-объекта 
:(
    Опции темы
кварк
Дата 28.10.2004, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.8.2002

Репутация: нет
Всего: нет



Эх, давно здесь не был... Но наконец-таки нашел пароль :-)))

Знатоки, зацените, пожалуйста, код:
Код

procedure COMWorking(var tsl: TStrings);
var
 co: Variant; // Common Object :-)
begin
 try
   co := CreateOLEObject('ИМЯ_ОБЪЕКТА');
 except
   on e: exception do
   begin
     tsl.Add('Ошибка при создании объекта:');
     tsl.Add(e.Message);
     Exit
   end
 end;
 try
   try
      // <--------------------------------------------------- Insert working code here
   except
     on e: exception do
     begin
       tsl.Add('Произошла ошибка:');
       tsl.Add(e.Message);
     end
   end
 finally
   co := Unassigned;
 end;
end;


Хотел написать что-то типа шаблона для выполнения действий с COM-объектом.
Мне кажется слишком громоздким. Чувствую, что можно попроще. Особенно не нравится try..except, вложенный в try..finally. Может, "есть способ лучше"?

В общем, принимаются замечания по улучшению.

Это сообщение отредактировал(а) кварк - 28.10.2004, 14:31
PM MAIL   Вверх
<Spawn>
Дата 28.10.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Имхо вполне нормальный код, но не есть хорошо, что ты привызываешь процедурку в обработчиках исключения к эеземпляру обьекта tsl. Имохо там лучьше ставить исключения. Либо обычные Exception, либо создать своих наследников, т.е.:

Код
ECOMObjectNotExists = class(Exception);
ECOMWorkingError = class(Exception);

procedure COMWorking(var tsl: TStrings);
var
co: Variant; // Common Object :-)
begin
try
  co := CreateOLEObject('ИМЯ_ОБЪЕКТА');
except
  on e: exception do
       raise ECOMObjectNotExists.Create('Error Text');
end;
try
  try
    // <--------------------------------------------------- Insert working code here
  except
     on e: exception do
         raise ECOMWorkingError.Create('Error Text');
  end
finally
  co := Unassigned;
end;
end;

Тогда можно юзать функцию так:

try
 COMWorking();
except
 on E: ECOMObjectNotExists do
   //что то делаешь
 on E: ECOMWorkingError do
   //что то делаешь
end;


Это сообщение отредактировал(а) <Spawn> - 28.10.2004, 17:16


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
кварк
Дата 29.10.2004, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.8.2002

Репутация: нет
Всего: нет



Ясненько. Спасибо. Учту.
PM MAIL   Вверх
Fantasist
Дата 5.11.2004, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
try
  co := CreateOLEObject('ИМЯ_ОБЪЕКТА');
except
  on e: exception do
      raise ECOMObjectNotExists.Create('Error Text');
end;


Смысл? CreateOLEObject и так выбросит EOleSysError в случае неудачи создания объекта.

В общем-то и на выполнения кода то же самое - исключение при работе с COM обектом выброситься такое же с более подробным мессаджем. Так что реально имеет смысл только блок try... finally.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Medved
Дата 6.11.2004, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



кварк, приятно, что Вы вернулись.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
<Spawn>
Дата 11.11.2004, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



FantasistЯ переделывал код кварк-а. В его случае он пишет обработчик ошибок для конкретных участков кода, видимо, для того, чтобы знать блок, в котором произошла ошибка. Ну дак вот, что бы не нарушить логику работы его я и сделал так. В противном случае, нельзя быть уверенным, что к какому блоку относится ошибка - к первому или второму. Вполне вероятно, что EOleSysError может быть сгенерирована и при работе с самим COM-обьектом.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.