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

Вниз

Как вызывать виртуальные классовые методы из неклассовых методов?   Найти похожие ветки 

 
Игорь Шевченко ©   (2005-07-06 12:49) [0]

Такая ситуация возникла при переносе проекта из Win32 в Vcl.Net -

Есть иерархия из трех форм:

type
 TfAsiaWorldMDI = class(TForm)
  ..//ничего интересного, кроме обработчика OnClose
  end;

type
 TfAsiaWorldMDIDataView = class(TfAsiaWorldMDI)
   procedure FormCreate(Sender: TObject);
 strict protected
   function GetModel: IAsiaModel;
   class function GetModelName: string; virtual;
 end;

и

type
 TfCountryView = class(TfAsiaWorldMDIDataView)
 strict protected
   class function GetModelName: string; override;
 end;


реализация методов TfAsiaWorldMDIDataView выглядит так:

procedure TfAsiaWorldMDIDataView.FormCreate(Sender: TObject);
begin
 inherited;
 DataSource.DataSet := GetModel.DataSet;
end;

function TfAsiaWorldMDIDataView.GetModel: IAsiaModel;
begin
 Result := ModelList.FindModel(GetModelName);
end;

class function TfAsiaWorldMDIDataView.GetModelName: string;
begin
 Result := "";
end;


и реализация метода TfCountryView.GetModelName:

class function TfCountryView.GetModelName: string;
begin
 Result := "COUNTRY";
end;


При попытке создания формы TfCountryView на экран вылезает  messagebox с одним словом: @MetaTfAsiaWorldMDIDataView.GetModelName()

и метод TfAsiaWorldMDIDataView.GetModel завершается с ошибкой NullReferenceException

После переделки виртуальных классовых методов в вирутальные неклассовые программа работает нормально, но хотелось бы узнать, как можно использовать именно вирутальные классовые методы в таком вот контексте.

На Win32 разумеется, все работает.


 
VMcL ©   (2005-07-06 13:06) [1]

>>Игорь Шевченко ©   (06.07.05 12:49)

Честно говоря, не знаю, как именно в Delphi.NET, но сам .NET (по крайней мере CLS) виртуальные статические (они же классовые) методы не предусматривает, AFAIK.

Но, по идее, можно это дело обойти, воспользовавшись рефлексией.


 
Игорь Шевченко ©   (2005-07-06 13:10) [2]

VMcL ©   (06.07.05 13:06) [1]

Вот для этого в Delphi сделаны так называемые Meta-классы, которые появляются при объявлении каждого класса Delphi.Net


 
VMcL ©   (2005-07-07 00:40) [3]

>>Игорь Шевченко ©   (06.07.05 13:10) [2]

Тады ой. Я с C# и VB.NET работаю. С Delphi.NET у меня как-то не сложилось.


 
k2 ©   (2005-07-07 12:43) [4]

перенести из strict protected в protected
пока не разобралась почему, но работает :)


 
Игорь Шевченко ©   (2005-07-07 12:46) [5]

k2 ©   (07.07.05 12:43) [4]

Спасибо!! И впрямь работает. А почему - известно должно быть борланду.

О сколько нам открытий чудных
Готовит просвещенья дух
И опыт, сын ошибок трудных
и Borland, Paradox"ов друг.



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
3-1203656748
ari_9
2008-02-22 08:05
2008.08.10
MS SQL 2005. можно передать в Raiserror значение функции ?


2-1215590222
kyn66
2008-07-09 11:57
2008.08.10
Скриншот окна броузера


2-1215676956
Артур Пирожков
2008-07-10 12:02
2008.08.10
Простой вопрос по tpopupmenu


15-1214475307
AEN
2008-06-26 14:15
2008.08.10
Сколько квадратных метров засеянной пшеницы...


15-1214050387
Илья Корстин
2008-06-21 16:13
2008.08.10
mui32.lib, glut32.lib, glut32.dll