Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2022, 23:17   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию Обратиться к самому объекту (with ... do)

Если применяется вот такая вот конструкция
Код:
with Tbutton.create do begin
То как можно обратиться к самому объекту? Если у него какой-то нет заданной переменной. Например, чтобы он выступил как параметр для какой-то процедуры
Kronos913 вне форума Ответить с цитированием
Старый 08.09.2022, 00:13   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,811
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То как можно обратиться к самому объекту?
Никак. Сам уже сто лет возмущаюсь что нет такой возможности.
northener вне форума Ответить с цитированием
Старый 08.09.2022, 00:34   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,214
По умолчанию

А лень переменную обозначить? Хотя согласен - так было бы удобнее. Как вариант можно создавать объект контейнер, но это еще длиннее, чем задать переменную и обращаться через нее.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 01:05   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,811
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Хотя согласен - так было бы удобнее.
А главное в чём причина отсутствия такой возможности? Ведь компилятор прекрасно знает адрес вновь созданного таким образом объекта?
northener вне форума Ответить с цитированием
Старый 08.09.2022, 01:10   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,214
По умолчанию

Сам не понимаю. Зато в каждом методе класса доступен абсолютно бесполезный Self как ссылка на этот самый объект. Почему так нельзя было сделать с with .. do
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 01:24   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,811
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Зато в каждом методе класса доступен абсолютно бесполезный Self как ссылка на этот самый объект
Вот так раз! И почему же он бесполезный???
Как раз очень полезный и даже необходимый в ряде случаев.
northener вне форума Ответить с цитированием
Старый 08.09.2022, 05:19   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,214
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Как раз очень полезный и даже необходимый в ряде случаев.
Вот поэтому и бесполезный. Применяется только в ряде случаев и во всех этих случаях может быть заменен на прямую ссылку. Хотя согласен, что полезен - иначе бы пришлось создавать дополнительные конструкции для подобного обращения, а это громоздко.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 12:26   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,014
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Зато в каждом методе класса доступен абсолютно бесполезный Self как ссылка на этот самый объект. Почему так нельзя было сделать с with .. do
А если бы так сделали, то внутри with на чтобы ссылался Self?
Arigato вне форума Ответить с цитированием
Старый 08.09.2022, 12:54   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,214
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А если бы так сделали, то внутри with на чтобы ссылался Self?
А зачем именно Self, слов что-ли мало. Как насчет слова This, Object или Local. Так Self будет экземпляром класса, а для специального слова можно даже предусмотреть уникальный механизм, который позволял бы ссылаться на объект любой вложенности для with .. do. Хотя придумать что-то компактное для такой адресации я вряд ли смогу сходу. Разве что
Код:
begin
  with a.Create do
    with b.Create do
      with c^ as TRecord do
        with d do begin
          a_field := 0;
          d_field := 1;
          c_field := 2;
          d_field := 3;
          This.d_field := 4;
          _This.c_field := 5;
          __This.b_field := 6;
          ___This.a_field := 7;
        end;
end;
Но это не очень компактно и красиво с точки зрения синтаксиса Pascal

ADD: Поэтому конструкция with .. do при отсутствии такого компактного механизма теряет актуальность. И всегда можно сделать так
Код:
var
  va: a;
  vb: TbClass;
begin
  va := a.Create;
  vb := b.Create;
  with va do
    with vb do
      with c^ as TRecord do
        with d do begin
          a_field := 0;
          d_field := 1;
          c_field := 2;
          d_field := 3;
          d.d_field := 4;  { d уже является тем, что нам нужно - This лишнее слово }
          c^ as TRecord.c_field := 5; { с уже является тем, что нам нужно - This лишнее слово }
          vb.b_field := 6;
          va.a_field := 7;
        end;
ADD2: С другой стороны, если вы пишите свой класс, тогда можно для него предусмотреть метод с именем This возвращающий Self. Правда тогда нельзя будет во вложенных структурах определить к какому из методов объекта вы хотите обратиться для получения ссылки на класс.

Последний раз редактировалось macomics; 08.09.2022 в 13:22.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 16:00   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,014
По умолчанию

with добавляет путаницу. Кстати, чтобы не делать кучу вложенных блоков, можно в одном with сделать перечисление через запятую.
Arigato вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к динамически созданному объекту, изменить его? 2bfree Общие вопросы Delphi 3 24.07.2011 14:06
Обратиться к объекту фрейма без id'а SkrudjMakdak JavaScript, Ajax 1 11.06.2011 21:46
Как обратиться к объекту формы из другого класса java micha-r Общие вопросы по Java, Java SE, Kotlin 1 03.10.2009 21:07
Можно ли обратиться к объекту, запустившему событие? ekesar Microsoft Office Excel 7 14.12.2008 21:17
Как обратиться к объекту который был только что создан Arassir Помощь студентам 5 24.10.2008 20:42