Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Вниз

Фабрика класса   Найти похожие ветки 

 
dapher   (2005-12-21 16:24) [0]

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


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


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

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

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

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

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

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

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


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

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


 
k2 ©   (2005-12-22 06:08) [3]

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



Страницы: 1 вся ветка

Форум: "Corba";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.041 c
1-1180596738
ВременныйГость
2007-05-31 11:32
2007.08.05
MaskEdit


2-1184062709
AleksandrR
2007-07-10 14:18
2007.08.05
Работа с датой


2-1183875954
>>DEATH<<
2007-07-08 10:25
2007.08.05
Загрузка картинок из DLL


2-1183965039
Giperon
2007-07-09 11:10
2007.08.05
Работа с дочерними MDI-формами


15-1184143109
DelphiN!
2007-07-11 12:38
2007.08.05
Разрешить доступ к удаленному компу из под пользователя SYSTEM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский