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

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

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2022, 09:31   #21
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Код:
type

  TMyClass = class
    private
      function GetThis: Pointer;
    public
      val: integer;
      constructor Create;
      property This: Pointer read GetThis;
  end;

...

constructor TMyClass.Create;
begin
  val := 0;
end;

function TMyClass.GetThis: Pointer;
begin
  Result := @Self;
end;   

procedure TForm1.Button1Click(Sender: TObject);
var
  tmp: ^TMyClass;
begin
  with TMyClass.Create do begin
    val := 10;
    tmp := This;
  end;
  ShowMessage(IntToStr(tmp^.val));
end;
Arigato вне форума Ответить с цитированием
Старый 10.09.2022, 09:44   #22
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Если не нравится ссылка, то можно даже так:

Код:
  TMyClass = class
    private
      function GetThis: TMyClass;
    public
      val: integer;
      constructor Create;
      property This: TMyClass read GetThis;
  end;

...

constructor TMyClass.Create;
begin
  val := 0;
end;

function TMyClass.GetThis: TMyClass;
begin
  Result := Self;
end;   

procedure TForm1.Button1Click(Sender: TObject);
var
  tmp: TMyClass;
begin
  with TMyClass.Create do begin
    val := 10;
    tmp := This;
  end;
  ShowMessage(IntToStr(tmp.val));
end;
Arigato вне форума Ответить с цитированием
Старый 10.09.2022, 09:55   #23
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Компилятор никогда не знал, не знает и не хочет никогда знать никаких имен!
Он работает только с регистрами процессора и их содержимым.
Привожу скришот тестовой программы с окном CPU и с пояснениями.
Вот только вы путаете понятия компилятора и бинарного (машинного) кода. Это процессору надо подставить конкретный указатель. А компилятор в случае конструкции with .. do как раз работает на макроуровне и при ее обработке пытается за вас закончить код, подставляя имена объектов перечисленных в .. к строчкам из блока begin .. end; в этой конструкции. Когда все имена объектов подобраны строчки подлежат ассемблированию, из-за чего и появляется тот самый esi - ссылка.

С самим регистром esi у вас не связано ни каких свойств/методов/полей/функций, чтобы можно было по ссылке подобрать и закончить текст программы.
macomics вне форума Ответить с цитированием
Старый 11.09.2022, 01:14   #24
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Если не нравится ссылка, то можно даже так:
Чёрт! И как я сам до этого не додумался? Наверно потому, сто ООП я знаю гораздо хуже Паскаля и ассемблера.
Но в таком случае ответ на вопрос ТС:
Код:
  TMyClass = class
    private
      function GetThis: TMyClass;
    public
      property This: TMyClass read GetThis;
  end;

...

function TMyClass.GetThis: TMyClass;
begin
  Result := Self;
end;   

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMyClass.Create do begin
    SomeProcedure(This);
  end;
end;
Сознательно убрал из примера лишние поля класса оставив только чистый вариант. Дальше каждый сам сможет что-то туда добавить.

Последний раз редактировалось northener; 11.09.2022 в 01:27. Причина: Уточнение
northener вне форума Ответить с цитированием
Старый 11.09.2022, 01:23   #25
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вот только вы путаете понятия компилятора и бинарного (машинного) кода.
Нет. Ничего такого я не путаю. Первые сведения о принципах работы трансляторов я получил ещё в 1980 году на последнем курсе ВУЗа. С тех пор имел много практики с разными компиляторами.
А пояснения к моим словам вы можете увидеть в файле Project.map, где всем символическим именам ставятся в соответствия адреса. (Ясен пень относительные). И с этими адресами транслятор дальше работает. А потом на этапе сборки линкер увязывает эти адреса в общее адресное пространство.
northener вне форума Ответить с цитированием
Старый 11.09.2022, 01:25   #26
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Только чтобы найти по имени метода объект ему надо выполнить поиск на уровне исходных текстов, а не адресов. Адреса появятся после того как все имена будут дополнены.
macomics вне форума Ответить с цитированием
Старый 11.09.2022, 01:31   #27
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Только чтобы найти по имени метода объект ему надо выполнить поиск на уровне исходных текстов
А ему ничего не нужно искать в исходных текстах! Как только символическое имя встречается в тексте, так оно сразу включается в таблицу соответствия. Именно эту таблицу вы и можете увидеть в map-файле.
northener вне форума Ответить с цитированием
Старый 11.09.2022, 01:37   #28
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если в конструкции with .. do перечислено более одного объекта, или конструкции вложенные, тогда перед компилятором возникает задача определения по имени метода ссылки на объект. Сама ссылка на объект (адрес) появляется только после того как будет определено соответствие между множеством всех объектов и множеством всех методов в этих объектах. После того как определены такие соответствия эти вызовы методов превращаются в адреса из таблицы в map файле. Но без имени метода нельзя понять к какому объекту из множества вы обращаетесь. Хотя в вашей логики во множестве объектов всегда один элемент.
macomics вне форума Ответить с цитированием
Старый 11.09.2022, 01:45   #29
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

К ответу northener можно ещё добавить что можно задействовать классхэлперы если у вас более-менее современная IDE (Sydney и старше). Очень недооцененная вещь кстати.
Код:
//...

  btnhlpr = class helper for TButton
  private
    function getobject: TButton;
  public
    property this:TButton read getobject;
  end;

//...

{ btnhlpr }
function btnhlpr.getobject: TButton;
begin
  Result:=Self;
end;

//...

procedure someprocedure(value:TButton);
begin
  ShowMessage(value.Caption);
end;

//...

  with TButton.Create(self) do
   begin
     Left:=10;
     Top:=10;
     Caption:='test1';
     OnClick:=nil;
     ShowMessage(this.Caption);
   end;
DIONISKA вне форума Ответить с цитированием
Старый 11.09.2022, 01:45   #30
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если в конструкции with .. do перечислено более одного объекта, или конструкции вложенные, тогда перед компилятором возникает задача определения по имени метода ссылки на объект. Сама ссылка на объект (адрес) появляется только после того как будет определено соответствие между множеством всех объектов и множеством всех методов в этих объектах. После того как определены такие соответствия эти вызовы методов превращаются в адреса из таблицы в map файле. Но без имени метода нельзя понять к какому объекту из множества вы обращаетесь. Хотя в вашей логики во множестве объектов всегда один элемент.
А тут уже работают правила перечисления/вложения.
Да если в конструкции with .. do перечислено более одного объекта, то способ Arigato не справится. Всегда будет браться значение ссылки одного и того же объекта. Первого или последнего не могу сходу сообразить.
Но со вложенными with .. do проблем не будет.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к динамически созданному объекту, изменить его? 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