Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фабрика класса


dapher ©   (2005-12-21 16:24:00) 

Здравствуйте!
У меня зачет по визуальному программированию, в частности Delphi. На все вопросы ответил, а вот на один не могу, не имел никогда дела с COM технологиями. Если сможете помочь разобрать этот вопрос по винтикам, буду очень признателен! Вопрос дословно звучит так:
"Что такое фабрика класса? Каково ее назначение? Для каких классов она должна использоваться?"
Заранее огромное спасибо!


k2   (2005-12-22 06:08:00) [1]

library ComExample;

uses
 ComServ,
 ComExample_TLB in 'ComExample_TLB.pas',
 Unit2 in 'Unit2.pas' {ComExample: CoClass};

exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;

{$R *.TLB}
{$R *.RES}

begin
end.

unit Unit2;

interface

uses
 Windows, ComObj, ActiveX, ComExample_TLB, StdVcl, Registry, Sysutils;

type
 TMyComObject = class(TAutoObject, IComExample)
 protected
   procedure ShowMessage(const MessageString: WideString); safecall;
   { Protected declarations }
 end;

 TMyComObjectFactory = class(TAutoObjectFactory)
 public
   procedure UpdateRegistry(Register: boolean); override;
 end;

implementation

uses ComServ;

procedure TMyComObject.ShowMessage(const MessageString: WideString);
begin
 if MessageString = '' then
   MessageBox(0, 'Hello! It''s my com object', 'ComExample', 0)
 else
   MessageBox(0, PChar(String(MessageString)), 'ComExample', 0);
end;

{ TMyComObjectFactory }

procedure TMyComObjectFactory.UpdateRegistry(Register: boolean);
var
 reg: TRegistry;
 esection: string;
begin
 esection := 'Software\Microsoft\Office\Excel\TMyComObject\Options';
 try
   reg := TRegistry.Create;
   reg.RootKey := HKEY_CURRENT_USER;
   if Register then begin
     inherited UpdateRegistry(Register);
     if reg.OpenKey(esection, true) then
       try
         reg.WriteString('Option1', 'MyComObjctOption1');
         reg.WriteInteger('Option2', 100);
     finally
       reg.CloseKey;
     end;
     end
   else begin
     reg.DeleteKey(esection);
     inherited UpdateRegistry(Register);
   end;
 finally
   FreeAndNil(reg);
 end;
end;

initialization
 TMyComObjectFactory.Create(ComServer, TMyComObject, Class_ComExample,
   ciMultiInstance, tmApartment);
end.


а использование например в макросе в экселе:
Sub mac1()
Dim come As ComExample.ComExample
Set come = New ComExample.ComExample
come.ShowMessage "My Message"
come.ShowMessage ""
Set come = Nothing
End Sub


dapher   (2005-12-21 19:54:00) [2]

Спасибо огромное! =) Вот только еще маленькая просьба, какой нибудь маленький простенький практический примерчик использования этой фабрики...


Набережных С.   (2005-12-21 18:42:00) [3]


> Что такое фабрика класса?

Фабрика класса - это объект класса, предоставляющий методы для создания экземпляров объектов данного класса. Применительно к СОМ - это объект класса, реализующий интерфейс IClassFactory.
Объект класса - это объект, реализующий функциональность, общую для всех экземпляров данного класса. По аналогии с дельфийскими классами, это контейнер для некоторого подобия class function/class procedure. По аналогии с Си - контейнер для статических методов класса.

> Каково ее назначение?

Назначение фабрики - обеспечить функционирование единообразного механизма по созданию экземпляров объектов класса. Например, системная функция CoCreateInstance использует именно фабрики COM-классов для создания экземпляров COM-объектов. Кроме того, наличие фабрики вместо непосредственного создания экземпляра позволяет разработчику класса предпринять какие-то дополнительные действия при создании объектов.

> Для каких классов она должна использоваться?

Это вытекает из предыдущего - для тех классов, для которых зачем-либо нужен единообразный, универсальный механизм создания экземпляров.

Более подробно и по винтикам этот вопрос описывается в любой книжке по технологии COM, хотя сфера применения фабрик рамками СОМ не ограничиваются.


Наверх

Титульная страница Поиск, карта сайта Написать письмо