Вниз
Скачать: CL | DM;

Объект nil, а метод вызывается!!!   Найти похожие ветки 

← →
Grant   (2009-11-27 13:13) [0]

Всем привет. Объясните пожалуйста следующую осебенность Делфы.
Создаю приложение. Создаю ещё один юнит.
Код юнита:
unit Unit2;

interface

uses
 SysUtils, Dialogs;

type
 TGrant = class
   public
     procedure Met;
 end;

implementation

procedure TGrant.Met;
begin
 ShowMessage("aaa");
end;

end.

На главной форме добавляю в uses новый юнит(unit2) и пишу следующий код обработчика щелчка кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var
 vGrant: TGrant;
begin
 vGrant.Met;
end;

При отладке переменная vGrant = nil. При этом метод выполняется и выводится на экран окно с сообщением. Вопрос: КАК??? Ведь переменная nil. Заранее спасибо.


← →
Плохиш ©   (2009-11-27 13:17) [1]


> Вопрос: КАК??? Ведь переменная nil.

Ну и что, в методе нет обращений к несуществующем переменным/полям.
Сделай поле в классе, вставь вывод его значения в своём методе и получишь своё желаемое исключение.


← →
RWolf ©   (2009-11-27 13:44) [2]

Виртуальные методы вызываться не будут, т.к. чтобы их вызвать, нужно получить их адрес через VMT, которая заполняется при создании объекта.
А невиртуальные — пожалуйста, их адрес известен на этапе компиляции.


← →
Ухарь   (2009-11-27 21:22) [3]

В данном случае (в случае невиртуального метода) его можно рассмотреть как процедуру с неявным параметров Self: TMyObject;
В данном случае она имеет значение nil;

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



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

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.007 c
1-1233569939
OlegNik
2009-02-02 13:18
2010.01.17
Работа с общей памятью.


2-1257530320
Zalm
2009-11-06 20:58
2010.01.17
Странности с TMediaPlayer


6-1211457427
тимохов
2008-05-22 15:57
2010.01.17
Vista и ошибка 10051


4-1226479042
SpellCaster
2008-11-12 11:37
2010.01.17
Пара вопросов по PopupMenu


15-1257939335
ZeroDivide
2009-11-11 14:35
2010.01.17
Очереной отжиг от Google




   Наверх