Страница 1 из 1

Рисование на канве

Добавлено: 10 апр 2005, 02:38
qwerqwer
Если нужно организовать процедуру для рисования фигуры на произвольной канве.
Как это можно сделать, если не известо от какого именно объекта происходит вызов процедуры, т.е. sender заранее не известен.

Добавлено: 10 апр 2005, 17:53
Хыиуду
Если процедуру планируется использовать внутри одной программы, то можно заранее посмотреть, какие именно на каких именно канвасах она может использоваться.

Код: Выделить всё

procedure figura(var cnv:TCanvas);
begin
  {Тут рисование фигуры или чего там еще}
end;
procedure drawoncanvas(sender:TObject);
begin
  if sender is TForm
  then figura((sender as TForm).canvas)
  else  if sender is TImage
  then figura((sender as TImage).canvas)
  else   if sender is TMyComponent
  then figura((sender as TMyComponent).canvas);
  {Все это прописывается для нужного количества компонентов}
end;

Добавлено: 11 апр 2005, 01:32
qwerqwer
Нет это-то понятно, а нельзя ли как-либо реализовать без перебора всех возможных обьектов.

Добавлено: 11 апр 2005, 08:33
Dr.Grizzly
Например нарисовать что-то на экране по координатам x,y где MAX(X)=1024, MAX(y)=768 :) Например так? Можно же не на окне рисоваться а прям на рабочем столе так скажем.

Добавлено: 11 апр 2005, 11:47
Игорь Акопян
Свойство Canvas определено в классе TGraphicControl, поэтому достаточно проверить:

Код: Выделить всё

  if Sender is TGraphicControl then 
  begin
    MyCanvas := (Sender as TGraphicControl).Canvas;
    // и далее обращаться к ней
  end;

Добавлено: 11 апр 2005, 17:55
Хыиуду
Игорь Акопян писал(а):Свойство Canvas определено в классе TGraphicControl
Вот! Именно это я и пытался вспомнить: где же определяется канвас. Так и не вспомнил. Спасибо, Игорь!

Добавлено: 12 апр 2005, 00:36
Игорь Акопян
блин, робяты, а что Delphi Help уже отменили? ;) Кликаем на панели инструментов любой контрол - давим F1, выбираем Properties и листам окно вниз до слова Canvas (или ещё какого) и читаем название класса. :)

Добавлено: 12 апр 2005, 08:23
LAngel
Канвас можно "присобачить" всем, у кого есть Handle. Хоть на кнопку... :) ))

Код: Выделить всё

procedure something(sender: TObject);
var
  C: TCanvas;
begin
  if (Sender is TWinControl) then
  begin
    C := TCanvas.Create;
    try
      C.Handle := GetDC((Sender as TWinControl).Handle);
      C.Rectangle(5,5,20,20);
      ReleaseDC(0, C.Handle);
    finally
      C.Free;
    end;
  end;
end;
Только о периресовке этого канваса надо заботиться самостаятельно.

Добавлено: 12 апр 2005, 17:42
qwerqwer
Спасибо БОЛЬШОЕ, я теперь уловил, как делать!!!