Canvas panel для рисования

Canvas panel для рисования

Очень хочется вывести некий график на поверхность 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]

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

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

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

> [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;

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


> Юрий Зотов © (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.

У панели ЕСТЬ метод 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]

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

> Да ладно ! И у любого наследника 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;


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]

Источник

ASD-SOFT

Программирование. Теория и практика.

Рисование на канве (TCanvas) панели (TPanel) в Delphi

Здравствуйте уважаемые коллеги!

Как рисовать на канве TCanvas компонента TPanel — вопрос, на который я постараюсь дать ответ в данной статье.
Известно, что компонент TPanel не позволяет рисовать на своей канве, но есть способ обойти это ограничение…

Компонент TPanel в качестве родительского класса использует TCustomControl, у которого присутствует свойство Canvas и процедура Paint. Оба они находятся в разделе Protected, что означает что мы не можем использовать его напрямую, но можем получить доступ в дочернем классе.

Создадим собственный класс, унаследовав его от стандартного TPanel:

Вынесем свойство Canvas в раздел public что бы мы могли использовать его в созданных экземплярах данного класса.
Заменяем виртуальный метод Paint.
И добавляем событие OnPaint, которое будет вызываться в методе Paint, который в свою очередь срабатывает при перерисовке компонента.

В разделе implementation опишем метод Paint:

if Assigned(FOnPaint) then — Если присвоено событие OnPaint, то вызовем его, передав себя (ключевое слово Self) в качестве параметра.

После запуска можем наблюдать нарисованные кружки на панели:

Источник

Читайте также:  Adobe illustrator рисование пером
Оцените статью