Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 49

Описание типа procedure of object Нужны подробности

11.11.2016, 13:34. Показов 6826. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Когдато, очень давно, на просторах Интернета нашел библиотеку, которая очень похожа на ту, которую мне сейчас надо написать. С моей точки зрения библиотека написано очень проффесионально. Аторы выложили ее в открытый доступ, за что им отдельный земной поклон, и просили не претендовать на авторство. Но кто автор и/или ресурс откуда она могла быть скачана не указаны. А так-как добрался до нее я только сейчас (пару лет спустя) источник, к сожалению, утрачен.

Разбирая их код я столкнулся с описанием TOnTimer = procedure of object;, которое, пока, не совсем могу понять.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
unit MD_PCSC;
...
interface
 
uses
...
type
...
   TOnTimer = procedure of object;
...
 
  
  TReaderListThread = class(TThread)
    private
...
      FOnTimer: TOnTimer;
    public
...
      property OnTimer: TOnTimer read FOnTimer write FOnTimer;
...
  end;
 
  TPCSC = class
    private
...
      FReaderListThread: TReaderListThread;
...
      procedure CheckCardStates;
...
  end;
 
  constructor TReaderListThread.Create(PCSCRaw: TPCSCRaw);
  begin
...
    FOnTimer := nil;
...
  end;
 
  constructor TPCSC.Create;
  begin
...
    FReaderListThread.OnTimer := CheckCardStates;
...
  end;
 
  procedure TPCSC.CheckCardStates;
  begin
...
  end;
и собственно гвооря все. Больше никаких ссылок на OnTimer нет. Более того, в тестовом проекте, который использует данную библиотеку и показывает ее возможности, я не отследил других прямых или косвенных ссылок на него.

Из общения на форумах я понял (поправте если я не прав), что TOnTimer это тип, который описывает некий указатель на метод.
Запись property OnTimer: TOnTimer read FOnTimer write FOnTimer возвращает - устатнавливает указатель
запись FOnTimer := nil; обнуляет указатель
Используется когда в разных классах, не наслудемых друг другом, по какой-то причине должны быть однаковые методы. В одном слассе мы описываем сам метод, а во втором устанваливаем указатель на него. Тут сразу возникает вопрос о требованиях к построению таких методов, но не это главное.

Главный вопрос - зачем так делать в данном конкретном случае? Ведь, фактически, исполняется код метода TPCSC.CheckCardStates. Зачем в экземпляр класса TReaderListThread , который не является родительским, т.е. он инкапсулирован (правильно?) и доступен только из этого экземпляра класса TPCSC, пердавать указатель на этот метод? Такое действие не укладывается в мое понимание, описанное выше.

Я согласен, что если вы не автор библиотеки, то о причинах такого написания можно только догадываться, но может кто разъяснит или подскажете где об этом можно почитать. На форумах, к сожалению, слишком скудная информация. А в тех книгах, что я читал, такое описание не упоминается.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2016, 13:34
Ответы с готовыми решениями:

Подробности оживления батареи бука (-нужны)
Почитал интернетов, вижу -- на первых страницах выдачи гугла разной степени кустарщина и колдунство (действия без объяснения их...

Сборка топ пк, игры-стримы, нужны подробности, советы!
Нужен совет знающих людей, помогите выбрать между Ryzen 1800x и Intel i7 7700k Также посоветуйте альтернативу мат. платы, на данный...

Вывести переменную типа string в консоль: Object reference not set to an instance of an object
Вот такой сабж. Пытаюсь вывести переменную типа стринг в консоль Сначала, как обычно for (int ii = 0; ii <...

8
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
11.11.2016, 13:36
Цитата Сообщение от jeckp Посмотреть сообщение
Разбирая их код я столкнулся с описанием TOnTimer = procedure of object;, которое, пока, не совсем могу понять.
Это коллбэк, означающий что присваиваемая процедура должна принадлежать классу. Данное ограничение можно обойти с помощью TMethod
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
11.11.2016, 17:48
тут устанавливается что TOnTimer - это метод любого объекта типа процедура без параметров

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

в делфи тотально все события сделаны по этому образу. только типы разные. самый частый -
TNotfiication=procedure (Sender:TObject) of object;
0
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 49
15.11.2016, 15:34  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
при создании объекта класса можно присвоить адрес вашей процедуры
т.е. не обязательно метод, а любая процедура?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
15.11.2016, 22:37
когда написано of object - метод класса
не написано - просто процедура/функция
0
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 49
15.11.2016, 23:17  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
при создании объекта класса можно присвоить адрес вашей процедуры,
Цитата Сообщение от krapotkin Посмотреть сообщение
когда написано of object - метод класса
не написано - просто процедура/функция
Как говорил кот Базилио: "Алиса! Ты меня не путай." Итак есть описание
Delphi
1
2
3
4
5
6
TOnTimer = procedure of object;
TReaderListThread = class(TThread)
    private
...
      FOnTimer: TOnTimer;
end; //TReaderListThread = class(TThread)
Могу ли я присвоить переменной адрес некой процедуры не являющейс методом класса? Например

Delphi
1
2
3
4
5
6
 procedure SuperTimer;
   
...
constructor TReaderListThread.Create(PCSCRaw: TPCSCRaw);
   FOnTimer:= SuperTimer;
...
естественно при условии ее видимости. И тогда вызвав метод TReaderListThread.FOnTimer фактически выполнится процедура SuperTimer?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
16.11.2016, 01:04
вообще метод класса это тоже процедура или функция. поэтому еще раз внимание на пост 5

ответ - нет
если просит метод объекта (procedure/function ....... of object) - дайте метод объекта
причем любого объекта

по исходному вопросу - что тут непонятного?
это способ время от времени объекту получать управление от запущенного этим объектом потока
при этом сложно сказать, для чего...
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
16.11.2016, 01:30
Цитата Сообщение от jeckp Посмотреть сообщение
Могу ли я присвоить переменной адрес некой процедуры не являющейс методом класса?
Не можешь. Выражение of object имеет очень большой сакральный смысл. Который при спуске с небес на грешную землю означает что у метода класса есть неявный параметр, в котором передается ссылка на конкретный экземпляр данного класса, для которого (экземпляра) вызван сей метод. Доступ к этой ссылке даёт зарезервированное слово Self.
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
16.11.2016, 12:07
чаще всего это используется для создания механизма обработки событий (Events) в визуальных компонентах. Поройся в исходниках и попытайся понять, как работает, например, OnClick у кнопки
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2016, 12:07
Помогаю со студенческими работами здесь

Нарисовать дом используя procedure Line, procedure Circle, procedure Rectangle
Добрый вечер, нужна ваша помощь, просто на просто не успеваю.. Помогите пжлст... 2. Нарисовать дом используя procedure Line, procedure...

Есть объект такого типа object{object[]}
Как получить доступ к внутреннему объекту? Среда - Visual Studio 2010 Обрабатываю событие из COM объекта: void...

Программирование с использованием подпрограмм общего вида типа PROCEDURE
Помогите с задачей, слаб в подпрограммах, относительно недавно начали изучать. Вот задача: Заданы матрицы A= (i=1, 2, 3; j=1, 2, 3), B=...

Для чего нужны object sender и this
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static...

Для каждого из вариантов требуется составить программу с исп подпрограммы типа procedure
составить программу с исп подпрограммы типа procedure. Даны две матрицы А(3,5),В(7,7).присвоить переменной В1 значение 1 если элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru