Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

Графичиские процедуры в отдельном модуле   Найти похожие ветки 

 
$Hic0 ©   (2002-08-21 17:53) [0]

Добрый день!
Возникла необходимость сделать так что-бы графические процедуры реализованные с помощью класса 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-21 19:00) [1]

организуй переменную integer, в каждом модуле ей присваивай определенное значение, и в модуле Домик в зависимости от значения переменной рисуешь там где надо.


 
DiamondShark ©   (2002-08-21 19:02) [2]

А передавать Canvas как один из параметров уже не модно?


 
$hiC0 ©   (2002-08-21 20:40) [3]

To Извращенец © >> А если у меня 50 холстов на которых надо разные домики нарисовать? :) Каково? :) А если не 50, а 1000? Должна быть универсальность :)


 
$hiC0 ©   (2002-08-21 20:42) [4]

To DiamondShark © >>
Да? :) Т.е. передавать канву той формы на которой собираюсь рисовать во внутренние классы внешнего модуля? Это имелось ввиду? :) А сработает?
Мне кажется... надо что-то делать с TWinControl-ом... мне так кажется, но что именно не знаю... неужели никто не подскажет? :)


 
$hiC0 ©   (2002-08-22 11:54) [5]

так что, никто не знает что-ли?????


 
Alex4444444444   (2002-08-22 11:59) [6]

Просто Canvas передать, и все. Он все про себя знает (в том числе и свою форму). Можно даже так сделать (так будет культурно, т.к. твой класс без канваса ничего не может):


type
TDom = class
private
FCanvas: TCanvas;
...
public
constructor Create(ACanvas: TCanvas);
....
end;

constructor TDom.Create(ACanvas: TCanvas);
begin
inherited;
FCanvas := TCanvas;
end;



 
Skier ©   (2002-08-22 12:00) [7]

>$hiC0
Ну так и передавай канвас формы в PaintDom
PaintDom(Canvas, True); (в чём проблема-то ?)


 
DiamondShark ©   (2002-08-22 12:14) [8]

Странный Вы человек!
"Мне что-то кажется, не знаю даже что".
А попробовать?


 
$hiC0 ©   (2002-08-22 12:40) [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"

По зарез надо, подскажите плиз что у меня на так


 
Игорь Шевченко ©   (2002-08-22 12:47) [10]

Очевидно, руки


 
$hiC0 ©   (2002-08-22 12:49) [11]

Игорь Шевченко © >> ОЧень приятно было это услышать... так любой сказать может.. не спорю, руки у меня далеки от мастерских, но знаете-ли это по меньшей мере не красиво... вместо того что-бы помочь...


 
Alex4444444444   (2002-08-22 12:51) [12]

Интересно. Я, честно говоря, не пробовал, но может на форме и нельзя рисовать? Посмотри в исходниках, какой там у нее канвас.
Если нет, нужно на нее что нибудь положить (типа PaintBox"a) и передавать ЕГО канвас. В любом случае, ето должен быть канвас того контрола, на котором нужно рисовать. (Я обычно рисую на TPanel или TPaintBox.)


 
Skier ©   (2002-08-22 12:51) [13]

>$hiC0
constructor TDom.Create(ACanvas: TCanvas);
begin
inherited Create;
FCanvas := ACanvas;
end;


 
Извращенец ©   (2002-08-22 12:54) [14]


> $hiC0

Я, как извращенец, могу предложить только извращенские идеи. и чем больше холстов, тем извращеннее способ, тем лучше оправдывается мой ник.


 
$hiC0 ©   (2002-08-22 12:56) [15]

СПАСИБО!!!!!!!!!! Все заработало. Блин точно руки кривые. Алекс, Skier огромное спасибо. Глубокоуважаемый Игорь Шевченко, я от радости даже на Вас не в обиде :)


 
Ekaterina ©   (2002-08-22 12:56) [16]

FCanvas.Ellipse(Dot.x-R,Dot.y-R,Dot.x+R,Dot.y+R); Ошибка здесь(отрицательные числа)


 
Игорь Шевченко ©   (2002-08-22 13:14) [17]

$hiC0 © (22.08.02 12:56)

Вот и славно :-)



Страницы: 1 вся ветка

Текущий архив: 2002.09.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
3-3283
xenon
2002-08-12 19:06
2002.09.02
Импорт из текстового файла в DBF


1-3493
CCCatch
2002-08-21 12:03
2002.09.02
КАК округлить число??


1-3337
shulc
2002-08-20 17:38
2002.09.02
Internal error


7-3635
programmerts
2002-06-20 19:11
2002.09.02
Каким образом можно безболезненно удалить файлы, которые не удаля


6-3535
Slava V.
2002-06-21 13:05
2002.09.02
проверка наличия интернет IP адреса