![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Графичиские процедуры в отдельном модуле [D5, WinXP]
$Hic0 © (2002-08-21 17:53:00)Добрый день!
Возникла необходимость сделать так что-бы графические процедуры реализованные с помощью класса TCanvas находились в отдельном модуле... например предполагается сделать модуль Domik
в котором будет находиться класс TDom, примерно такой
Type TDom=class(TObject)//(TCanvas)?
private
Procedure Crug(Dot:TPoint,R:Integer,Col:TColor);
Procedure Triangle(Dot1,Dot2,Dot3:TDot,Col:TColor);
Public
Procedure PaintDom(Vizible:boolean);
end;
Писал от балды, так для примера... в общем побелема в том что необходимо обращаться к классу TDom модуля Domik из совершенно различных мест программы (модулей)... Вопрос, наверное глупый, но все-же... как устроить что-бы из вызывающего модуля обращение производилось по типу
var Dom: TDom;
Begin
PaintDom(true);
End;
Т.е. необходимо что-бы методы класса TDom рисовали на ТОЙформе, из которой их вызывают
Наверное сумбурно объяснил, т.е. в методах не должно быть слов типа TForm.Canvas.LineTo (обратно-таки от балды) :)... воть... сумбурно, но очень надеюсь что кто-нить поможет.
С уважением, Shico
Игорь Шевченко (2002-08-22 13:14:00) [1]$hiC0 © (22.08.02 12:56)
Вот и славно :-)
Ekaterina (2002-08-22 12:56:00) [2]FCanvas.Ellipse(Dot.x-R,Dot.y-R,Dot.x+R,Dot.y+R); Ошибка здесь(отрицательные числа)
$hiC0 (2002-08-22 12:56:00) [3]СПАСИБО!!!!!!!!!! Все заработало. Блин точно руки кривые. Алекс, Skier огромное спасибо. Глубокоуважаемый Игорь Шевченко, я от радости даже на Вас не в обиде :)
Извращенец (2002-08-22 12:54:00) [4]
> $hiC0
Я, как извращенец, могу предложить только извращенские идеи. и чем больше холстов, тем извращеннее способ, тем лучше оправдывается мой ник.
Skier (2002-08-22 12:51:00) [5]>$hiC0
constructor TDom.Create(ACanvas: TCanvas);
begin
inherited Create;
FCanvas := ACanvas;
end;
Alex4444444444 (2002-08-22 12:51:00) [6]Интересно. Я, честно говоря, не пробовал, но может на форме и нельзя рисовать? Посмотри в исходниках, какой там у нее канвас.
Если нет, нужно на нее что нибудь положить (типа PaintBox"a) и передавать ЕГО канвас. В любом случае, ето должен быть канвас того контрола, на котором нужно рисовать. (Я обычно рисую на TPanel или TPaintBox.)
$hiC0 (2002-08-22 12:49:00) [7]Игорь Шевченко © >> ОЧень приятно было это услышать... так любой сказать может.. не спорю, руки у меня далеки от мастерских, но знаете-ли это по меньшей мере не красиво... вместо того что-бы помочь...
Игорь Шевченко (2002-08-22 12:47:00) [8]Очевидно, руки
$hiC0 (2002-08-22 12:40:00) [9]Пишу по совету Alex4444444444:
unit domik;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls;
type TDom=class
Private
FCanvas: TCanvas;
procedure Circle(Dot:TPOint;R:Integer);
public
constructor Create(ACanvas: TCanvas);
procedure DrawDom(n:integer);
end;
implementation
constructor TDom.Create(ACanvas: TCanvas);
begin
inherited Create;
FCanvas := TCanvas.Create;
end;
procedure TDom.Circle(Dot:TPOint;R:Integer);
Begin
FCanvas.Ellipse(Dot.x-R,Dot.y-R,Dot.x+R,Dot.y+R);
End;
Procedure TDom.DrawDom(n:integer);
Var i : integer;
Dot : TPoint;
Begin
For i:=1 to n do
Begin
Dot.x:=i;Dot.y:=i;
Circle(Dot,n);
End;
End;
end.
И вызывающий модуль:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, domik,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Dom : TDom;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Dom:=TDom.Create(Canvas);
Dom.DrawDom(4);
end;
end.
В ответ рантайм ошибка (после нажатия пимпы)... щас скажу какая... EInvalidOperation "Canvas does not allow drawing"
По зарез надо, подскажите плиз что у меня на так
DiamondShark (2002-08-22 12:14:00) [10]Странный Вы человек!
"Мне что-то кажется, не знаю даже что".
А попробовать?
Skier (2002-08-22 12:00:00) [11]>$hiC0
Ну так и передавай канвас формы в PaintDom
PaintDom(Canvas, True); (в чём проблема-то ?)
Alex4444444444 (2002-08-22 11:59:00) [12]Просто Canvas передать, и все. Он все про себя знает (в том числе и свою форму). Можно даже так сделать (так будет культурно, т.к. твой класс без канваса ничего не может):
type
TDom = class
private
FCanvas: TCanvas;
...
public
constructor Create(ACanvas: TCanvas);
....
end;
constructor TDom.Create(ACanvas: TCanvas);
begin
inherited;
FCanvas := TCanvas;
end;
$hiC0 (2002-08-22 11:54:00) [13]так что, никто не знает что-ли?????
$hiC0 (2002-08-21 20:42:00) [14]To DiamondShark © >>
Да? :) Т.е. передавать канву той формы на которой собираюсь рисовать во внутренние классы внешнего модуля? Это имелось ввиду? :) А сработает?
Мне кажется... надо что-то делать с TWinControl-ом... мне так кажется, но что именно не знаю... неужели никто не подскажет? :)
$hiC0 (2002-08-21 20:40:00) [15]To Извращенец © >> А если у меня 50 холстов на которых надо разные домики нарисовать? :) Каково? :) А если не 50, а 1000? Должна быть универсальность :)
DiamondShark (2002-08-21 19:02:00) [16]А передавать Canvas как один из параметров уже не модно?
Извращенец (2002-08-21 19:00:00) [17]организуй переменную integer, в каждом модуле ей присваивай определенное значение, и в модуле Домик в зависимости от значения переменной рисуешь там где надо.