Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Оцените код


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

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

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. Может, "есть способ лучше"?

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

Автор: <Spawn> 28.10.2004, 17:14
Имхо вполне нормальный код, но не есть хорошо, что ты привызываешь процедурку в обработчиках исключения к эеземпляру обьекта 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;

Автор: кварк 29.10.2004, 07:42
Ясненько. Спасибо. Учту.

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


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

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

Автор: Medved 6.11.2004, 16:01
кварк, приятно, что Вы вернулись.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)