Каким-то образом переопределить процедуры Delphi по умолчанию во время разработки?

Каким-то образом переопределить процедуры Delphi по умолчанию во время разработки?

Мне нужно переопределить InstanceSize во время разработки, я сделал это во время выполнения, используя метод FastCode:

FastcodeAddressPatch(FastcodeGetAddress(@SInstanceSize), @TWinControl.RfInstanceSize);

Но есть ли способ сделать это во время разработки?

спс в совете


person Rodrigo Farias Rezino    schedule 22.01.2010    source источник


Ответы (2)


«Время разработки» на самом деле просто «время выполнения», но в контексте IDE, а не в контексте вашей программы. Поместите свой код в пакет времени разработки и загрузите его в IDE. Среда IDE вызовет все Register процедуры в модулях вашего пакета, после чего вы сможете запустить любой код, который вам нужен.

  1. Создайте новый пакетный проект (файл .dpk).
  2. Настройте параметры проекта так, чтобы это был пакет времени разработки.
  3. Добавьте к нему новую пустую единицу.
  4. Добавьте процедуру в раздел интерфейса с именем Register. Он должен иметь заглавную букву R, а остальные строчные.
  5. Реализуйте эту процедуру, как хотите (например, поместив туда свой вызов FastcodeAddressPatch).
  6. Скомпилируйте и установите пакет.

Я немного настороженно отношусь к тому, что вы пытаетесь сделать на шаге 5, но я позволю вам решить это самостоятельно.

person Rob Kennedy    schedule 22.01.2010
comment
Я хочу переопределить DefineProperties TWinControl. Как я могу сделать это так, как вы говорите? - person Rodrigo Farias Rezino; 22.01.2010
comment
То, как я говорю, не имеет ничего общего с переопределением или исправлением чего-либо. Это касалось только того, где вы можете поместить свой код, чтобы убедиться, что он работает когда вы хотите. Что с этим делать, решать вам. (Если вы хотите знать, как исправлять функции VCL, спросите об этом в новом вопросе. Из того, что вы опубликовали, я понял, что вы уже знаете, как это сделать.) - person Rob Kennedy; 22.01.2010
comment
Проблема поставить код, это не только добавить код. Проблема в том, что код не вызывается. Почему ? Потому что невозможно переопределить процедуру TwinControl, не наследуя от нее класс. Рекурсия, которую я использую для этого, использует FastcodeAddressPatch для переопределения метода. Но это работает только во время выполнения. - person Rodrigo Farias Rezino; 22.01.2010
comment
Хорошо, если я добавлю FastcodeAddressPatch в процедуру регистрации, это не сработает. Почему ? Я не знаю. При использовании его во время выполнения он должен быть первым модулем в проекте, возможно, это дает нам подсказку о том, почему он там не работает. - person Rodrigo Farias Rezino; 22.01.2010
comment
Это не сработало, но я думаю, что это потому, что роль глубже, но это правильный путь. - person Rodrigo Farias Rezino; 05.01.2011

Если под «во время разработки» вы имеете в виду «изменение поведения ваших компонентов в дизайнере форм», вам действительно не следует пытаться это сделать. Конструктор форм является частью среды IDE, представляющей собой весь код Delphi, который запускается в BDS.exe. Если вы измените TObject в дизайнере форм, вы измените его для всей IDE, что может привести к катастрофическим последствиям.

person Mason Wheeler    schedule 22.01.2010
comment
Я знаю риски, но это для моей учебы. Вы знаете какой-нибудь способ сделать это? - person Rodrigo Farias Rezino; 22.01.2010