Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 774

/ вопрос решён /

Приветствую, уважаемые эксперты!

Возникла такая вот ситуация, есть компонент TIdSMTP и соответственно класс TIdSMTP основаный на классе TIdMessageClient. При вызове метода Send() класса TIdSMTP по ходу отработки этого метода вызывается метод класса TIdMessageClient - SendBody(). Он виртуальный.
Получается следующее: метод SendBody() кривой, там прописываются не все заголовки что мне надо, и хотелосьбы его переписать. Т.е. я хочу сделать свой класс основаный на TIdSMTP, но чтобы при обращении класса TIdSMTP к методу класса-родителя SendBody() вызывался не он, а мною написанный метод. Как это сделать?

VoVa Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: VoVa (статус: Посетитель)
Вопрос отправлен: 17 июля 2008, 13:20
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, VoVa!
Наиболее правильный вариант - отказаться от инди. Не умеют они нормально отправлять почту. просто не умеют. И перейти например на Synapse. В разделе статей есть статья о этой библиотеке, как её установить.
А так.
если TIdSMTP является наследником TIdMessageClient и метод SendBody() есть виртуальным, то надо в своём производном классе сделать метод с такой же сигнатурой и обязательной припиской virtual; override; (у других классов увидите).
теперь ваш класс будет вызывать этот метод. Если всё таки надо обратиться к родительскому методу, то можно написать так
inherited SendBody();
при этом можно "поправить параметры" и добавить код как перед вызовом, так и после. или даже вызывать родительский метод по условию.
вызывать метод "деда/прадеда" оффициально невозможно.

Но если бы мне пришлось решать эту задачу, я сделал бы проще. Я взял юнит, в котором объявлен это "неправильный метод", скопировал к себе в папку с проектом (можно и в другое место, главное, что бы он находился по путям поиска раньше). И уже здесь отредактировал "неправильный метод". В таком случае при сборке проекта делфи будет брать изменённый юнит, а не оригинальный. Обычно именно эту технологию рекомендуют, если надо изменить поведение некоторых функций/классов из стандартной библиотеки.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 17 июля 2008, 13:56
Оценка за ответ: 5

Комментарий к оценке: Пять баллов, это то что надо, информация из последнего абзаца мне помогла. В моем случае это само удобно, дописал буквально несколько символов, а как все заработало!

Ответ #2. Отвечает эксперт: min@y™

Так исходники же есть! Меняй, что душе угодно, в этом методе (TIdMessageClient.SendBody()) по своему усмотрению. Ну, или создай свой класс TVoVaMessageClient = class(TIdMessageClient), перекрыв в нём всё, что нужно, а от него уже наследуй TIdSMTP (или свой TVoVaSMTP).
OpenSource для того и существует, чтобы если что-то не устраивает -- бери и переделывай.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 июля 2008, 14:00
Оценка за ответ: 5

Комментарий к оценке: Я просто не знал, что можно поменять исходник и положить его в проект и это поможет! вообщем за ответ 3 ибо я ничего информативного не увидел, кроме разве что того, что Вы знаете как это сделать, и 2 балла добавлю за то что потрудились ответить, Спасибо.

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 17 июля 2008, 14:48; участников в обсуждении: 1.
Вадим К

Вадим К (статус: Академик), 17 июля 2008, 14:48 [#1]:

по поводу "поменять исходник". если изменённый файл не перенести к себе в проект, то делфи будет находить уже скомпилированный dcu и и применять его. (в определённых случаях дефли забывает перекомпилировать изменённый файл и юзает старый dcu.)
Галочка "подтверждения прочтения" - вселенское зло.

31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:50
Выполнено за 0.02 сек.