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

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

Проблемма с TabControl [D7, WinXP]


Юра ©   (2007-09-10 19:58:00) 

Есть TabControl и 2 закладки на одной из закладок нарисован прямоугольник :  
with TabControl1 do begin
Canvas.Brush.Color := clWhite;
Canvas.Pen.Color := clBlack;
Canvas.Rectangle(10,50,50,100);
end;
Если я удаляю одну из закладок, то изображение это стирается.
Как сделать так, чтобы оно восстанавливалось?
Пробовал вышеуказанный код, добавлять в обработчик события OnPaint формы и при удаление вызывать Invalidate, не помогает...


{RASkov}   (2007-09-14 17:23:00) [1]

А если чесно, то TabControl не для этого.
Ну уж если сильно приспичило, то вот еще вариант:
"Кинуть" на TabControl TPaintBox, написать ему необходимый OnPaint
а у TabControl'а в его событии смены закладок написать нечто такое:
PaintBox.Visible:=TabIndex=<нужная закладка>;


DimaBr   (2007-09-14 14:38:00) [2]

Всё это можно сделать и в OnDrawTab, предварительно проверив является ли рисуемая вкладка первой.


{RASkov}   (2007-09-12 11:08:00) [3]

> Предварительно вызвав у предка этот же метод...
>
> > inherited;

Ух.... Этот же - это не OnPaint, а WMPaint.


{RASkov}   (2007-09-12 11:06:00) [4]

> [5] Юра   (12.09.07 10:37)

Если определен

> if Assigned(FOnPaint)

обработчик OnPaint, то его выполнить

> FOnPaint(self);

Предварительно вызвав у предка этот же метод...

> inherited;

Посмотри в VCL как организованы и реализованы обработчики событий.... ничего сложного там нет.
Вместо if Assigned(FOnPaint) then FOnPaint(self);можно написать необходимый код и делать все "внутри" компонента....


Kolan   (2007-09-12 11:02:00) [5]

> Объясни пожалуйста тело функции WMPaint.

Если событие FOnPaint задано, то вызвать его.

А вообще RTFM про события(Events) в Delphi.
Хорошо написано в книге:
Delphi 5. Руководство разработчика, том 1
http://www.podgoretsky.com/ddp.html


Юра   (2007-09-12 10:37:00) [6]

Объясни пожалуйста тело функции WMPaint.


{RASkov}   (2007-09-11 14:08:00) [7]

> это(OnPaint) свойство

> (посмотри как это сделано у TGraphicControl, например)

Т.е. у TGraphicControl нет свойства OnPaint, но есть метод где ловится сообщение WM_PAINT
а свойство определяется примерно так:

 TMyControl = class()
 private
   FOnPaint: TNotifyEvent;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
......
 public
....
   property OnPaint TNotifyEvent read FOnPaint write FOnPaint;
 end;
.................
procedure TMyControl.WMPaint(var Message: TWMPaint);
begin
 inherited;
 if Assigned(FOnPaint) then FOnPaint(self);
end;


{RASkov}   (2007-09-11 13:59:00) [8]

> [2] Юра   (11.09.07 08:59)
> А как обработать для него сообщение OnPaint

Нет такого сообщения, это(OnPaint) свойство.
Тебе нужно либо создать новый TMyTabControl и добавить туда это свойство
(посмотри как это сделано у TGraphicControl, например)
или переопредели TabControl.WindowProc и там лови WM_PAINT


Юра   (2007-09-11 08:59:00) [9]

А как обработать для него сообщение OnPaint, в инспекторе объектов TabControl есть только OnDrawTab?


{RASkov}   (2007-09-11 00:04:00) [10]

> [0] Юра   (10.09.07 19:58)
> Есть TabControl и 2 закладки на одной из закладок нарисован
> прямоугольник :  

В данном примере, (да и вообще у TTabControl'а как таковых закладок нет) нарисовано не на одной из закладок, а на общей(для всех закладок) клиентской части компонента....
Это раз.
Два: если хочешь что бы изображение перерисовывалось(не стиралось), то тебе нужно обработать WM_PAINT у твоего TabControl'а где и рисовать необходимое на клиентской части компонента... возможно учитывая параметры, такие как TabIndex.

> Пробовал вышеуказанный код, добавлять в обработчик события
> OnPaint

Зачем ты в сообщении чужому окну пытаешься рисовать на своем(другом) окне??
Твоему TabControl'у так же шлется WM_PAINT и ему можно сделать свой OnPaint.


Наверх

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