Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 23:40   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию указатель на TCanvas

я создаю класс для отображения визуального компонента на форме

в создании и работе с окнами я не особо шарю,
поэтому создаю такой класс, который будет себя отрисовывать на канвасе формы.
а вообще следуя логике что TCanvas = TCanvas,
то на любом канвасе, хоть на кнопке, хоть в битмапе.

для реализации этой идеи я создал в классе поле в котором будет
храниться указатель на Canvas, на котором класс будет себя рисовать.

PCanvas:^TCanvas;

а после создания экземпляра класса написать

PCanvas:=@Form1.Canvas;

а в самом классе процедура

procedure Draw;
begin
PCanvas^.Draw(0,0,Frame); // нарисовать себя на указаном канвасе
end;

и все бы ничего, но строчка
PCanvas:=@Form1.Canvas;
выдает ошибку - Variable Required

поэтому вопрос, в чем я не прав и как правильно реализовать такую идею?

и еще один вопрос.
что если создать в классе поле
Canvas:TCanvas;
а потом присвоить ему Canvas формы:
Class.Canvas:=Form1.Canvas; ?

насколько я себе представляю, это будет хрень.
что-то типа если переменной b присвоить значение переменной a, а потом изменять переменную b.
значение переменной a при этом не изменится.

или в случае с канвасами это работает по-другому?
xrob вне форума Ответить с цитированием
Старый 12.05.2011, 00:41   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

TCanvas - это объект (класс) и при объявлении его в разделе переменных (var):
Код:
var
  Cnv : TCanvas;
переменная Cnv будет содержать указатель на объект. Правда, его надо еще создать.
У формы есть уже Canvas (создается при создании формы) и заменять его нет никакой необходимости.
Его просто надо применять в самой форме и не городить огород.

В Дельфи переменные, ссылающиеся на объекты и есть указатели на них (не явные указатели, т.е. к ним не применяются символ "^").

Если необходимо рисовать в своем классе, то надо в нем объявить поле класса TCanvas, создать его и рисовать в нем не трогая канвы других компонентов.

Цитата:
Canvas:TCanvas;
а потом присвоить ему Canvas формы:
Class.Canvas:=Form1.Canvas; ?
Не будет никакой хрени, если только выбросить лишнеее слова Class и чтобы имя этого "поля" не совпадало с уже имеющимися полями в классе (впрочем, последнее не пропустит компилятор).
Поле будет содержать точно такую же ссылку на созданный в объекте класса Canvas и при изменении свойств в одном из них и там, и там будут изменения.
Только не очень понятна логика такого извращения. Иметь еще указатель на один и тот же TCanvas? Тогда надо осознавать какую задачу он будет решать.

Цитата:
...то на любом канвасе, хоть на кнопке, хоть в битмапе.
Если класс TBitMap предоставляет свой Canvas для обращения к нему извне, то кнопка таки нет. И чтобы его "вытащить" у кнопки надо еще исхитриться.

Последний раз редактировалось Прик; 12.05.2011 в 01:13.
Прик вне форума Ответить с цитированием
Старый 12.05.2011, 01:00   #3
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

Цитата:
я создаю класс для отображения визуального компонента на форме
Наследуйте свой компонент от дельфовского класса TGraphicControl, у него есть поле Canvas. Для рисования на этом канвасе придуман абстрактный метод Paint. В реализации своего класса помещайте в этот метод отрисовку на экране.
Код:
TMyClass = class(TGraphicControl)
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent);
  end;
...
constructor TMyClass.Create(AOwner: TComponent);
begin
inherited;
Canvas.Brush.Color:=clRed;
Canvas.Pen.Width:=3;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mc:=TMyClass.Create(Self);
mc.Parent:=Self;
mc.Left:=100;
mc.Top:=100;
mc.Width:=200;
mc.Height:=150;
end;

procedure TMyClass.Paint;
begin
Canvas.Ellipse(2, 2, Width - 2, Height - 2);
end;

Последний раз редактировалось WhiteSpirit; 12.05.2011 в 01:06.
WhiteSpirit вне форума Ответить с цитированием
Старый 12.05.2011, 01:21   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

эта фраза
Цитата:
переменная Cnv будет содержать указатель на объект
открыла мне глаза на смысл жизни! =)
я просто раньше не знал что это так.
я думал Cnv это и есть сам канвас,
а если получается что сам по себе канвас лежит где-то,
а Cnv это ссылка на него,
то тогда получается мою задачу можно решить просто:

Test.MyCanvas:=Form1.Canvas;

WhiteSpirit,
там у меня слово Class не в смысле класс,
а в смысле имя создаваемого экземпляра класса,
так что оно там не лишнее.
а за совет - спасибо! воспользуюсь когда-нибудь в будующем,
сейчас не хочу возиться с наследованиями
и тем более со стандартными классами делфи.

всем спасибо за внимание =)
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Incompatible types TCanvas and TBitmap athleet Общие вопросы Delphi 2 13.07.2011 04:01
[Del] TCanvas.pixels → HBitMap Alex Cones Win Api 11 21.11.2009 19:54
Графика в Делфи TCanvas Summerrain Помощь студентам 1 19.12.2008 02:39
Как работать с TCanvas - на PaintBox1 программа должна рисовать полигон Михаил Юрьевич Общие вопросы Delphi 16 04.01.2008 15:31
TListView; не рисует цветом TCanvas JetAPI Компоненты Delphi 9 24.08.2007 22:22