Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Выполнение без ошибки.  [new]
_Промешан_
Member

Откуда:
Сообщений: 933
Я плохо выспался и у меня рябит в глазах или вот такое:

procedure TForm1.Button1Click(Sender: TObject);
var a: TA;
begin
  a.Something;
end;


это нормально? В смысле того, что не вызывает ошибку?

+
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


TA = class(TObject)
private
procedure Something;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var a: TA;
begin
a.Something
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ TA }

procedure TA.Something;
begin
ShowMessage('TA.Something');
end;


end.
26 ноя 18, 22:05    [21745464]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
MBo
Member

Откуда:
Сообщений: 64
_Промешан_,
вызываемый метод не задействует никаких данных экземпляра класса, поэтому не обращается к неинициализированной памяти, что могло бы вызывать ошибку (ср. классовые методы)
26 ноя 18, 22:09    [21745470]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
_Промешан_
это нормально? В смысле того, что не вызывает ошибку?

Это нормально.
1. Компилятор не отслеживает инициализацию
2. В вызываемом методе нет обращения к внутренним полям объекта, потому фиолетово какой Self у него будет

Будет метод виртуальным, или работающим с полями - будет и ошибка.
26 ноя 18, 22:14    [21745475]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
TA = class(TObject)


Заменяем на
TA = object


И радуемся.
26 ноя 18, 22:17    [21745476]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Но это так, детали
26 ноя 18, 22:20    [21745480]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
Гирлионайльдо
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Учи матчасть, студент...
26 ноя 18, 22:22    [21745484]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
_Промешан_
Member

Откуда:
Сообщений: 933
Гирлионайльдо
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Но это так, детали

Это особенность Дельфей.
26 ноя 18, 22:28    [21745488]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
_Промешан_
Member

Откуда:
Сообщений: 933
MBo
_Промешан_,
вызываемый метод не задействует никаких данных экземпляра класса, поэтому не обращается к неинициализированной памяти, что могло бы вызывать ошибку (ср. классовые методы)

Ну и как бы нормально, что A <> NIL = TRUE?
26 ноя 18, 22:29    [21745489]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
_Промешан_
Ну и как бы нормально, что A <> NIL = TRUE?

Нормально. Локальные переменные неуправляемых типов не инициализируются.
26 ноя 18, 22:42    [21745501]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
MBo
Member

Откуда:
Сообщений: 64
_Промешан_
Ну и как бы нормально, что A <> NIL = TRUE?


Да, это же локальная переменная, они не инициализируются автоматически (за исключением строк и т.п.)
26 ноя 18, 22:47    [21745508]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
alekcvp
Member

Откуда:
Сообщений: 1194
Гирлионайльдо
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Но это так, детали


strict private, если не хочешь дружественную видимость, или как она там называется.
26 ноя 18, 23:06    [21745537]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
А вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться. К примеру TLanguages,...,TMonitor

+
  TMonitor = class(TObject)
  private
    FHandle: HMONITOR;
    FMonitorNum: Integer;
    function GetLeft: Integer;
    function GetHeight: Integer;
    function GetTop: Integer;
    function GetWidth: Integer;
    function GetBoundsRect: TRect;
    function GetWorkareaRect: TRect;
    function GetPrimary: Boolean;
    function GetPixelsPerInch: Integer;


  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.GetTop);


Нельзя получить доступ к этим функциям, даже если создать TMonitor отдельно

... Может тогда существует отдельная опция ? Включающая строгий режим в unit-е ?
27 ноя 18, 00:01    [21745576]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
goldmi45
Member

Откуда:
Сообщений: 1065
Гирлионайльдо,

класс Б может получить доступ к приватной секции класса А, если он находится в тоже модуле, что и класс А. Даже если они не связаны наследованием.
27 ноя 18, 09:51    [21745717]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
alekcvp
Member

Откуда:
Сообщений: 1194
Гирлионайльдо,

Понятие класса, дружественного другому классу.
27 ноя 18, 10:05    [21745743]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Василий 2
Member

Откуда:
Сообщений: 303
Гирлионайльдо
А вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться.

Кому нельзя? Соседям по юниту - можно, что и применяют местами. А стороннему коду да, нельзя. На то он и private
27 ноя 18, 10:45    [21745788]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
_Промешан_
Member

Откуда:
Сообщений: 933
Kazantsev Alexey
_Промешан_
Ну и как бы нормально, что A <> NIL = TRUE?

Нормально. Локальные переменные неуправляемых типов не инициализируются.

Каких типов? Можно пример управляемого?
28 ноя 18, 22:57    [21747934]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
_Промешан_,

автор
это нормально? В смысле того, что не вызывает ошибку?

важно понимать, что исключение падает только при попытке доступа к данным класса, то есть к сэлфу. здесь доступа к сэлфу нет, соответственно всё работает нормально. непосредственно вызов метода у класса не приводит к проблемам, пока нет попытки доступа к сэлфу.
более того - внутри метода можно проверить - создан ли сэлф или нет и если нет - то можно просто выйти или что-то вернуть в result. я видел реализации такого в коде.
28 ноя 18, 23:37    [21747947]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46350

_Промешан_
Каких типов? Можно пример управляемого?

String.

Posted via ActualForum NNTP Server 1.5

29 ноя 18, 01:24    [21747986]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
makhaon
...внутри метода можно проверить - создан ли сэлф или нет и если нет...

Расскажи, пожалуйста - как это проверить?
29 ноя 18, 01:51    [21747990]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
DimaBr
Member

Откуда:
Сообщений: 10779
Гирлионайльдо
А вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться. К примеру TLanguages,...,TMonitor

+
  TMonitor = class(TObject)
  private
    FHandle: HMONITOR;
    FMonitorNum: Integer;
    function GetLeft: Integer;
    function GetHeight: Integer;
    function GetTop: Integer;
    function GetWidth: Integer;
    function GetBoundsRect: TRect;
    function GetWorkareaRect: TRect;
    function GetPrimary: Boolean;
    function GetPixelsPerInch: Integer;


  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.GetTop);


Нельзя получить доступ к этим функциям, даже если создать TMonitor отдельно

... Может тогда существует отдельная опция ? Включающая строгий режим в unit-е ?

Зачем обращаться GetTop, если нужно делать так
  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.Top);
29 ноя 18, 08:04    [21748019]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Beltar
Member

Откуда:
Сообщений: 143
автор
что исключение падает только при попытке доступа к данным класса, то есть к сэлфу. здесь доступа к сэлфу нет,


А разве ссылка на Self не передается как неявный параметр всегда?
29 ноя 18, 09:35    [21748069]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Василий 2
Member

Откуда:
Сообщений: 303
Beltar
А разве ссылка на Self не передается как неявный параметр всегда?

Передается, но не проверяется на валидность же
29 ноя 18, 10:43    [21748163]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
Beltar,

передаётся. если сэлфа нет, передастся как раз nil.
29 ноя 18, 11:58    [21748341]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
DimaBr,

Тут смысл никак нужно, а то что это невозможно, по возможности возможно с той же дверью.
29 ноя 18, 11:59    [21748345]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
Фэйтл Эра
makhaon
...внутри метода можно проверить - создан ли сэлф или нет и если нет...

Расскажи, пожалуйста - как это проверить?


Как ни странно: if self = nil then ... :)
29 ноя 18, 12:00    [21748346]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
_Промешан_
Каких типов? Можно пример управляемого?

Управляемые: строки, дин.массивы, интерфейсы, варианты (с ARC ещё и объекты).
29 ноя 18, 12:49    [21748432]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
alekcvp
Member

Откуда:
Сообщений: 1194
makhaon
Фэйтл Эра
пропущено...

Расскажи, пожалуйста - как это проверить?


Как ни странно: if self = nil then ... :)


Да неужели?

...

type
  TMyClass = class
    procedure Test;
  end;

procedure TMyClass.Test;
begin
  WriteLn(Integer(Self));
end;

var
  mc: TMyClass;
begin
  mc := TMyClass.Create;
  mc.Free;

  mc.Test; // <-- что тут будет напечатано?
  ...
29 ноя 18, 12:50    [21748434]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
FreeAndNil в помощь. Ну а любителям хранения зомби-ссылок никто уже не поможет. Ни тут ни вообще :)
29 ноя 18, 14:13    [21748585]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10638
makhaon
FreeAndNil в помощь
Не спасет от неинициализированной переменной
var
  mc: TMyClass;
begin
  mc.Test; // <-- что тут будет напечатано?
29 ноя 18, 15:30    [21748743]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5118
Фэйтл Эра
makhaon
...внутри метода можно проверить - создан ли сэлф или нет и если нет...

Расскажи, пожалуйста - как это проверить?


procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
29 ноя 18, 16:10    [21748817]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
_Vasilisk_,
спасёт. если инициализировать нилом.
Квейд,
собственно, да...
29 ноя 18, 17:10    [21748896]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?
29 ноя 18, 21:42    [21749137]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
Фэйтл Эра
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?


Дело в том, что это "волшебное" свойство, оно является значением содержимого переменной классового типа, а не свойством экземпляра объекта. То есть, неинициализированный указатель не будет nil. И, чтобы понять, что класс не был создан, переменную класса следует сперва инициализировать нилом... как-то не очень умно? :)

Но этот фокус с self никак не поможет в случае использования алиасов (когда две переменные по дизайну указывают на один объект)

type 
  X = class
    метод;
  end;
var
  a, b : C;
...
begin
  a := C.Create();
...
  b := a; // Алиас
...
  FreeAndNil(a);
...
  b.метод; // Ничего не знает, что self теперь nil
  
29 ноя 18, 22:26    [21749178]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
Фэйтл Эра,

А ты не бери прямой адрес.
30 ноя 18, 00:47    [21749266]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
Фэйтл Эра
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?


mc := nil;

рекомендую взять отладчик и посмотреть, там всё отлично видно.
30 ноя 18, 01:02    [21749270]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
mc, если что, это и есть ссылка на Self. Не на класс, а на экземпляр класса.
30 ноя 18, 01:03    [21749273]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить