ich habe jetzt nochmal" idontwantaname" lösung probiert !
Sie läuft besser als "flossinger" lösung allerdins habe ich dennoch ein problem:
ich habe eine obj was auf ein andres liegt z.b.
eine line liegt auf ein viereck dann wird die line nicht mehr erkannt:
Delphi-Quellcode:
function GetLineClickA(x1,y1,x2,y2,x3,y3:Integer):Boolean;
var
// Gegeben
A: TPoint; // Punkt der Geraden
B: TPoint; // Punkt der Geraden
P: TPoint; // Punkt des Mausklicks
// errechnete Werte
g: TPoint; // Richtungsvektor
n: TPoint; // Normalvektor
d: Integer; // d = a*x + b*y
HNF: Double;
begin
a.x:=x1; a.y:=y1;
b.x:=x2; b.y:=y2;
p.x:=x3; p.y:=y3;
g := Point(B.X - A.X, B.Y - A.Y);
n := Point(g.Y, -g.X);
d := n.X * A.X + n.Y * A.Y;
HNF := Abs((n.X * P.X + n.Y * P.Y - d) / Sqrt(n.X * n.X + n.Y * n.Y));
// hier Wert anpassen
if HNF < 20 then
result:=True
// ShowMessage('getroffen')
else
result:=false;
// ShowMessage('daneben');
end;
// verwenden tue ich das hier:
function TmyList.GetItemIndex(x,y:Integer;Obj:TObjectList;state:TShiftState):Integer;
var
i,pIndex:Integer;
r:TRect;
Region: THandle;
begin
pIndex:=-1;
for i:=0 to obj.count-1 do begin
with TPaint2BasesObj(liste.items[i]) do begin
if obj.Items[i] is TLine = false then begin
r.left:=position.x; r.top:=position.y; r.Right:=size.x;r.Bottom:=size.y;
if PtInRect(r,point(x,y)) = true then
pindex:=i;
end
else begin
if (GetLineClickA(position.x,position.y,size.x,size.y,x,y) = true) and (pindex = -1) then
pindex:=i;
end;
end;
end;
if pindex > -1 then begin
selobject:=TPaint2BasesObj(liste.items[pindex]);
itemindex:=pIndex;
end;
writeLn(IntTostr(Pindex));
result:=Pindex;
if pindex > -1 then begin
if ssshift in state then
TPaint2BasesObj(liste.items[pindex]).Sel:=True;
end
else begin
SetSelObj(false);
selobject:=bg;
end;
Region:=0;
// Region
end;
nun die fehler:
bei flossinger function die ich oben gepostet habe habe ich leider folgenden fehler:
ich habe wieder mehre objekte und nun platzier ich linen auf die paintbox.... nun kann ich nur noch die line und das erste objekt auswählen.