Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.12.20;
Скачать: CL | DM;

Вниз

как добавить элемент в наследника TCollection   Найти похожие ветки 

 
Sakipiel   (2014-06-25 21:33) [0]

есть реквизит класса 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, так и в его наследниках, но ничего в этом ужасе так и не понял...потому просто как добавить элемент? )


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

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


 
Sakipiel   (2014-06-26 06:47) [2]

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


 
brother ©   (2014-06-26 07:17) [3]

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


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

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


 
MBo ©   (2014-06-26 08:37) [5]

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


 
MBo ©   (2014-06-26 08:38) [6]

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


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


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


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


 
Inovet ©   (2014-06-26 09:09) [8]

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

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


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

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

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


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


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

TPSDllPlugin.Create(AMyPluginCollection);


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


var Plugin :TPSPlugin;

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


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


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

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


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

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

TPSPlugins.Create(ce);

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


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


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


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

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

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

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


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


 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:35) [16]

ураа


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:36) [17]

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



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

Текущий архив: 2015.12.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1429825354
Rouse_
2015-04-24 00:42
2015.12.20
К девятому мая


15-1429522423
pavelnk
2015-04-20 12:33
2015.12.20
По Андроиду


2-1403689302
Imagination
2014-06-25 13:41
2015.12.20
Не работает CopyPaste


15-1423150223
Дмитрий С
2015-02-05 18:30
2015.12.20
Midi 2 Beep-код


2-1403699566
CodeDrunk
2014-06-25 16:32
2015.12.20
Проектирование БД