Ты понимаешь каким слоем жира ты обмазываешь элементарную нужду? вместо одного вызова TextOut ты городишь несколько контролов с хендлами...
Угу угу "вместо одного вызова TextOut"... и за штифтом следи, и рамочку и фон рисуй, и буковки центруй, и разные неожиданные баги с РИСОВАНИЕМ получай...
Нет, пойми меня правильно, я OwnerDraw применяю с удовольствием ... но только там где без него не обойтись!
( в случаях вроде рисования цветного MainMenu )... и где перекрывать логику управления гораздо сложнее чем изменить прорисовку одного элемента.
ты городишь несколько контролов с хендлами...
Звучит от как страшно .... Ууууу.....
Но это со стороны системы "ужос разбирает " а программист в простейшем случае пишет в цикл одну заведомо работающую строчку:
PL:= TPanel.Create(self); PL.Caption:=MyStrList[ i ]; PL.Height := 30; Algin:=alTop; InsertControl(PL);"Взул и забул!"

AlexDanilov привел чуть более сложную картинку но ничего не мешает вставить в панельку несколько TLabel ...

(И как вариант занести в список те что хранят изменяемое при скорлинге значение, хотя можно и просто заменить как-то так
OP:=Controls[i]; Controls[i] :=MyNewPanelCreate(i,data1,data2...); Op.free; ).
Чуть сложнее ?
Да, но "рисование" мало того что может быть не мене сложно так еще и может быть не очень надежно .
Добавлено спустя 2 часа 18 минут 20 секунд:Вот еще кусок кода (выводит иконки в три ряда и тут даже скроллинг автоматом работает если на скролбох вставить надо будет его кстати вернуть )...
- Код: Выделить всё
For I:=0 to tc-1 DO Begin
if (i+1) = k then begin
PN:=TPanel.Create(Self); CurToolsList.Add(pn); K:=CurToolsList.Count-1;
//Вывод иконок в три ряда тут сделан топорно можно сделать гораздо красивее
// просто добавить вставку панели ряда с Algin:=alTop;
///а сами иконки вставить по Algin:=alRight;
pn.Top:=Panel3.Height+Panel13.Height*2*(k div 3)+3;
pn.Left:=40*(k mod 3); Pn.Width:=40; pn.Height:=Panel13.Height*2;
//------------------------------------- END "Topor"-------------------------
pn.Hint:=ARTools[i].Hint;
pn.ShowHint:=True;
pn.HelpContext:=i;//! Все в порядке индекс записывается "железно"
Pn.OnClick:=@PanelClick; //Если иконки нет то на что-то нажимать все равно нужно
Pn.OnPaint:=@ToolsPanelPaint;// Тут просто выделение активного элемента задумано ...
if FileExists(SCR_DIR+ARTools[i].ICO) then begin
Img:=TImage.Create(pn); img.Align:=alClient;
img.OnClick:=@ImageClick;
Img.Picture.LoadFromFile(SCR_DIR+ARTools[i].ICO );
pn.InsertControl(img); img.Stretch:=true;
end else pn.Caption:=ARTools[i].Name; ;
Panel1.InsertControl(pn);
end
end;
Суть в том что очень часто если программе что-то рисуется "одноразово" то можно не заворачиваясь с рисованием делать динамическую форму из стандартных компонентов, а если нужно одно решение для нескольких разных блоков то можно затратить силы на отладку изменения прорисовки делая свой отдельный "не стандартный" компонент.
OwnerDraw промежуточное решение удобен тем что позволяет менять вид в RunTime не меняя удобства создания форм .