Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.023 c
4-1119417239
pavel_guzhanov
2005-06-22 09:13
2005.08.14
Как запустить программу на удаленном компьютере?


4-1119519704
ORMADA
2005-06-23 13:41
2005.08.14
CreateProcess трабл


14-1122111263
alex-drob
2005-07-23 13:34
2005.08.14
Проблема с отображением шрифта на странице


3-1120541716
Ландграф Павел
2005-07-05 09:35
2005.08.14
Access через ADO


1-1122026083
Ravend
2005-07-22 13:54
2005.08.14
Порекомендуйте контрол





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский