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