Форум: "Начинающим";
Текущий архив: 2010.08.29;
Скачать: [xml.tar.bz2];
ВнизКак рисовать на 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c