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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2009, 19:00   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию public/published методы

Всем привет!
После четной надежды на ответ в теме tList с указателями на методы я решил создать сею тему, к вопросу которой я перешёл в выше упомянутой теме, т.к. одна тема — один вопрос

Вопрос в следующем:
Экспериментируя с вызовом методов, указатели которых находились в tList я обнаружил, что public и published методы всех экземпляров одного и того же класса (или объекта, не знаю, как правильно), не важно, выделена ли под них (экземпляры классов) память, или нет, имеют один и то-то же адрес, не равный Nil. Вот я и хочу, что-бы вы мне это объяснили, почему так происходит?

Надеюсь, что в этой теме кто-то прольёт свет на эту загадку...
Altera вне форума Ответить с цитированием
Старый 20.08.2009, 19:29   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Обратите внимание на структуру:

Код:
  TMethod = record
    Code, Data: Pointer;
  end;
Для методов класса используется именно она.
Таким образом в TList придется хранить структуру или использовать два TList или хранить только адрес, а экземпляр подставлять потом.

Код:
type
   MyProc = procedure  of object;

   MyClass = class
      procedure test1;
   end;

procedure MyClass.test1;
begin
   ShowMessage('1');
end;

procedure TForm19.FormCreate(Sender: TObject);
var C:MyClass;
    M:TMethod;
begin
   C := MyClass.Create;
   try
      MyProc(M) := C.test1;  // сохраняется адрес метода и ссылка на экземпляр объекта

      MyProc(M);             // Вызов процедуры
   finally
      C.Free;
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 20.08.2009, 19:31   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

А почему собственно должно быть иначе? Это свойство ООП - каждый раз при создании объектов память выделяется только под поля (уже не помню как со свойствами). Делфи это компилятор и после компиляции код НЕ ИЗМЕНЯЕТСЯ, поэтому код всегда находится на одном месте. А методу пофигу какие данные обрабатывать и по идеи его можно наколоть и подсунуть вообще левые. Сделать же так Вы не можете не потому что не компилица, а потому что компилятор это отслеживает, теоретические же это вполне возможно (но глупо с точки зрения ООП).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.08.2009, 20:03   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Ну, в общем как-бы ясно. Спасибо что помогли...
Altera вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
численные методы Desha Помощь студентам 2 24.05.2009 12:46
Delphi: Public vs Published Jean-Esther Помощь студентам 1 07.03.2009 15:42
методы в ООП albatros Общие вопросы Delphi 3 04.02.2009 22:59
Методы... Arkuz Свободное общение 6 11.10.2008 16:53
Методы автозагрузки Лубышев Операционные системы общие вопросы 12 01.07.2008 20:53