Sender, Canvas i klasa niezwiazana z TFORM

0

Mam taki problem, który pewnie dla Was jest banalny (ja dopiero przechodze z
kiedyś nauczonego Turbo Pascala na Delphi:)

Powiedzmy, że piszę sobie małą gierkę typu asteroidy. Obiekt TAstro jest
niezwiązany z TForm1, ale chciałbym by procedure Draw rysowała po canvasie.

TAstro = class
x,y,dx,dy,r:real;
color:integer;
constructor init(x1,y1, r1, col:integer);
procedure Draw(var sender:TForm1);
procedure show;
procedure hide;
procedure DoMove;

  end;

var A: TAstro;

procedura TAstro.Draw rysuje po canvasie: przykładowo:

Sender.Canvas.Ellipse(100,100,200,300);

W tym celu jak widać wyżej w procedurze Draw przekazuje zmienną Sender,
która jest zmienną typu TForm1.
Oczywiscie wszystko jest ok - dopóki w procedurach obsługi Form1 wywołuje
A.Draw(self);
Ale potrzebował bym procedure Draw wywołać w innych procedurach klasy
TAstro - i wtedy jest problem jak określić zmienną sender - jeśli
przypisałbym ją do jakiejś innej zadeklarowanej zmiennej (w klasie TAstro
np. nowa zmienna var Send: Tform1, przypisuje ją w metodzie Draw jako
send:=sender;) to już to niestety nie działa i powoduje błąd podczas
wykonania. Czy jest na to jakiś sposób ? (pewnie bardzo prosty).

pozdr
Krzysiek

0

nie dziala form1.canvas?
przeciez w sekcji VAR (globalne) jest deklarowanie formy.
moze i sie myle....

mozesz tez rysowac po bitmapie (zmiennej) i potem wydac polecenie rysowania jej. (chociazby z timera)

0

form1.canvas.elipse - itp. tez probowałem i wyskakuje exception error przy wykonaniu, pomimo ze form1 jest zadeklarowana globalnie.
Działa poprawnie w przypadku jaki opisałem czyli przekazaniu w parametrze procedury. Chcę po prostu by rozwiązanie było eleganckie i bardziej elastyczne - bo wiem że mogę zrobić to wszystko pod TForm1 i po problemie, ale wolałbym mieć niezalezne procedury i kazdy 'asteroid' inicjować jako obiekt by "żył własnym życiem" :)

0

Próbowalem też starych sztuczek z turbo pascala, czyli zaadresowanie bezpośrednie np. var send:pointer, send:=^sender albo send:=@sender; no ale tak w windowsie sie juz chyba nie da robic i rowniez generuje bład

0
// w deklaracji klasy :
procedure Draw(plotno : TCanvas);


procedure Draw(plotno : TCanvas);
begin
     plotno.Ellypse(cośtam);
end;


// w timerku czy gdzie tam chcesz:
asteroida.Draw(form1.canvas);
0

No tak mniej wiecej zrobiłem na początku...ale nie o to chodzi - gdyz metoda draw wywołana np. w timerku jest ok, mnie chodzi o to ze chciałbym wywołać metodę draw wewnątrz innej metody klasy TAstro - i wtedy jest problem z przekazaniem parametru.....

Na pl.comp.lang.delphi dostalem taką odpowiedz:

"Należy dodać właściwość
property CanvasParent;
oraz zmienną prywatną FCanvasParent: TForm;
i przypisywać przez SetCanvasParent() odczytywać GetCanvasParent: TForm;
czyli standardowe pisanie komponentów. Od tego czasu będziesz miał dostęp w
ramach całej klasy do aktualnie podłączonej formy."

no ale musze to jeszcze zrozumiec:)

0

Nie wiem, czy to jest to o co chodzi, ale ja bym zrobił tak:
....
AstroOwner: TObject;
constructor Create(.... Owner: TObject);
....
constructor TAstro.Create(... Owner: TObject);
...
begin
AstroOwner:=Owner;
...

i potem Draw(Owner);
Coś w tym stylu, mam nadzieję, że zrozumiesz, o co chodzi...

[dopisane]
Zerknij do artykułu jeśli się nie mylę Adama Boducha o tworzeniu komponentów dostępnego na 4prog. w dziale Delphi->Artykuły

1 użytkowników online, w tym zalogowanych: 0, gości: 1