powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выполнение без ошибки.
25 сообщений из 36, страница 1 из 2
Выполнение без ошибки.
    #39738818
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я плохо выспался и у меня рябит в глазах или вот такое:

Код: pascal
1.
2.
3.
4.
5.
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.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738822
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
_Промешан_,
вызываемый метод не задействует никаких данных экземпляра класса, поэтому не обращается к неинициализированной памяти, что могло бы вызывать ошибку (ср. классовые методы)
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738826
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_это нормально? В смысле того, что не вызывает ошибку?
Это нормально.
1. Компилятор не отслеживает инициализацию
2. В вызываемом методе нет обращения к внутренним полям объекта, потому фиолетово какой Self у него будет

Будет метод виртуальным, или работающим с полями - будет и ошибка.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738827
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
TA = class(TObject)



Заменяем на
Код: pascal
1.
TA = object



И радуемся.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738830
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Но это так, детали
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738832
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоХотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.
Учи матчасть, студент...
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738834
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ГирлионайльдоХотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

Но это так, детали
Это особенность Дельфей.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738835
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBo_Промешан_,
вызываемый метод не задействует никаких данных экземпляра класса, поэтому не обращается к неинициализированной памяти, что могло бы вызывать ошибку (ср. классовые методы)
Ну и как бы нормально, что A <> NIL = TRUE?
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738841
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Ну и как бы нормально, что A <> NIL = TRUE?
Нормально. Локальные переменные неуправляемых типов не инициализируются.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738843
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
_Промешан_Ну и как бы нормально, что A <> NIL = TRUE?

Да, это же локальная переменная, они не инициализируются автоматически (за исключением строк и т.п.)
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738850
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоХотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса.

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

strict private , если не хочешь дружественную видимость, или как она там называется.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738868
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться. К примеру TLanguages,...,TMonitor

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  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;



Код: pascal
1.
2.
  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.GetTop);



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

... Может тогда существует отдельная опция ? Включающая строгий режим в unit-е ?
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738936
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

класс Б может получить доступ к приватной секции класса А, если он находится в тоже модуле, что и класс А. Даже если они не связаны наследованием.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738947
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39738973
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоА вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться.
Кому нельзя? Соседям по юниту - можно, что и применяют местами. А стороннему коду да, нельзя. На то он и private
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740138
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey_Промешан_Ну и как бы нормально, что A <> NIL = TRUE?
Нормально. Локальные переменные неуправляемых типов не инициализируются.
Каких типов? Можно пример управляемого?
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740146
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

авторэто нормально? В смысле того, что не вызывает ошибку?
важно понимать, что исключение падает только при попытке доступа к данным класса, то есть к сэлфу. здесь доступа к сэлфу нет, соответственно всё работает нормально. непосредственно вызов метода у класса не приводит к проблемам, пока нет попытки доступа к сэлфу.
более того - внутри метода можно проверить - создан ли сэлф или нет и если нет - то можно просто выйти или что-то вернуть в result. я видел реализации такого в коде.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740171
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Каких типов? Можно пример управляемого?

String.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740174
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon...внутри метода можно проверить - создан ли сэлф или нет и если нет...
Расскажи, пожалуйста - как это проверить?
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740191
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоА вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться. К примеру TLanguages,...,TMonitor

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  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;



Код: pascal
1.
2.
  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.GetTop);



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

... Может тогда существует отдельная опция ? Включающая строгий режим в unit-е ?
Зачем обращаться GetTop, если нужно делать так
Код: pascal
1.
2.
  Application.CreateForm(TForm1, Form1);
  ShowMessage(Form1.Monitor.Top);
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740218
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто исключение падает только при попытке доступа к данным класса, то есть к сэлфу. здесь доступа к сэлфу нет,

А разве ссылка на Self не передается как неявный параметр всегда?
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740245
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarА разве ссылка на Self не передается как неявный параметр всегда?
Передается, но не проверяется на валидность же
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740289
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

передаётся. если сэлфа нет, передастся как раз nil.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740291
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Тут смысл никак нужно, а то что это невозможно, по возможности возможно с той же дверью.
...
Рейтинг: 0 / 0
Выполнение без ошибки.
    #39740292
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл Эраmakhaon...внутри метода можно проверить - создан ли сэлф или нет и если нет...
Расскажи, пожалуйста - как это проверить?

Как ни странно: if self = nil then ... :)
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выполнение без ошибки.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]