Ситуация: реализован интерфейс плугинов с использованием собственно
интерфейсов. каждый плугин при свое загрузке регистрируется в программе
type
TfmDouble = class(TPluginAutomationForm) //форма плугина
....
procedure _SetAutomationFileName(Value:string); override;
....
property AutomationFileName: string read fAutomationFileName write
_SetAutomationFileName;
end;
initialization
if not Assigned(GetClass('TfmDouble')) then RegisterClass(TfmDouble);
загружаем плугин LoadPackage(PlugInList[i]);
и далее при вызове плугина
var frmClass: TFormClass;
frmClass := TFormClass(GetClass('TfmDouble'));
if Assigned(frmClass) then frmClass.Create(Self);
все это работает прекрасно.
но если далее
frmPlugin:= TPluginAutomationForm(frmClass);
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
должна вызываться процедура _SetAutomationFileName, однако нет ошибка
именно в последней строке access violation in module shell32.dll
причем тип TPluginAutomationForm описан в общем рантайм модуле.
type
TPluginAutomationForm = class(TForm)
private
fAutomationFileName: string;
public
procedure _SetAutomationFileName(Value:string); virtual; abstract;
published
property AutomationFileName: string read fAutomationFileName write
_SetAutomationFileName;
end;
Подскажите, в чем тут могут быть грабли????
Может быть имеет смысл описать класс процедуру и ей передавать параметры, но
тогда теряется идее гибкости, когда использую rtti можно присвоить свойству
необходимый параметр.
+ в чем принципиальная разница класс и не класс процедур, досих пор не
уловил

?
Здравствуйте, Аноним, Вы писали:
А>но если далее
А>frmPlugin:= TPluginAutomationForm(frmClass);
А>frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
А>должна вызываться процедура _SetAutomationFileName, однако нет ошибка
А>именно в последней строке access violation in module shell32.dll
давай определимся вот тут...
что такое frmPlugin? экземпляр плагина? а что такое frmClass? суть улавливаешь?
> + в чем принципиальная разница класс и не класс процедур, досих пор не
> уловил
?
класс процедуру можно вызвать как TMyForm.ClassProc и в них, соответственно нет Self, недоступны значения св-в
для твоего примера это могло выглядеть так:
initialization
if not Assigned(GetClass('TfmDouble')) then RegisterClass(TfmDouble);
PluginList.Add(TfmDouble.PluginTitle); // т.е. добавляем название в список плагинов
With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9 gamma
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Здравствуйте, Аноним, Вы писали:
А>>но если далее
А>>frmPlugin:= TPluginAutomationForm(frmClass);
А>>frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
А>>должна вызываться процедура _SetAutomationFileName, однако нет ошибка
А>>именно в последней строке access violation in module shell32.dll
OAB>давай определимся вот тут...
OAB>что такое frmPlugin? экземпляр плагина? а что такое frmClass? суть улавливаешь?
другими словами надо описать тип TPluginAutomationFormClass = class of TPluginAutomationForm;
но тогда будут видны только класс методы, каков может быть выход?
Здравствуйте, <Аноним>, Вы писали:
А>frmClass := TFormClass(GetClass('TfmDouble'));
А>if Assigned(frmClass) then frmClass.Create(Self);
А>все это работает прекрасно.
Ага. Вот в этот момент ты создал экземпляр класса. Но увы — ссылку на него ты зачем-то выбросил. Кто будет сохранять результат frmClass.Create?
frmPlugin:= TPluginAutomationForm(frmClass);
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
Здорово. Какого типа у нас frmClass? Формально — TFormClass, т.е. class of TForm, на самом деле, ессно,
class оf TPluginAutomationForm. А ты его к чему приводишь? Првильно, к просто TPluginAutomationForm. Вот и возникают грабли. Ты пытаешься вызвать методы экземпляра на классе. Надо так:
frmPlugin:= TPluginAutomationForm(frmClass.Create(self));
frmPlugin.AutomationFileName:= 'полный путь к комендному файлу';
... << RSDN@Home 1.1.4 beta 3 rev. 185>>