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

Вниз

Верна ли реализация плугинов   Найти похожие ветки 

 
den_777   (2004-09-22 10:59) [0]

Есть некая задумка по реализации PLUGINов.
Предположим есть абстрактная форма разделенная на две части,
в верхней располагается реестр с общими данными по каким-то
элементам, в нижней PageControl с переменным числом страниц
на каждой из которых детальные данные по
выделенному в данный момент в реестре элементу. В общем
стандартный master-detail. Но какие детальные данные по
элементу можно показать заранее не известно. Поэтому
я избрал следующую схему, может очень корявую.
Объявил интерфейс:

 ISprModify = interface
   ["{A20E9101-C801-43A6-8F9B-64B33AC5056A}"]
   procedure init_plugin(prnt:TWincontrol);
   procedure refrech_plugin(id:integer);
   procedure save_plugin(id:integer);
   procedure onclose_plugin(id:integer);
  end;

Тип  для получения ссылки на интерфейс

 TGetSprModIntrf = function:ISprModify;

В отдельной BPL написал класс реализоующий данный интерфейс  

 TfrmRich = class(TFrame,isprmodify)
   .... какие-то компоненты на ФРЕЙМЕ
   procedure init_plugin(prnt:twincontrol);
   procedure refrech_plugin(id:integer);
   procedure save_plugin(id:integer);
   procedure onclose_plugin(id:integer);
 end;

и експортируемую функцию создающую объект данного класса и
возвращаующую указатель на созданный объект.

function get_ek_spr_intrf:isprmodify;
begin
result:=TfrmRich.create(nil);
end;

В основном приложение каким-то образом я узнаю имена всех BPL,
в которых есть данные плугины и имена экспортных функций,
которые возвращает указатель на объект. Далее  по количеству
плугинов выполняется следующий код

          @f:=GetProcAddress(hm,PChar(func_name));
          if @f<>nil then
           begin
            ts:=TTabSheetIntrf.Create(pcPlug);
            ts.PageControl:=pcPlug;
            ts.Caption:="Plugin "+func_name;
            ts.intf:=f;
            ts.intf.init_plugin(ts);
           end;

где
 f:TGetSprModIntrf;

a

 TTabSheetIntrf = class(TTabSheet)
   intf:isprmodify;
  end;

Ну а далее, на изменение позиции в реестре выполняется
примерно следующее

  for i:=0 to pcPLug.PageCount-1 do
   begin
    try
     TTabSheetIntrf(pcPlug.Pages[i]).intf.refrech_plugin(...);
    except
    end;
   end;

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

Заранее спасибо за советы.


 
Sandman25 ©   (2004-09-22 11:08) [1]

1. Функция для получения интерфейса может иметь одинаковое имя во всех плагинах - не надо будет узнавать имя.
2. Вместо TTabSheetIntrf можно использовать обычный TabSheet, в таге которого запомнен индекс в массиве. Массив может быть array of isprmodify, либо of myRecord.
3. procedure onclose_plugin плохо звучит. Лучше ClosePlugin IMHO


 
den_777   (2004-09-22 11:17) [2]


> Sandman25 ©   (22.09.04 11:08) [1]
> 1. Функция для получения интерфейса может иметь одинаковое
> имя во всех плагинах - не надо будет узнавать имя.

Это частности. А если одна BPL реализует два подобных плугина.
Тогда как. Вобщем это несущественный вопрос.


> 2. Вместо TTabSheetIntrf можно использовать обычный TabSheet,
> в таге которого запомнен индекс в массиве. Массив может
> быть array of isprmodify, либо of myRecord.

Вопрос по синхронизации array и pages, ведь Page во время работы
теоретически может быть и удален и перемещен. Муторно синхронизировать будет.


> 3. procedure onclose_plugin плохо звучит. Лучше ClosePlugin
> IMHO

На то оно и IMHO. У каждого свои пристрастия к названиям, несмотря на все рекомендации.

Спасибо, но нет ответа на главный вопрос, верна ли суть задумки
и более простой способ для хранения ссылки на интерфейс.


 
Sandman25 ©   (2004-09-22 11:23) [3]

А если одна BPL реализует два подобных плугина.

Тогда это уже не плагины, а монолитное приложение получится :)

Муторно синхронизировать будет

А писать наследников TabSheet для каждого приложения немуторно? Кстати, визуальный дизайн страниц будет возможен? При перемещении ничего менять не надо. При удалении нужно будет присвоить nil соответствующему элементу дин. массива

На то оно и IMHO

И все же процедуры должны содержать глагол, а переменные - существительное.


 
Sandman25 ©   (2004-09-22 11:24) [4]

Забыл высказаться.

верна ли суть задумки

Верна.


 
den_777   (2004-09-22 15:17) [5]

А еще мнения будут?


 
Digitman ©   (2004-09-22 15:21) [6]


> А еще мнения будут?


будут.
очередной велосипед это.
берешь, к примеру, готовый пакет компонентов JEDI - там есть все готовое для реализации плагинов ... и на всякие выкрутасы с интерфейсами не нужно тратить ни времени ни сил : остается только сосредоточиться на реализации функц-ти каждого из плагинов


 
den_777   (2004-09-22 15:38) [7]

Не очень понимаю, что такого может быть в пакете компонентов JEDI, что поможет мне загнать фрейм (созданный и обрабатываемый в отдельной BPL) с произвольным набором компонентов на нем, на
созданный под него TTabSheet. Причем плугин должен не только показаться, но и выполнять ряд предопределенных методов. Объясните пожалуйста, как в этом мне может помочь использование  пакета компонентов JEDI, и что конкретно из этого пакета мне необходимо использовать.


 
Digitman ©   (2004-09-22 15:56) [8]


> Не очень понимаю


а внимательно почитать для начала справку к классу TJvPluginManager, прежде чем "не очень понимать" - не судьба ?


 
den_777   (2004-09-22 16:13) [9]

Зачем так злиться, у меня JEDI не стоит, я его никогда не использовал, поэтому и попросил разъяснить. Я понимаю, что JEDI очень хороший пакет компонентов, но тащить его в проект только ради реализации идеи плугинов не очень хочется. Да и велосипед я не изобретаю, в описанном мной выше методике, практически нет ни одной моей идеи, это действительно все давно изобретено, так что если меня и можно в чем-то обвинить, то только в езде  на изобретенном кем-то велосипеде.


 
Digitman ©   (2004-09-22 16:19) [10]


> den_777   (22.09.04 16:13) [9]


> Зачем так злиться


это - напрасно .. оной и в помине нет


> у меня .. не стоит


так пусть встанет ! велики ли проблемы ?


> очень хороший пакет компонентов


это не мое утверждение, это - твое


> тащить его в проект только ради реализации идеи плугинов
> не очень хочется


никто тебя к этому не понуждает

открытый код чьего-то пакета отнюдь не препятствует копированию строго необходимых его частей в свое приложение


 
den_777   (2004-09-22 16:40) [11]

Ну хорошо, поставлю пакет JEDI, научусь пользоваться TJvPluginManager(на это уйдет какое-то время) или скопирую часть кода к себе. Смогу ли я реализовать все то, что описано мной выше (пока я этого естественно знать не могу), и даже если смогу - какие преимущества по сравнению с уже реализованным мною методом я получаю. Ведь то, что у меня реализовано - это действительно велосипед (в смысле очень просто) и достаточно свободно для расширения. Разрабатывать плугины сможет потом кто угодно(имея только файл с описанием моего интерфейса), а как с этим будут обстоять дела, если я буду использовать TJvPluginManager. Может все же иногда лучше чужой простой велосипед, чем красивый и большой Мерседес(TJvPluginManager) с кучей возможностей.


 
Digitman ©   (2004-09-22 16:54) [12]


> Смогу ли я


Сможешь !!
Никаких прептствий к этому я не вижу.


 
den_777   (2004-09-22 17:03) [13]

Ну и на том спасибо.



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

Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.032 c
6-1091177936
MegaVolt
2004-07-30 12:58
2004.10.10
Когда правильно вызывать WSAStartup и WSACleanup


1-1095842136
TUser
2004-09-22 12:35
2004.10.10
Self^


1-1096278662
Ann_k
2004-09-27 13:51
2004.10.10
Как раскрасить строку в dbgrid?


14-1095763884
Rule
2004-09-21 14:51
2004.10.10
Вот это рынок труда в Москве.


4-1094488155
Fon
2004-09-06 20:29
2004.10.10
Фон Edit-a





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский