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

Вниз

Как рисовать на TPanel   Найти похожие ветки 

 
HRustBB   (2010-06-05 19:15) [0]

у компонента 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-05 19:54) [1]

 TMPanel=class(TPanel)
 end;


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) [2]


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


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


 
Демо ©   (2010-06-05 20:58) [3]

Поле 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);


 
Демо ©   (2010-06-05 20:59) [4]

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


 
Loginov Dmitry ©   (2010-06-05 22:56) [5]


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


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

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


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


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

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


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


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


зафигом ?


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


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



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



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


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


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

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


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


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


 
Демо ©   (2010-06-06 01:17) [10]


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


Кому надо?


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


> Кому надо?
>

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


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


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


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

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


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


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


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

:о)


 
Leonid Troyanovsky ©   (2010-06-06 10:48) [14]


> 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.


 
Leonid Troyanovsky ©   (2010-06-06 10:50) [15]


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

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-06-06 11:36) [16]


> 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.


 
Демо ©   (2010-06-06 14:34) [17]


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


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


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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
10-1166182665
CRA5H
2006-12-15 14:37
2010.08.29
Как вызвать JavaScript функцию из Delphi?


15-1275936455
xayam
2010-06-07 22:47
2010.08.29
Игровой сервер 2


10-1167679059
TStas
2007-01-01 22:17
2010.08.29
Как получить код странички, загруженной в WebBrowser?


2-1275900385
12
2010-06-07 12:46
2010.08.29
AV при Close у TForm


15-1275984221
SP
2010-06-08 12:03
2010.08.29
Подскажите ПО реализующее стабильный VPN-клиент (PPTP)