Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TPageControl не получается сделать OwnerDraw


@!!ex ©   (2011-06-16 17:41:00) 

Когда контрол рисует все сам - получается все корректно:
http://develop.sol-online.org/deutch_1.png

Стоит мне включить свойство OwnerDraw и назначит обработчик OnDrawTab вида:
var
 r:TRect;
 s:string;
begin
 r:=Rect;
 s:=TPageControl(Control).Pages[TabIndex].Caption;
 Control.Canvas.TextRect(r,s,[tfCenter,tfVerticalCenter]);
end;


И в середину вклинивается текст не относящийся к этому PageControl'у:
http://develop.sol-online.org/deutch_2.png

Что я делаю не так????


@!!ex   (2011-06-17 10:37:00) [1]

В генофонде есть вот такая функция:
function TPageControl.PageIndexFromTabIndex(TabIndex: Integer): Integer;
var
 I: Integer;
begin
 // Tabs doesn't contain hidden TabSheets so the index
 // needs to be adjusted to account for any hidden pages.
 Result := TabIndex;
 for I := 0 to TabIndex do
   if not Pages[I].TabVisible then
     Inc(Result);
end;

Она protected, сделал такую же в своем коде и соответственно получил то что нужно.


icWasya   (2011-06-17 09:40:00) [2]

Windows - PageControl неумеет делать невидимые табы.
А в генофонде для этого сделан трюк - когда делаете tabvisible:=false, то соответствующий tabsheet исключается из Windows-PageControl.
Может быть из за этого и происходят упомянутые глюки.


KilkennyCat   (2011-06-16 22:40:00) [3]


> Когда нужно отрисовывать Таб4, приходит индекс Таб3, при
> этом rect содержит зону для рисования именно в Таб4.

странно. все проверил? как в генофонде реализовано глядел? Я б глянул, да ща в командировке, нет делфей.


@!!ex   (2011-06-16 19:26:00) [4]

Сделал вот так:
 if TPageControl(Control).Pages[TabIndex].TabVisible then begin
   r:=Rect;
   s:=TPageControl(Control).Pages[TabIndex].Caption;
   Control.Canvas.TextRect(r,s,[tfCenter,tfVerticalCenter]);

   writeln(Control.Name,' ',TabIndex,' ',s);
 end;

И получил контрол без текста. :(


@!!ex   (2011-06-16 19:08:00) [5]

да не!
Приходит сообщение на отрисовку с неверным индексом!
Например:
Таб0 Таб1 Таб2 Таб4

Таб3 - не видим.
Когда нужно отрисовывать Таб4, приходит индекс Таб3, при этом rect содержит зону для рисования именно в Таб4.


KilkennyCat   (2011-06-16 18:41:00) [6]

наверно, просто проверять, видимый пэйдж или нет...


@!!ex   (2011-06-16 18:10:00) [7]

> [1] KilkennyCat ©   (16.06.11 17:56)
> TPageControl(Control).Pages[TabIndex].Caption; куда-нить
> в мемо выведи и погляди, какие они есть.

Ага. Как раз этим занимался. В консольку вывел.

Вобщем это невидимый TabSheet.
Судя по всему индексы хранятся в соответствии со всеми табами.
А при рендере TabIndex - это индекс только видимого таба.
Как TabIndex перевести из индекса видимыхтабов в индекс всехтабов?


KilkennyCat   (2011-06-16 17:56:00) [8]

TPageControl(Control).Pages[TabIndex].Caption; куда-нить в мемо выведи и погляди, какие они есть.


Наверх

Титульная страница Поиск, карта сайта Написать письмо