[Delphi] Przesuwanie dynamicznie utworzonych ksztaltów

0

Witam,
Mam nastepujacy problem z ktorym nie daje sobie samemu rady. Po każdym kliknięciu Lewym Przyciskiem Myszy generuje dynamicznie kształt (Wykorzystujac TShapes) w postaci elipsy. Po wygenerowaniu np. 8 takich obiektów chcialbym móc zaznaczyc dowolny z nich i (przez przytrzymanie LPM) przeniesc go o dowolna odleglosc.

To samo próbuje osiągnać za pomoca TCanvas, co widac w kodzie. Rysuje elipse, zapamietuje w tablicy wspolrzedne a nastepnie przy ponownym rysowaniu przerysowuje poprzednie (poniewaz funkcja repaint czysci plotno) jednak w tu takze nie mam pojcia jak pozniej zaznaczac te obiekty i nimi operowac.

W jaki sposob to zrobic ? Jak rozpoznac NAD KTÓRĄ z elips wskaźnik myszy sie znajduje ? I jak skorzystac ze zdarzenia OnMouseDown przy dynamicznym tworzeniu elipsy.

Oto kod programu:

type
Twspolrzedne = record {to zapamieuje wspolrzedne}
X_pocz,
Y_pocz,
X_Konc,
Y_Konc : integer;
end;
TElipsa = array [1..100] of Twspolrzedne;
TForm1 = class(TForm)
czytaj: TButton;
Button2: TButton;
Memo1: TMemo;
PaintBox1: TPaintBox;
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
wspolrzedne : Twspolrzedne;
tablica : Telipsa;
MD, ruch: Boolean;
P : TPoint;
X1,X2,X3,X4,X5 : Integer;
Y1, Y2, Y3, Y4, Y5 : integer;
i: integer;
elipsa : TShape;
xa,ya : integer;
implementation

{$R *.dfm}

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Xa := Xa + 20;
Ya := Ya + 40;
MD := True;
GetCursorPos(p);
elipsa := TShape.Create(Self);
elipsa.Parent := Self;
elipsa.Shape := stEllipse;
elipsa.top := Xa;
elipsa.left := Ya;
elipsa.Visible := true;
// elipsa.OnMouseDown
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := False;
if ruch then
begin
tablica[i].X_Pocz := P.X ;
tablica[i].Y_Pocz := P.Y ;
tablica[i].X_Konc := X ;
tablica[i].Y_Konc := Y ;
ruch := false;
end;
i := i+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MD := False;
ruch := False;

end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
j: integer;
begin

if i <> 0 then
begin
for j := 0 to i-1 do
begin
paintbox1.Canvas.Brush.Style := bsCross;
paintbox1.Canvas.Pen.Style := psDot;
paintbox1.Canvas.ellipse(tablica[j].X_Pocz,tablica[j].Y_Pocz, tablica[j].X_Konc , tablica[j].Y_Konc);
end;
end;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MD then
begin
ruch := true;
repaint;
DoubleBuffered := true;
paintbox1.Canvas.Brush.Style := bsCross;
paintbox1.Canvas.Pen.Style := psDot;
paintbox1.Canvas.ellipse(P.X, P.Y, X,Y);
end;
end;

end.

0

ja bym myślał coś takiego:
Przy rysowaniu kolejnych obiektów nadawaj im jakiś priorytet widoczności.
Przykładowo:
rysujesz jeden obiekt-nadajesz 1;
rysujesz 2 obiekt nadajesz 2 itd;
ten o wyzszej liczbie jest zawsze wyzej niz ten o nizszej(jest pod nim) bo byl rysowany pozniej.
Teraz: po kliknięciu w jakiś obiekt sprawdzasz do ktorego obiektu pasują wspolrzedne klikniecia(z matematyki). Jesli obiekty nie maja pól wspolnych to prosciej(bo zwroci 1 wynik) i po prostu przerysujesz sobie go. Ale jesli np 3 obiekty spelniaja warunek klikniecia to(ten staje sie aktywny) przesuwasz(przemalowjesz) tylko ten o najwyzszym numerze (z tych ktore spelniaja warunek)
Czy jakos tak ;) Ma to wiele niedociagniec ale cos w tym rodzaju bym zrobil na poczatek

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