![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как рисовать на 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);