![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPanel и Canvas. Можно ли рисовать по TPanel ?
Begin © (2005-07-27 13:14:00)Очень хочется вывести некий график на поверхность TPanel. Однако сей компонент свойства Canvas не имеет, хоть он и наследник TCustomControl...
Пробовал делать так
cnv := TControlCanvas.Create;
TControlCanvas(cnv).Control := Panel1;
cnv.LineTo(20,20);
Линия на панели появляется, но тут же, мгновено, исчезат. Подскажите, плиз, как это победить ? Или как получить возможность рисовать по поверхности TPanel'а...
Begin (2005-07-27 15:39:00) [1]И ешшо раз спасибо ! :)
Юрий Зотов (2005-07-27 15:21:00) [2]> 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:19:00) [3]
> Pearled © (27.07.05 15:14) [19]
> Добавь строчку self.Canvas.MoveTo(0,0); перед LineTo.
Yeees !!! Thank VERRY much !!! :))))
Pearled (2005-07-27 15:14:00) [4]Добавь строчку self.Canvas.MoveTo(0,0); перед LineTo.
Begin (2005-07-27 15:05:00) [5]
> Тогда - срочно в школу. Учить азбуку ООП.
Школа - это лет 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;
end.
Юрий Зотов (2005-07-27 14:47:00) [6]> Begin
Мне интересно - Вы ответы, вообще-то, читаете? А если читаете, то хотя бы немного над ними задумываетесь? На Ваш вопрос давно уже ответили и давно все разжевали.
> Да ладно ! И у любого наследника TCustomControl он тоже
> есть ???? Ух ты... никогда б не подумал... :)
Тогда - срочно в школу. Учить азбуку ООП.
> А можно привести текст прямого вызова оного метода
> экземпляром TPanel ? :)
Можно. См. [2]. TFriendPanel(Panel1).Paint
Begin (2005-07-27 14:30:00) [7]
> jack128 © (27.07.05 14:22) [15]
> У панели ЕСТЬ метод Paint
> Ps есть code complite не показывает метод - это не означает,
> что его нету.
Да ладно ! И у любого наследника TCustomControl он тоже есть ???? Ух ты... никогда б не подумал... :)
А можно привести текст прямого вызова оного метода экземпляром TPanel ? :)
jack128 (2005-07-27 14:22:00) [8]У панели ЕСТЬ метод Paint
Ps есть code complite не показывает метод - это не означает, что его нету.
Begin (2005-07-27 14:19:00) [9]
> Плохиш © (27.07.05 14:13) [11]
Эт ты выпендрицца решил? :) У панели нет ни метода Paint, ни события onPaint.
Плохиш (2005-07-27 14:16:00) [10]
> Плохиш © (27.07.05 14:13) [11]
Опс, пардон, нет такого обработчика. Всё сказано в >Юрий Зотов © (27.07.05 14:04) [7]
Юрий Зотов (2005-07-27 14:16:00) [11]> Begin (27.07.05 14:11) [10]
> У самой панели есть метод Paint ? Или у кого то из её
> предков ?
Смотрим справку, находим TCustomControl.Paint.
> линии появляются и тут же исчезают.
Естественно. При первой же перерисовке линии исчезнут. Вы же их не перерисовываете.
Плохиш (2005-07-27 14:13:00) [12]
> Begin (27.07.05 14:06) [9]
У Панели свои представления о том как себя рисовать, а для того, чтобы программист смог тоже поучаствовать в рисовании создан обработчик события OnPaint. Хотя, об этом было сказано в [1]
Begin (2005-07-27 14:11:00) [13]
> Юрий Зотов © (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]
>
> Выбросьте этот код. У панели есть своя канва, никаких дополнительных
> создавать не требуется.
С радостью. И уже. Но проблема осталась (с уточнением) - на свежесозданных панельках линии появляются и тут же исчезают.
Begin (2005-07-27 14:06:00) [14]Блин, поторопился... :)
Онклик при том, что панель, по коей рисовать, им же и создается
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;
Этот код себя не оправдывает, линия рисуется и тут же исчезает.
Юрий Зотов (2005-07-27 14:05:00) [15]> Begin (27.07.05 14:03) [6]
Выбросьте этот код. У панели есть своя канва, никаких дополнительных создавать не требуется.
Юрий Зотов (2005-07-27 14:04:00) [16]> Begin (27.07.05 13:56) [4]
Нужно перекрыть метод Paint у самой панели. В нем и рисовать.
Begin (2005-07-27 14:03:00) [17]
> Думкин © (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 13:59:00) [18]> [4] Begin (27.07.05 13:56)
А при чем тут онклик?
Begin (2005-07-27 13:56:00) [19]А ! Блин !
Оть что за фигня !
Если на форме уже есть панель - то рисовать по ней можно всеми предложеными способами (за что сеньк). И моим тоже... :)
А вот если создать панель в онклике, и в том же онклике попытаться по ней провести линию, то ни фига - мелькает, и тут же исчезает...
Как победить ???
Begin (2005-07-27 13:46:00) [20]
> > Очень хочется вывести некий график на поверхность TPanel.
> А зачем? Есть такая штука, как PaintBox, к примеру.
Да эт понятно... Но панелей много... На Каждой уже есть несколько компонентов... Добавить еще один в каждую ? Лишний код, память опять же... При том, что сама TPanel имеет место, где рисовать. Ну вот уперся я в TPanel, и зацепило. :)
> Имеет, только не public. Создай наследника TPanel и в нём
> вынеси Canvas в секцию public.
Нууу... Как вариант.
> Где? Попробую делать так в обработчике Form.OnPaint.
Пробовал. Не спасает.