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

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

Как рисовать на TPanel


HRustBB ©   (2010-06-05 19:15:00) 

у компонента TPanel пытаюсь достучаться до свойства Canvas, создал компонент


unit myPanel;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
 TmyPanel = class(TPanel)
 private
   { Private declarations }
 protected
   { Protected declarations }
 public
   property Canvas;
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Standard', [TmyPanel]);
end;

end.


кинул его на форму и пытаюсь по нажатии кнопки нарисовать просто линию на этой панели


myPanel11.Canvas.Pen.Color:=0;
myPanel11.Canvas.MoveTo(0,0);
myPanel11.Canvas.LineTo(100,100);


а линии то нет !?
Подскажите пожалуйсто что я неправильно делаю


Омлет   (2010-06-07 11:38:00) [1]

http://fenik.nm.ru/DrawPanel.zip


Демо   (2010-06-06 14:34:00) [2]


> > Демо ©   (05.06.10 20:59) [4] Стандартом является создание
> наследника.А это - хак.


Пусть называется хак. Вот он-то де-факто и есть стандартный метод.


Leonid Troyanovsky   (2010-06-06 11:36:00) [3]


> HRustBB   (05.06.10 19:15)  

> просто линию на этой панели


type
TmyPanel = class(TPanel)
private
  { Private declarations }
  FDrawLine: Boolean;
protected
  { Protected declarations }
  procedure Paint; override;
  procedure SetDrawLine(const Value: Boolean); virtual;
public
  property DrawLine: Boolean read FDrawLine write SetDrawLine;
published
  { Published declarations }
end;

procedure TMyPanel.Paint;
begin
 inherited;
 if FDrawLine then
   begin
     Canvas.Pen.Color:=0;
     Canvas.MoveTo(0,0);
     Canvas.LineTo(100,100);
   end;
end;

procedure TMyPanel.SetDrawLine;
begin
 if (Value <> FDrawLine) then
   begin
     FDrawLine := Value;
     Invalidate;
   end;
end;

--
Regards, LVT.


Leonid Troyanovsky   (2010-06-06 10:50:00) [4]


> Демо ©   (05.06.10 20:59) [4]

Стандартом является создание наследника.
А это - хак.

--
Regards, LVT.


Leonid Troyanovsky   (2010-06-06 10:48:00) [5]


> HRustBB   (05.06.10 19:15)  

> Подскажите пожалуйсто что я неправильно делаю


type
TmyPanel = class(TPanel)
private
  { Private declarations }
protected
  { Protected declarations }
public
  procedure Paint; override;
published
  { Published declarations }
end;

procedure TMyPanel.Paint;
begin
 inherited;
 Canvas.Pen.Color:=0;
 Canvas.MoveTo(0,0);
 Canvas.LineTo(100,100);
end;

--
Regards, LVT.


Харакири   (2010-06-06 10:12:00) [6]


> При репаинте линия пропадает действительно, но это вопрос
> для меня решаемый :)


По таймеру ее, по таймеру!

:о)


HRustBB   (2010-06-06 02:00:00) [7]


> Демо ©   (05.06.10 20:58) [3]


Спасибо, то что нужно.

При репаинте линия пропадает действительно, но это вопрос для меня решаемый :)


Германн   (2010-06-06 01:44:00) [8]


> Кому надо?
>

Наверно автору, Саш.
Его способ с созданием наследника может и не нужен, но ведь вопрос то "а линии то нет !?"


Демо   (2010-06-06 01:17:00) [9]


> спрашиваю   (06.06.10 01:09) [9]
> Демо ©   (06.06.10 00:43) [8] > Вообще-то вопрос про TPanel.
> Даже у TPanel надо рисовать в перекрытой процедуре Paint


Кому надо?


спрашиваю   (2010-06-06 01:09:00) [10]

Демо ©   (06.06.10 00:43) [8]


> Вообще-то вопрос про TPanel.


Даже у TPanel надо рисовать в перекрытой процедуре Paint


Демо   (2010-06-06 00:43:00) [11]


> пытаюсь по нажатии кнопки нарисовать просто линию на этой
> панели



> Loginov Dmitry ©   (05.06.10 22:56) [5]
>Для рисования линий по кнопке используйте TImage.



> Правильный$Вася   (05.06.10 22:56) [6]
> рисовать нужно в обработчике события Paint


Вообще-то вопрос про TPanel.


спрашиваю   (2010-06-06 00:15:00) [12]


> Для рисования линий по кнопке используйте TImage.


зафигом ?


Правильный$Вася   (2010-06-05 22:56:00) [13]


> кинул его на форму и пытаюсь по нажатии кнопки нарисовать
> просто линию на этой панели

просто перерисовки вызываются виндой часто, и твоя линия была затерта
рисовать нужно в обработчике события Paint


Loginov Dmitry   (2010-06-05 22:56:00) [14]


> кинул его на форму и пытаюсь по нажатии кнопки нарисовать
> просто линию на этой панели
>
>
> myPanel11.Canvas.Pen.Color:=0;
> myPanel11.Canvas.MoveTo(0,0);
> myPanel11.Canvas.LineTo(100,100);
>


Для рисования линий по кнопке используйте TImage.

В общем случае рисование осуществляется в OnPaint / WMPaint.
OnPaint есть у TPaintBox


Демо   (2010-06-05 20:59:00) [15]

PS.
Это стандартный метод для доступа к protected-полям.


Демо   (2010-06-05 20:58:00) [16]

Поле Canvas в классе TPanel находится в секции protecte. Это означает, что оно доступно в наследниках TPanel.

Описываем класс-наследник TMPanel и обращаемся к Panel1 как к наследнику. В наследнике доступно поле Canvas.

unit Unit1;

interface

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

type

 TMPanel=class(TPanel)
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Panel1: TPanel;


procedure TForm1.Button1Click(Sender: TObject);
begin
 TMPanel(Panel1).Canvas.PenPos := Point(0,0);
 TMPanel(Panel1).Canvas.LineTo(100,100);


HRustBB   (2010-06-05 20:11:00) [17]


> Демо ©   (05.06.10 19:54) [1]


а можно поподробней для ламера :)


Демо   (2010-06-05 19:54:00) [18]

 TMPanel=class(TPanel)
 end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 TMPanel(Panel1).Canvas.PenPos := Point(0,0);
 TMPanel(Panel1).Canvas.LineTo(100,100);


Наверх

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