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

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

как добавить элемент в наследника TCollection


Sakipiel ©   (2014-06-25 21:33:00) 

есть реквизит класса FPlugins: TPSPlugins;

определение которого выглядит так:

 TPSPluginItem = class(TCollectionItem)
 private
   FPlugin: TPSPlugin;
   procedure SetPlugin(const Value: TPSPlugin);
 protected
   function GetDisplayName: string; override;
 public
   procedure Assign(Source: TPersistent); override; //Birb
 published
   property Plugin: TPSPlugin read FPlugin write SetPlugin;
 end;

 
 TPSPlugins = class(TCollection)
 private
   FCompExec: TPSScript;
 protected
   
   function GetOwner: TPersistent; override;
 public
   
   constructor Create(CE: TPSScript);
 end;


и есть наследник этого класса, например,
 TPSDllPlugin = class(TPSPlugin)
 public
   procedure CompOnUses(CompExec: TPSScript); override;
   procedure ExecOnUses(CompExec: TPSScript); override;
 end;


такой. И мне нужно в реквизит FPlugins добавить этого наследника Программно. В компоненте есть возможность делать это через объект инспектор, но мне нужно программно. я долго копался как в TCollection, так и в его наследниках, но ничего в этом ужасе так и не понял...потому просто как добавить элемент? )


Sakipiel   (2014-06-26 19:36:00) [1]

легко ж было догадаться ))


Sakipiel   (2014-06-26 19:35:00) [2]

ураа


procedure TMainForm.FormCreate(Sender: TObject);
var Plugin :TPSPlugin;
begin
   Plugin := TPSDllPlugin.Create(self);
   TPSPluginItem(ce.Plugins.Add).Plugin := Plugin;

end;


Sakipiel   (2014-06-26 19:31:00) [3]


 TPSPlugin = class(TComponent)
 public
   procedure CompOnUses(CompExec: TPSScript); virtual;

   procedure ExecOnUses(CompExec: TPSScript); virtual;

   procedure CompileImport1(CompExec: TPSScript); virtual;

   procedure CompileImport2(CompExec: TPSScript); virtual;

   procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); virtual;

   procedure ExecImport2(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); virtual;
 end;
 
 
 TPSDllPlugin = class(TPSPlugin)
 public
   procedure CompOnUses(CompExec: TPSScript); override;
   procedure ExecOnUses(CompExec: TPSScript); override;
 end;


блин...наследник таки не наследник коллекции...


Sakipiel   (2014-06-26 19:20:00) [4]


> А какой смысл в плагинах, реализующих методы, о которых
> менеджер плагинов ничего не знает?


эх, велосипед не мой, я просто разместил объяву )

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

Проблема в том, что я компонент не кидаю на форму, а создаю программно, а значит и плагин нужно создать и привязать программно к компоненту, а я знаю только как его на форме привязать через объект инспектор (

там все замечательно работает, просто я не могу понять как)


Sakipiel   (2014-06-26 19:16:00) [5]

впрочем нужно сказать что это не работает, как и это

TPSPlugins.Create(ce);

procedure TMainForm.FormCreate(Sender: TObject);
var Plugin :TPSPlugin;
begin
    Plugin := TPSPlugin.Create(self);
    TPSPluginItem(ce.Plugins.Add).Plugin := Plugin;
end;


Styx   (2014-06-26 19:10:00) [6]


>  если он создает TPSPlugin, то в нем нет методов наследника

А какой смысл в плагинах, реализующих методы, о которых менеджер плагинов ничего не знает?


Sakipiel   (2014-06-26 18:56:00) [7]


var Plugin :TPSPlugin;

begin
     Plugin := TPSImport_MyClass.Create(self);
    TPSPluginItem(ce.Plugins.Add).Plugin := Plugin;
end;


jack128_   (2014-06-26 10:59:00) [8]

TPSDllPlugin.Create(AMyPluginCollection);


Sakipiel   (2014-06-26 10:32:00) [9]

я тупой, я не понимаю

function TSpotCollection.Add: TSpot;
begin
// Получаем общий TCollectionItem и приводим его к нашему TSpot
 Result := TSpot(inherited Add)
end;


в ссылке выше, Адд переопределен и там приведение типа, но тогда у меня на каждого наследника должен быть отдельный АДД, в TPSPlugin же используется оригинальный АДД из TCollection, и тем не менее как то это уже работает, поэтому дописывать что-то не вариант.


Inovet   (2014-06-26 09:09:00) [10]

> [7] Sakipiel   (26.06.14 09:02)
> то в нем нет методов наследника...

Для этого придумали полиморфизм.


Sakipiel   (2014-06-26 09:02:00) [11]


> Как это непонятный, если конструктор коллекции задаёт тип
> элементов?


но даже если так, то у меня разные типы элементов, хоть они и все наследники класса TPSPlugin. если он создает TPSPlugin, то в нем нет методов наследника...


MBo   (2014-06-26 08:38:00) [12]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=215


MBo   (2014-06-26 08:37:00) [13]

>он добавляет какой то непонятный элемент
Как это непонятный, если конструктор коллекции задаёт тип элементов?


Sakipiel   (2014-06-26 07:20:00) [14]

не я, это rem object я просто пытаюсь понять как в него программно элемент добавить )


brother   (2014-06-26 07:17:00) [15]

кто писал класс TPSPlugins ?


Sakipiel   (2014-06-26 06:47:00) [16]

метод есть, но в нем нет параметра, он добавляет какой то непонятный элемент, и что мне с ним делать? он же не TPSDllPlugin добавит.


Плохиш   (2014-06-26 01:30:00) [17]

Ну если в коллекции не стало метода адд, то делфи точно умерло.


Наверх

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