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

Вниз

TPanel и Canvas. Можно ли рисовать по TPanel ?   Найти похожие ветки 

 
Begin   (2005-07-27 13:14) [0]

Очень хочется вывести некий график на поверхность TPanel. Однако сей компонент свойства Canvas не имеет, хоть он и наследник TCustomControl...

Пробовал делать так
 
 cnv := TControlCanvas.Create;
 TControlCanvas(cnv).Control := Panel1;
 cnv.LineTo(20,20);


Линия на панели появляется, но тут же, мгновено, исчезат. Подскажите, плиз, как это победить ? Или как получить возможность рисовать по поверхности TPanel"а...


 
Чапаев ©   (2005-07-27 13:21) [1]

> Очень хочется вывести некий график на поверхность TPanel.
А зачем? Есть такая штука, как PaintBox, к примеру.

> Однако сей компонент свойства Canvas не имеет, хоть он и наследник TCustomControl...
Имеет, только не public. Создай наследника TPanel и в нём вынеси Canvas в секцию public.

> Пробовал делать так
Где? Попробую делать так в обработчике Form.OnPaint.

Удач! ;-)


 
Юрий Зотов ©   (2005-07-27 13:34) [2]

Можно и без наследника.

Объявляем тип:
type TFriendPanel = class(TPanel);

После этого секция protected станoвится доступна через приведение типа:
TFriendPanel(Panel1).Canvas.что-то


 
Begin   (2005-07-27 13:46) [3]


> > Очень хочется вывести некий график на поверхность TPanel.
> А зачем? Есть такая штука, как PaintBox, к примеру.

Да эт понятно... Но панелей много... На Каждой уже есть несколько компонентов... Добавить еще один в каждую ? Лишний код, память опять же... При том, что сама TPanel имеет место, где рисовать. Ну вот уперся я в TPanel, и зацепило. :)


> Имеет, только не public. Создай наследника TPanel и в нём
> вынеси Canvas в секцию public.

Нууу... Как вариант.


> Где? Попробую делать так в обработчике Form.OnPaint.

Пробовал. Не спасает.


 
Begin   (2005-07-27 13:56) [4]

А ! Блин !
Оть что за фигня !

Если на форме уже есть панель - то рисовать по ней можно всеми предложеными способами (за что сеньк). И моим тоже... :)

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

Как победить ???


 
Думкин ©   (2005-07-27 13:59) [5]

> [4] Begin   (27.07.05 13:56)

А при чем тут онклик?


 
Begin   (2005-07-27 14:03) [6]


> Думкин ©   (27.07.05 13:59) [5]
> > [4] Begin   (27.07.05 13:56)
>
> А при чем тут онклик?



procedure TForm1.Button1Click(forFile: string);
var
 XPanel  : TPanel;
 XCanvas : TControlCanvas;
begin
 XPanel := TPanel.Create(self);
...........
 XCanvas := TControlCanvas.Create;
 TControlCanvas(XCanvas).Control := XPanel;
 TControlCanvas(XCanvas).LineTo(20,20);
end;


 
Юрий Зотов ©   (2005-07-27 14:04) [7]

> Begin   (27.07.05 13:56) [4]

Нужно перекрыть метод Paint у самой панели. В нем и рисовать.


 
Юрий Зотов ©   (2005-07-27 14:05) [8]

> Begin   (27.07.05 14:03) [6]

Выбросьте этот код. У панели есть своя канва, никаких дополнительных создавать не требуется.


 
Begin   (2005-07-27 14:06) [9]

Блин, поторопился... :)

Онклик при том, что панель, по коей рисовать, им же и создается

procedure TForm1.Button1Click(Sender: TObject);
var
XPanel  : TPanel;
XCanvas : TControlCanvas;
begin
XPanel := TPanel.Create(self);
...........
XCanvas := TControlCanvas.Create;
TControlCanvas(XCanvas).Control := XPanel;
TControlCanvas(XCanvas).LineTo(20,20);
end;


Этот код себя не оправдывает, линия рисуется и тут же исчезает.


 
Begin   (2005-07-27 14:11) [10]


> Юрий Зотов ©   (27.07.05 14:04) [7]
> > Begin   (27.07.05 13:56) [4]
>
> Нужно перекрыть метод Paint у самой панели. В нем и рисовать.

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


> Юрий Зотов ©   (27.07.05 14:05) [8]
> > Begin   (27.07.05 14:03) [6]
>
> Выбросьте этот код. У панели есть своя канва, никаких дополнительных
> создавать не требуется.

С радостью. И уже. Но проблема осталась (с уточнением) - на свежесозданных панельках линии появляются и тут же исчезают.


 
Плохиш ©   (2005-07-27 14:13) [11]


> Begin   (27.07.05 14:06) [9]

У Панели свои представления о том как себя рисовать, а для того, чтобы программист смог тоже поучаствовать в рисовании создан обработчик события OnPaint. Хотя, об этом было сказано в [1]


 
Плохиш ©   (2005-07-27 14:16) [12]


> Плохиш ©   (27.07.05 14:13) [11]

Опс, пардон, нет такого обработчика. Всё сказано в >Юрий Зотов ©   (27.07.05 14:04) [7]


 
Юрий Зотов ©   (2005-07-27 14:16) [13]

> Begin   (27.07.05 14:11) [10]

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

Смотрим справку, находим TCustomControl.Paint.

> линии появляются и тут же исчезают.

Естественно. При первой же перерисовке линии исчезнут. Вы же их не перерисовываете.


 
Begin   (2005-07-27 14:19) [14]


> Плохиш ©   (27.07.05 14:13) [11]

Эт ты выпендрицца решил? :) У панели нет ни метода Paint, ни события onPaint.


 
jack128 ©   (2005-07-27 14:22) [15]

У панели ЕСТЬ метод Paint
Ps есть code complite не показывает метод - это не означает, что его нету.


 
Begin   (2005-07-27 14:30) [16]


> jack128 ©   (27.07.05 14:22) [15]
> У панели ЕСТЬ метод Paint
> Ps есть code complite не показывает метод - это не означает,
> что его нету.

Да ладно ! И у любого наследника TCustomControl он тоже есть ???? Ух ты... никогда б не подумал... :)

А можно привести текст прямого вызова оного метода экземпляром TPanel ? :)


 
Юрий Зотов ©   (2005-07-27 14:47) [17]

> Begin

Мне интересно - Вы ответы, вообще-то, читаете? А если читаете, то хотя бы немного над ними задумываетесь? На Ваш вопрос давно уже ответили и давно все разжевали.

> Да ладно ! И у любого наследника TCustomControl он тоже
> есть ???? Ух ты... никогда б не подумал... :)

Тогда - срочно в школу. Учить азбуку ООП.

> А можно привести текст прямого вызова оного метода
> экземпляром TPanel ? :)

Можно. См. [2]. TFriendPanel(Panel1).Paint


 
Begin   (2005-07-27 15:05) [18]


> Тогда - срочно в школу. Учить азбуку ООП.

Школа - это лет 15 тому. Благодарю... Вы шутки понимаете ? Или смайлики не заметили ? Это шутка была, юмор. Может, ирония легкая...


> Можно. См. [2]. TFriendPanel(Panel1).Paint

Это я уже понял. См.[10]. К тому же - в [16] я просил привести пример вызова этого метода экземпляром TPanel, а не экземпляром TFriendPanel.


> Мне интересно - Вы ответы, вообще-то, читаете? А если читаете,
> то хотя бы немного над ними задумываетесь? На Ваш вопрос
> давно уже ответили и давно все разжевали.

Читаю. По мере их реализации вопрос уточняется. Вот к примеру, простенький модуль. Благодаря вашему совету я добился, что на свежесозданой панели линия рисуется. Однако если форму свернуть/восстановить, линия пропадает и не восстанавливается, несмотря на перекрытый Paint... Как быть ? Перекрывать Repaint ? Так там только две строчки Invalidate и Update. Что там перекрывать то ?

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TXPanel = class(TPanel)
   procedure Paint; override;
 end;

 TForm1 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var Form1: TForm1;

implementation
{ TXPanel }
procedure TXPanel.Paint;
begin
 inherited Paint;
 self.Canvas.LineTo(20,20);
end;

procedure TForm1.Button1Click(Sender: TObject);
var X : TXPanel;
begin
 X := TXPanel.Create(self);
 X.Parent:= self;
end;

end.


 
Pearled ©   (2005-07-27 15:14) [19]

Добавь строчку self.Canvas.MoveTo(0,0); перед LineTo.


 
Begin   (2005-07-27 15:19) [20]


> Pearled ©   (27.07.05 15:14) [19]
> Добавь строчку self.Canvas.MoveTo(0,0); перед LineTo.


Yeees !!! Thank VERRY much !!! :))))


 
Юрий Зотов ©   (2005-07-27 15:21) [21]

> Begin   (27.07.05 15:05) [18]

> я просил привести пример вызова этого метода экземпляром
> TPanel, а не экземпляром TFriendPanel.

В примере Panel1 - это именно экземпляр TPanel и есть. Приведение типа не означает создание нового экземпляра.

> если форму свернуть/восстановить, линия пропадает и не
> восстанавливается, несмотря на перекрытый Paint..

Вопрос на засыпку - что нарисует Ваш Paint при его втором вызове?

Наводящий вопрос: чему равны текущие координаты пера при создании панели и после вызова Вашего Paint?

Короче:

procedure TXPanel.Paint;
begin
 inherited;
 Canvas.MoveTo(0, 0);
 Canvas.LineTo(20, 20)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TXPanel.Create(Self).Parent := Self
end;


 
Begin   (2005-07-27 15:39) [22]

И ешшо раз спасибо ! :)



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

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

Наверх




Память: 0.53 MB
Время: 0.028 c
1-1122372526
serg128
2005-07-26 14:08
2005.08.14
Как поменять цвет строки в TListBox?


8-1106943331
Денис. Ф.
2005-01-28 23:15
2005.08.14
установка частоты съемки у WEB - камеры


3-1120757104
Michael5
2005-07-07 21:25
2005.08.14
Как уменьшить размер текстового поля таблицы в БД Access?


3-1120634051
vitzol
2005-07-06 11:14
2005.08.14
Подсветка символов в DBgrid при фильтрации


1-1122443062
Legion89
2005-07-27 09:44
2005.08.14
Задание цвета текста в RichEdit