- Код: Выделить всё
TBase(obj).SomeVirtualMethod();
Метод переопределен в TChild, он и вызывается, но Self почему то становится nil

А вот так нормально работает:
- Код: Выделить всё
TChild(obj).SomeVirtualMethod();
FPC 2.2.2 и 2.2.4
Модератор: Модераторы
TBase(obj).SomeVirtualMethod();
TChild(obj).SomeVirtualMethod();
type
TSample = class
protected
Val: String;
procedure proc;
end;
procedure TSample.proc;
var
Val: Integer;
begin
Val:=123; // Это обращение к локальной переменной
self.Val:='Привет!'; // Это обращение к переменной класса
end;
type
TSample = class
public
constructor Create;
end;
var
List: TList;
constructor TSample.Create;
begin
List.Add(Self);
end;
Max Rusov писал(а):FPC 2.2.4 - не подтверждается.
Код в студию.
Mr.Smart писал(а):Возможно я перемудрил
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
Result:=0;
if _active then //вот тут вылетает
begin
//дальше много кода еще
AlexVinS писал(а):Не это все понятно. Конкретно глюк появляется в AV при обращении к полю объекта.
- Код: Выделить всё
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
Result:=0;
if _active then //вот тут вылетает
begin
//дальше много кода еще
Mr.Smart писал(а):AlexVinS писал(а):Не это все понятно. Конкретно глюк появляется в AV при обращении к полю объекта.
- Код: Выделить всё
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
Result:=0;
if _active then //вот тут вылетает
begin
//дальше много кода еще
Это свидетельствует о том, что класс несоздан. Посмотрите в коде внимательно происходит ли вызов контструктора класса...
function StubSetStatus (p1: PPROTO_INTERFACE; iNewStatus: Integer): Integer; cdecl;
begin
Result := TMirandaAccount(p1.obj).SetStatus(iNewStatus); //тут все нормально и p1 и p1.obj указывают на то что нужно, а внутри SetStatus нет.
end;
Mr.Smart писал(а):Остановитесь в методе SetStatus и сравните значения реального адреса объекта и значение Self.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2