Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Как сделать зеркало под либу? Ваять новый набор компонент?   Найти похожие ветки 

 
Barloggg   (2005-12-15 09:29) [0]

Имею и еще пишу несколько очень симпатичных процедур пользовательской отрисовки, которые перекрывают onPaint у стандартных компонент.
Есть центральное "ядро рисования" и в него ссыпаются Pcontrolы с пометками "этот рисовать как панель, этот как кнопку ну и так далее".
Просто перекрыть функцию onPaint и OnResize и всего делов.

Как этому придать "товарный вид"?
То есть забацать зеркало?
Ваять свой собственный набор компонент? этого бы мне не хотелось.

пока я вижу работу комонента таким образом:
при броске компонента на форму в классе появляется несколько Published процедур, скажем DrawLikeButton, DrawLikePanel которые потом можно мышью подключить к нужным мне компонентам, а там уж "ядро рисования" само разберется...

или не маяться фигней и оставить как есть? то есть после создания, но перед показом формы ручками писать длинный список загрузки нужных мне компонент в рисовалку?

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

Или другого пути кроме как создать свой набор нету?


 
RA ©   (2005-12-15 10:28) [1]

Можно попробовать такой вариант. Сделать всего одно зеркало типа TAllControls, у котогрого есть свойство itIs: TItIs.
Где TItIs=(itBotton, itPanel, itLabel, ...)
И выполнять нужную отрисовку "глядя" на это свойство.


 
Barloggg   (2005-12-15 10:52) [2]

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

Смысл моего вопроса вот в чем:
Могу ли я сделать перекрытие некоторых функций у выбранных мною компонентов на "заранее подготовленные" визуально?


 
ECM ©   (2005-12-15 10:53) [3]


> Можно попробовать такой вариант. Сделать всего одно зеркало

А смысл?
Если сделать зеркало для одного компонента (можно сделать общего МСК-предка) - то для остальных останется перекрыть максимум пару методов для генерации KOL-кода (который всё равно нужно было писать - только не в одной процедуре)
Это всё не сложно ...
ИМХО: Лучше всё-таки создать набор. Затраты на зеркало не намного выше чем для одного - зато потом будет удобнее.
Потребуется помощь - помогу. :)


 
Barloggg   (2005-12-15 12:22) [4]

Но зачем мне создавать набор, когда у меня всего навсего с десяток onPaint"ов (несколько вариантов одного и того же), одна общая onResize и парочка onMouseDown?
Да и то в том наборе будет только лишь панель, кнопка, метка и картинка. кому он будет нужен как набор?

кстати пытался сделать свой компонент полгода назад... все бабахнуло... значит помощь понадобится... если другого выхода кроме как писать набор не найдется.


 
Barloggg   (2005-12-15 12:25) [5]

хмм... один общий МСК предок... бросаем на форму, а потом в свойствах выбираем как он должен выглядеть при запуске... мысль для меня новая, расскажите поподробнее плз.
а с брошенными на него другими компонентами сложностей не будет? (если нижнему конечно задать вид как у панели)


 
ECM ©   (2005-12-15 15:26) [6]


> кому он будет нужен как набор

Прежде всего лично Вам...:)
У меня, например, уже пару десятков своих (под себя заточенных).
Удобно - меньше голова забита.

> а с брошенными на него другими компонентами сложностей не
> будет? (если нижнему конечно задать вид как у панели)

Как раз в этом случае разделение на разные компоненты позволит избежать лишних проблем (ИМХО)

> один общий МСК предок... бросаем на форму

Нет Вы неверно меня поняли - общий предок что бы от него наследовать
набор (так меньше писанины в МСК). Бросать на форму его нельзя будет -
это вспомогательный класс


 
Barloggg   (2005-12-15 16:01) [7]

Ну тогда это по любому набор. Лично мне удобнее в onFormCreate забабахать длинный список пересылки контролов в ядро с указанием какой контрол как рисовать.
примерно таким вот образом
procedure Add(control:PControl;NameToFindLater:string;DrawLikeWhat:integer=0);
и ради того, чтобы избавиться от такой строчки для каждого конкретного контрола ваять набор компонент... не, это мне не надо.


 
Barloggg   (2005-12-20 12:46) [8]

хмм... вспомнилось вот:
а ведь для того чтобы подключить ту же DelphiX приходится ручками править пару строчек в коде.
и никак это не автоматизировано...
короче придется ваять инструкцию по подключению...
но ведь все равно будут запросы "а зеркало?"...


 
SPeller ©   (2005-12-21 03:56) [9]

Зачем набор? Достаточно одного компонента на форму, который и будет генерировать в inc-файле "длинный список пересылки контролов в ядро с указанием какой контрол как рисовать". Всё просто - при генерации кода идём по форме, перечисляем всех её детей, смотрим на класс (это же МСК - тут ртти можно использовать во всю красу), и в зависимости от класса генерим строчку. Например, для класса TMCKEditBox получим Add(Ctl.Name, "...", itEdit); для TMCKPanel получим Add(Ctl.Name, "...", itPanel);  и т.д. А чтобы не делать кучу условий - заводим массив:

TDrawType = (itUnknown, itEdit, itPanel, itCheckBox, itButton, ...);

MyClasses: array [TDrawType] of TMCKCustomControl {вроде так называется предок всех визуальных в МСК}
  = (TMCKEditBox, TMCKPanel, TMCKCheckBox, TMCKButton, ...);

var
  DT: TDrawTypes;

DT := itUnknown;

for I := Low(MyClasses) to High(MyClasses) do
begin
  if (TargetCtl is MyClasses[I]) then
  begin
    DT := I;
    break;
  end;
end;

// и тут мы получаем в переменной DT тип контрола, который надо зафигачить в генерируемый код.

И теперь не нужно добавлять условия, а только лишь добавлять значения в перечислимый тип и массив.


 
Barloggg   (2005-12-21 11:12) [10]

хмм... выглядит красиво. надо это использовать.
а как бы добавить сюда выборочное добавление? типа вот эти кнопки я хочу перекрыть, а эту вот не хочу.
это чтобы демку сбацать дабы показать как моя отрисовка уживается со стандартной.
опять-таки в МСК.


 
SPeller ©   (2005-12-21 11:31) [11]

Создаем у нашего компонента свойство, которое будет содержать какой-то класс, или строку, разделенную точкой с запятой, или простой стринглист. Это свойство будет хранить имена контролов, которые рисовать не надо. Для удобного редактирования придётся написать свой редактор свойства и поставлять вместе с компонентом.

MyClasses: array [TDrawType] of TMCKCustomControl {вроде так называется предок всех визуальных в МСК}
  = (nil, TMCKEditBox, TMCKPanel, TMCKCheckBox, TMCKButton, ...);

...

  if (TargetCtl is MyClasses[I] and (ExceptList.IndexOf(TargetCtl.Name) < 0)) then

...



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.123 c
15-1158860149
Palladin
2006-09-21 21:35
2006.10.15
Опрос: Великий стеб


15-1158834569
Дмитрий Белькевич
2006-09-21 14:29
2006.10.15
Как заставить win обновить CD каталог после записи?


3-1155546946
.ruslan
2006-08-14 13:15
2006.10.15
00.00.0000 00:00:00 -> Сегодня, 00:00 (без сохранения)


2-1159268728
TrainerOfDolphins
2006-09-26 15:05
2006.10.15
DBNavigator вертикально


6-1148205789
DenL
2006-05-21 14:03
2006.10.15
Как организовать автообновление?