Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > "Перегрузка метода"


Автор: DarkProg 29.3.2012, 16:12
Не могу понять как можно реализовать следующее.
В общем для понимания напишу мини-класс коорый должен выполняться.

Код

type SomeComponent=class(SomeParentComponent)
private
 functon GetStrings:TStrings ;
 procedure SetStrings(AValue:TStrings);
published
 property Strings:TStrings read GetStrings write SetStrings;
end;


Т.е. есть нечто такое.
В неком месте у этого компонета есть вот такое вот присвоение(в неком, потому что я так и не нашёл в каком, но оно есть и почему я так решил опишу далее)
Код

 TStringList(Strings).OnChange:=OnStringsChange;


С чего решил что есть, да очень просто, я пишу свой класс в котором мне тое нужно следить за изменением этого Strings и делаю это аналогичным образом
Код

 TStringList(Strings).OnChange:=OnStringsMyChange;

После такого присвоения отказываются работать некоторые вещи, которые работать должны, комментирую строчку опять работает.
Вопрос как можно сделать свою процедуру на событие OnChange и при этом так чтобы та которая присвоена ранее работала или как вызывать ранее присвоенную?

Автор: MetalFan 29.3.2012, 16:18
DarkProg, запомнить "старый" OnChange перед назначением своего, затем в своем вызывать "старый".
Но это может быть чревато...

Автор: DarkProg 29.3.2012, 16:45
Цитата(MetalFan @  29.3.2012,  17:18 Найти цитируемый пост)
DarkProg, запомнить "старый" OnChange перед назначением своего, затем в своем вызывать "старый".
Но это может быть чревато... 

Честно говоря пока писал как и рассуждаю вслух - додумался, но что-то не срабатывает... 

Помимо всего прочего там нестандартный TStringList, а немного дописанный, но привидение к другому классу - это ерунда, вытащил. ЗАписал в уазатель, но при выполнении теперь стабильная ошибка... один из указателей равен nil(указатель который в функции) и всё...

Добавлено через 11 минут и 41 секунду
Ошибка возникает при выполнении "старого" обработчика из-за того что он неправильно понимает Self, в качестве Self почему-то считается TStringList, а должен быть другой класс.
Как это можно поправить?

Автор: MetalFan 29.3.2012, 17:45
Цитата(DarkProg @  29.3.2012,  16:45 Найти цитируемый пост)
ЗАписал в уазатель, но при выполнении теперь стабильная ошибка... один из указателей равен nil(указатель который в функции) и всё...

Показывай код.

Автор: DarkProg 29.3.2012, 18:56
Запоминаю указатель на старый обработчик вот так
Цитата

  ParentOnChange:=nil;
  ParentOnChange:=@TADStringList(SQL).OnChange;
  TADStringList(SQL).OnChange:=OnChangeSQL;


А вызвать пытаюсь вот так, что естественно неправильно, не могу понять как правильно
Код

TMyEvent(ParentOnChange)(Command.CommandText);

Пробовал использовать как TNotifyEvent, но что-то не работает...

Я никак не могу разобраться как именно ссвязаны некоторые свойсва.

Автор: DarkProg 29.3.2012, 19:23
Получилось... вот же намучался....
Рассказываю как делать, чтобы больше никто так не мучался.
Цитата

  TChangeSQL =  procedure(ASender: TObject) of object;

Объявляем свой тип указателей на некоторую процедуру.

Далее, я делал внутри своего класса, но в принципе параллельно где вы захотите объявить, объявляете переменную типа TChangeSQL.

Далее надо же что-то записать.
Код

  ParentOnChange:=nil;
  ParentOnChange:=TADStringList(SQL).OnChange;
  TADStringList(SQL).OnChange:=OnChangeSQL;

Тем самым сохранил старый обработчик и присовил новый.
А внутри нового обработчика пишу следующее
Код

  if (Assigned(ParentOnChange)) then
      ParentOnChange(Sender);


И счастье вот оно smile

Автор: MetalFan 29.3.2012, 21:27
Цитата(DarkProg @  29.3.2012,  18:56 Найти цитируемый пост)
Пробовал использовать как TNotifyEvent,

Все должно было прекрасно заработать и с TNotifyEvent.


Цитата(DarkProg @  29.3.2012,  19:23 Найти цитируемый пост)
  ParentOnChange:=nil;
  ParentOnChange:=TADStringList(SQL).OnChange;

Зачем обнилять переменную?

Автор: DarkProg 29.3.2012, 23:08
Цитата(MetalFan @  29.3.2012,  22:27 Найти цитируемый пост)
Зачем обнилять переменную?

Да честно говоря без надобности, просто у меня почему-то изначально указатель не был равен nil, хотя после выполнения присваивания уже до лампочки что там будет. Я там кажись кое что ещё пытался сделать вот и осталось.

Цитата(MetalFan @  29.3.2012,  22:27 Найти цитируемый пост)
Все должно было прекрасно заработать и с TNotifyEvent.

Понятия не имею чего оно не заработало, хотя щас есть одно мнение, пойду попробую...

Добавлено через 3 минуты и 55 секунд
Да, действительно работает и с TNotifyEvent. Всё дело в объявлении соответствующего типа указателя. С Pointer лучше не баловаться....

Автор: northener 30.3.2012, 00:22
Цитата(DarkProg @  29.3.2012,  23:08 Найти цитируемый пост)
Всё дело в объявлении соответствующего типа указателя.

А мне показалось, что всё дело было в "собаке, которая залезла в чужой огород".  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)