Thema: Delphi auf linen klicken

Einzelnen Beitrag anzeigen

mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#27

Re: auf linen klicken

  Alt 23. Dez 2006, 12:44
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat