Как рисуются на форме некоторые компоненты

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как рисуются на форме некоторые компоненты

Сообщение Climber » 06.08.2009 16:45:37

Появилась у меня потребность сделать свой компонент, который много чего уметь будет красивого (когда сделаю, могу поделиться)... Начал с изучения существующих компонентов, и был слегка удивлен отсутствием метода Paint или его аналогов у компонентов типа Tlabel, TCheckBox, TTrackBar... А кто их на экран тогда выводит? Parent (Owner)? А откуда они узнают, что и как рисовать? Что-то я в легком тупике...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Как рисуются на форме некоторые компоненты

Сообщение скалогрыз » 06.08.2009 17:29:47

Climber писал(а): Начал с изучения существующих компонентов, и был слегка удивлен отсутствием метода Paint или его аналогов у компонентов типа Tlabel, TCheckBox, TTrackBar... А кто их на экран тогда выводит? Parent (Owner)? А откуда они узнают, что и как рисовать? Что-то я в легком тупике...

TLabel->TCustomLabel смотрим метод TCustomLabel.Paint(). TLabel это наследник от TGraphicControl... и переопределить метод Paint() это самое милое дело для них!

TCheckBox и TTrackBar - основнаны на системных контролах, и рисование разруливается самой системой. При переопределении Paint можно избавится от "стандартного" рисования, либо добавить к стандартному своё. но зачем?

Если твой контрол, кроме рисования ещё должен получать ввод с клавиатуры (например нажатие стрелочек для скроллинга) или в нём можно распологать другие контролы, то его следует сделать наследником от TCustomControl. Если необходимы только рисование и мышка, то можно сделать наследником от TGraphicControl.
но не зависимо от того, от какого контрола ты будешь наследоваться рисование следует делать в методе Paint(), который твой контрол будет переопределять.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как рисуются на форме некоторые компоненты

Сообщение Climber » 06.08.2009 18:24:27

скалогрыз писал(а):TLabel->TCustomLabel смотрим метод TCustomLabel.Paint().

Это первое, о чем я подумал, но меня смутила одна вещь (во вложении)...
То есть TCustomLabel в модуле есть, а метода Paint у него нет!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Как рисуются на форме некоторые компоненты

Сообщение скалогрыз » 06.08.2009 19:07:32

:shock: :shock: :shock: :o :wink: :) :D :lol:
к сожалению структура LCL-а отличается от VCL-а. И очень напоминает Си, из-за множественных include-ов.
Лично мне это не нравится, но кто меня будет слушать?! ;)

так вот! в StdCtrls действительно описан TCustomLabel, но реализация описана в файле customlabel.inc
если хочешь найти TCustomLabel.Paint в StdCtrls то ты его не найдёшь!
ищи просто "Paint;" можно даже: "Paint; override;"

тебя интересует 1413 строка в модуле StdCtrls и 398 строка в файле customlabel.inc

кстати, несмотря на Си-образную структуру LCL-а, codetools отлично справляется (например ctrl-shift-вверх/вниз работают на ура).

могу предложить затребовать "фичу" поиска, чтобы искалась указанная строка не только в открытом файле, но, если файл - код паскаля, во всех included файлах
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как рисуются на форме некоторые компоненты

Сообщение Climber » 07.08.2009 09:20:16

Со структурой LCL и ctrl-shift-вверх/вниз в модулях я разобрался давно, просто такое, как с этим Paint, первый раз вижу.
скалогрыз писал(а):Если твой контрол, кроме рисования ещё должен получать ввод с клавиатуры (например нажатие стрелочек для скроллинга) или в нём можно распологать другие контролы, то его следует сделать наследником от TCustomControl. Если необходимы только рисование и мышка, то можно сделать наследником от TGraphicControl.
но не зависимо от того, от какого контрола ты будешь наследоваться рисование следует делать в методе Paint(), который твой контрол будет переопределять.

Собственно, что я хочу сделать: наследника кого-нибудь из потомков TCustomGrid, в котором будут фильтры примерно как в Excel 2007. Сфера применения - TDBGrid/TStringGrid. Под заголовком будет появляться список значений, которые встречаются в столбце, выбирать отфильтровываемое можно будет чекбоксами, числовые значения и даты выбирать TrackBar'ом. Я пока не решил, будут ли это реальные чекбоксы и трекбары, или просто выводить на поверхность сетки картинки, которые выглядят и ведут себя похоже. И непонятно пока, как лучше сделать этот фильтр - как отдельный элемент управления или как часть сетки. Я попробовал несколько вариантов, но ни один меня до конца не удовлетворяет пока.

P. S. Кстати, если кто из разработчиков заинтересован во внедрении такой штуки в Lazarus (я пока не "достаточно крут для белого парня", чтобы сделать хороший компонент), могу подробно описать, как эта штука должна выглядеть и работать. Концепцию я хорошо продумал, она должна быть востребованной...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Как рисуются на форме некоторые компоненты

Сообщение скалогрыз » 07.08.2009 11:29:26

Climber писал(а):P. S. Кстати, если кто из разработчиков заинтересован во внедрении такой штуки в Lazarus (я пока не "достаточно крут для белого парня", чтобы сделать хороший компонент), могу подробно описать, как эта штука должна выглядеть и работать. Концепцию я хорошо продумал, она должна быть востребованной...

я бы не стал расчитывать на разработчиков.
принимать компонент, как стандартный для LCL, это добавлять себе работы, которой и так непочатый край. Мало того, LCL и Лазарус задуманы как расширяемые системы, а это значит правильно сделать этот компонент, в виде пакета, и сделать его частью Lazarus-CCR

И на это разработчики пойдут с радостью, потому что:
а) к их системе добавляется очередной вкусный компонент, вносящий свою каплю в море популярности Лазаря/фпц
б) они снимают с себя ответственность за поддержку компонента, перекладывая её непосредственно на автора ;)
в) автор получает свою долю славы и почёта! возможно даже организовывает сайт, где нить на: myrulecomponent.ucoz.ru или myrulecomponent.ru, где вылажена документация и примеры использования! а так же заветная кнопочка "Donate" :)
г) ну и пользователи довольны, разрабатывающие программы, с использованием этого замечательного компонента, в этой чудесной среде, на этом великолепном языке. Причём получив всё это счастье нахаляву, снимают сливки с проданных прог.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как рисуются на форме некоторые компоненты

Сообщение Climber » 07.08.2009 11:42:22

скалогрыз писал(а): а так же заветная кнопочка "Donate"

Так с этого и надо было начинать!!! :P
*Убежал доводить компонент до ума...

Последние два вопроса:
1) Можно сделать как-то, чтобы это было и в DBGrid'е, и в StringGrid'е, но чтобы мне не пришлось писать одно и то же два раза? Что-то мне подсказывает, что нет...
2) Что все-таки лучше - встраивать динамические чекбоксы или рисовать самому их имитацию? Я пока ко второму склоняюсь...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Как рисуются на форме некоторые компоненты

Сообщение скалогрыз » 07.08.2009 15:13:58

Climber писал(а):1) Можно сделать как-то, чтобы это было и в DBGrid'е, и в StringGrid'е, но чтобы мне не пришлось писать одно и то же два раза? Что-то мне подсказывает, что нет...
2) Что все-таки лучше - встраивать динамические чекбоксы или рисовать самому их имитацию? Я пока ко второму склоняюсь...

1) наверное можно, но хз как
2) имхо, динамические лучше. Хотя, если иммитировать с использованием themesAPI, никто разницы не заметит.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 33

Рейтинг@Mail.ru