Главная страница
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.014 c
15-1214405915
TUser
2008-06-25 18:58
2008.08.10
Если вас только 50 тысяч, то вы - лохи


15-1214082477
Поросенок Винни-Пух
2008-06-22 01:07
2008.08.10
3:1


6-1191259975
Дмитрий Белькевич
2007-10-01 21:32
2008.08.10
Получение данных текущего прокси эксплорера


6-1191558528
R4V3N
2007-10-05 08:28
2008.08.10
Проверка активности ServerSocketa


1-1196554693
Elec3C
2007-12-02 03:18
2008.08.10
Вопрос по HotKey ям