Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.09.2012, 21:36
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию Подмена класса

http://decoding.narod.ru/practic/cla...stitution.html

Какие плюсы и минусы есть у такого подхода?

Например зареинтродьюсить некий метод можно?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 30.09.2012 в 21:44.
Ответить с цитированием
  #2  
Старый 30.09.2012, 22:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
http://decoding.narod.ru/practic/cla...stitution.html

Какие плюсы и минусы есть у такого подхода?

Например зареинтродьюсить некий метод можно?
В одном своём проекте я использовал подмену класса TListView. Я использую TListView почти всегда в режиме vsReport (т.е. как Grid), но меня немного раздражает, что к первой колонке нужно обращаться как к Caption, а к остальным как к SubItems, да ещё если SubItems пустой и попытаться из его колонки прочитать, то ещё и ошибку получаем
Поэтому я написал небольшой модуль который прописываю в uses модуля где лежит TListView (главное прописать после модуля ComCtrls ). И получается что хотя фактически в DesignTime лежит обыкновенный TListView, но в откомпилированной программе используется уже подменённый с которым я могу проделывать такие вещи:
Код:
ListView1.Values[10, 5] := 'Колонка №10, Строка №5';
// Или так:
ListView1.Items[5].Values[10] := 'Колонка №10, Строка №5';
Работает нормально, глюков не наблюдал. Правильнее наверно было бы своего наследника TListView добавить в палитру компонентов и уже его бросать на форму, но что если я захочу открыть этот проект в другом месте где этот компонент не установлен? - нужно его доустанавливать, и так всякий раз.
Ответить с цитированием
  #3  
Старый 30.09.2012, 22:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Какие плюсы и минусы есть у такого подхода?
Идея известна давно и используется наравне с классом THack. Плюсы также давно известны - доступ к закрытым полям. Минусы - а х... его знает.
P.S. Так как мои проекты, это в основном API, то для ListView у меня полностью свой модуль имеется.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 01.10.2012, 03:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от angvelem
Идея известна давно и используется наравне с классом THack. Плюсы также давно известны - доступ к закрытым полям. Минусы - а х... его знает.
На сайте "Королевство Delphi" эта фича с подменой класса называется "Шаманский метод Geo"
Ответить с цитированием
  #5  
Старый 01.10.2012, 08:12
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну вот, перегруженный конструктор зареинтродьюсить не получается.
Приходится делать реинтродьюс на все конструкторы.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 01.10.2012, 12:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

И еще, как быть с потомками, например чтоб подменил общего дельфового предка и все дельфовые потомки от этого класса обращались к подмененному классу.

Я так понимаю придется опять делать шаманство, получать адреса нужных ф-ий предкового класса, внутрь вписывать джамп.

Может есть что-то проще?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 01.10.2012, 12:43
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ладно, пофиг, проще переопределить нужные классы и зареинтродьюсить на всех одно и то же.

Спасибо всем, кто участвовал в дискуссии.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter