Конференция "Компоненты" » Пару вопросов (новобранец в создании компонент) [D7, WinXP]
 
  • Alexey (AZ) (08.01.07 17:23) [0]
    Здравствуйте,
    Решил начать создание компонента с изучения примера из книги "Учебник для начинающих по Delphi 7". Это распространенная электронная версия, там есть пример "фазенда" про label, в который можно вводить только цифры. Почему при создании компонента делфи хочет какой-то файл KEYHOLELib_TLB.dcu ?

    И ещё вопрос: допустим, что я хочу как-то по-особому отрисовать контрол (или, например,как коллега из соседней темы, сделать кнопку треугольной=)), тогда как переопределить процедуру? Я понял так: если у контрола-предка есть событие OnPaint, OnMouseEnter и т.п., то мне нужно в своем компоненте сделать так:

    private
     procedure MouseEnter(sender:TObject); override;
     procedure OnPaint(.....); override;


    Тогда как проще узнать параметры, передаваемые в процедуру? Лазить по всем предкам?
  • ors_archangel © (08.01.07 22:34) [1]

    > label, в который можно вводить только цифры

    может TEdit? Label - это статичная надпись. Не знаю, что это за библиотека - KEYHOLE, но, видимо ваша программа использует из неё компоненты, но сама библиотека была удалена либо не установлена должным образом. Чтобы удалить пакет из Делфи 7: Component / Installed Packages / <имя> / Remove

    >  procedure OnPaint(.....); override;

    OnXXX - обработчики событий, они являются полями-уазателями метдовом обработки, а не методами, поэтому их нельзя перекрывать. Нужно перекрывать соответствующие методы, например Paint, но не обработчик OnPaint, что, в общем, и невозможно
  • Юрий Зотов © (09.01.07 01:43) [2]
    > Решил начать создание компонента с изучения примера из книги

    Примите совет (о котором, если Вы ВСЕРЬЕЗ решили научиться ГРАМОТНО  писать компоненты, не пожалеете ТОЧНО).

    Сделайте поиск и найдите в этом форуме ссылку на электронный вариант книги Конопки. Скачайте ее и начните с ЕЕ изучения и разборов примеров в НЕЙ.

    Потом тысячу раз скажете нам с Рэем "спасибо". Ему - за книгу, мне - эа совет.
    :о)
  • Alexey (AZ) (10.01.07 18:44) [3]

    > ors_archangel ©   (08.01.07 22:34) [1]

    Да, в том примере Edit. Это я собирался сделать из TLabel мегакнопку. Думаю, обводить её по бордеру при событии МаусЭнтер и т.п. (как в ХР) Я не пользуюсь темами в ХР, поэтому хотел бы сделать красивые кнопки, комбобоксы и т.п., доступные при классическом оформлении (как Вин98) =)

    > например Paint, но не обработчик OnPaint

    Т.е. если у предка есть OnXXX, то это значит что есть XXX, которую можно перекрыть?

    > Юрий Зотов ©   (09.01.07 01:43) [2]

    Thx!
  • ors_archangel © (10.01.07 19:14) [4]

    > Т.е. если у предка есть OnXXX, то это значит что есть XXX,
    >  которую можно перекрыть?

    Не всё так просто :( Каждый раз нужно исследовать конкретно, но в  архитектуре Delphi ООП есть обработчики сообщений (событий) Windows: WM_XXX, EM_XXX и т.д., с которых чаще всего всё и начинается, исследования можно начинать от них. Например, когда OS считает, что окну нужно перерисоваться, то оно посылает ему сообщение WM_PAINT, соответственно, если компонент реагирует на это сообщение, то ты найдёшь одноимённый метод

     procedure WMPaint(…); message WM_PAINT,


    - но его желательно не перекрывать, иначе ты нарушишь структуру обработки сообщений, и как следствие, тебе, скорее всего, придётся писать много дополнительного кода, не исключая WinAPI, лучше по возможности оставаться на уровне VCL
  • Alexey (AZ) (10.01.07 21:33) [5]
    Я знаком с Винапи и знаю Ассемблер, в принципе не проблема сделать всё на Апятах (это быстро и иногда даже требует меньше кода, чем ООП компоненты) с использованием ООП, я так и задумывал создание кнопок и прочей лабуды, но не думал, что придется ещё и предков досконально исследовать. Во всяком случае, если использовать Апи - то всё понятно, а то вот так падает ООП-приложение где-то и думай что делать, а оказывается что-то где-то не так или не то перекрыто =(
  • ors_archangel © (10.01.07 22:25) [6]
    У меня та же история, но всё-таки, мой тебе совет, лучше по возможности оставаться на уровне VCL, эффективность - это одно, а целостность и отказоустойчивоть - это другое, ведь не надо каждый раз исследовать всю VCL, она написана довольно, как говорят, красиво, т.е. это не сложно, тебе сложнее будет отказаться от "лёгких", но одноразовых решений с помощью WinAPI, WinAPI - чато единственный путь, но сначала нужно искать пути решения через VCL, хотя бы потому, чтобы не зря таскать с собой более 300 kb OOP чертовщины - заставим её работать на нас!
    :)
    ООП есть ООП, в нём всё более переплетено, чем в API, особенно в части расширения: приходится знать иеархию и общие принипы построения конкретной системы методов классов, когда в чистом функциональной парадигме мы довольно конкретно можем отделить любую функциональность, не исследуя зависимости между функциями - потому что каждая из них довольно самодостаточна, но в конечном итоге, особенно в обласи GUI - ООП выигрывает, потому в GUI действительно есть легко просматриваемая иеархия объектов и полиморфизм тоже помогает
    :)
 
Конференция "Компоненты" » Пару вопросов (новобранец в создании компонент) [D7, WinXP]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]