![]() |
Mehrer objekte gleichzeig verschieben auf einer Paintbox
Hallo,
ich habe eine programm geschrieben was unterschiedliche viele objekte verwalten kann und anzeigen kann das geht auch soweit ganz gut. das problem ist dabei: jetzt möchte ich mehrer objekte gleichzeig verschieben(wie in delphi auch) nur dabei kommt es zum starken flackern. ich zeichne in ein buffer, das verschieben von einem objekt geht prima nur das verschieben mit merhen objekten geht nicht ! hier ist der code bei if ssleft in Shift then begin fängt das verschieben an
Delphi-Quellcode:
ich hoffe das mir einer sagen kann wie ich diese problem lösen kann.
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); var i:integer; oldpos:TPoint; begin if objlist.itemindex > -1 then begin if ssCtrl in Shift then begin TPaint2Obj(objList.objList[objlist.itemindex]).Size:=Point(x-mx,y-my); objList.DrawObj; end else begin if ssleft in Shift then begin for i:=0 to objlist.objList.Count-1 do begin if (TPaint2Obj(objList.objList[i]).Sel = true) or (objlist.ItemIndex = i) then begin with TPaint2Obj(objList.objList[i]) do begin if (position.x = 0) or (position.y = 0) then position:=Point(x,y); if x-position.x > -1 then oldpos.x:=x+(x-position.x); else oldpos.x:=x-(position.x-x); if y-position.y > -1 then oldpos.Y:=y-(y-position.y); else oldpos.Y:=y+(position.y-y); Position:=Point(oldpos.X,oldpos.Y); objList.DrawObj; end; end; end; end; // objList.DrawObj; end; end; end; ich glaube ich weiß die ursache und zwar gehe ich davon aus das es an die else anweisungen liegt und da immer wieder hinundher geschaltet wird, nur wie behbe ich diese bug ? |
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
|
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
ich habe mir die drei beiträge angesehen die sich dagefunden habe, aber ich glaube das ist doch ehrehr eine funktion für Trehands oder ?
mir ist für mein problem noch eine andere lösung eingefallen evlt. klappt es so: ich ermittele das objekt was am dichdisten dran ist x und y position gesehen und die ziehe ich dann von allen objekten ab... Normalerweise müsten sich dann doch die objekte verscheieben ohne dabei das muster zu vielieren oder ? |
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
ich habe mir gedacht wenn ich die entferngung zum obejkt berechne was am dichtesten am makierten objekt dran und dann die werte von alle makierten objekten abziehe müste es doch eigentlich klappen oder nicht ?
aber es geht leider nicht hier ist der qullcode:
Delphi-Quellcode:
Wenn ich jetzt die entfernung habe muss sie ja entwder abgezogen oder dazuaddiert werden oder ?
function GetDiffObj(obj:TObjectList;x,y,index:Integer):TPoint;
var i:Integer; v:TPoint; begin v.X:=0; v.Y:=0; for i:=0 to obj.Count-1 do begin if i <> index then begin with TPaint2Obj(obj.items[i]) do begin if position.X > v.X then v.x:=Position.x; if position.y > v.y then v.y:=Position.y; end; end; end; with TPaint2Obj(obj.items[index]) do begin if v.x > x then v.x:=(v.x+size.x)-x else v.x:=x-v.x; if v.y > y then v.y:=size.y+(v.y-y) else v.y:=y-v.y; end; result:=v; end; for i:=0 to objlist.objList.Count-1 do begin if (TPaint2Obj(objList.objList[i]).Sel = true) then begin with TPaint2Obj(objList.objList[i]) do begin if objlist.ItemIndex <> i then begin if position.x-oldpos.x > -1 then oldpos.X:=position.x-oldpos.x else oldpos.X:=position.x+oldpos.x; if position.y-oldpos.y > -1 then oldpos.y:=position.y-oldpos.y else oldpos.y:=position.y+oldpos.y; caption:=IntTostr(oldpos.x) + '\' + IntTostr(oldpos.Y); Position:=Point(oldpos.X,oldpos.Y); end else Position:=Point(X,Y); und wen nich jetzt ein objekt verschiebe und mehrer makiert habe springen sie wild durcheinander warum ? |
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
1. lege dir eine Variable oldpos an, welche nicht lokal ist sondern in der Form deklariert ist.
2. Im MouseDown und mit ssLeft in ShitState speicherst du die X und Y Koordinaten in oldpos 3. Im MouseMove berechnest du die Differenz von der aktuellen X und Y Koordinate zu den in oldpos 4. Diese Differenz addierst du allen selektierten Elementen auf ihre Koordinaten 5. Am Ende in MouseMove legst du die aktuellen X und Y Werte in die oldpos Variable ab. @EWeiss: Was wolltest du mit deiner Aussage erreichen? Bzw. wie sollte dies weiterhelfen? |
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
vielen dank für deine antwort doch leider geht es immer noch nicht sorecht:
die objekte springen bzw. das muster der objekte verändert sich. ich habe mich an deinen anweinsungen gehlaten:
Delphi-Quellcode:
Shift: TShiftState; X, Y: Integer);
begin startChange:=True; objList.itemindex:=objlist.GetItemIndex(x,y,objlist.objList,shift); Checklistbox1.itemindex:=objList.itemindex; mx:=x; my:=y; oldpos.x:=x; oldpos.Y:=y; if objList.itemindex =-1 then if ListBox1.itemindex > 0 then if ssLeft in Shift then begin objList.AddObj(ListBox1.itemindex-1,mx,my,20,20,''); end; objList.DrawObj; end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var i,dx,dy:integer; begin if objlist.itemindex > -1 then begin if ssCtrl in Shift then begin TPaint2Obj(objList.objList[objlist.itemindex]).Size:=Point(x-mx,y-my); objList.DrawObj; end else begin if ssleft in Shift then begin oldpos:=GetDiffObj(objlist.objList,x,y,objlist.ItemIndex); for i:=0 to objlist.objList.Count-1 do begin if (TPaint2Obj(objList.objList[i]).Sel = true) then begin with TPaint2Obj(objList.objList[i]) do begin if objlist.ItemIndex <> i then begin // if position.x-oldpos.x > -1 then dx:=position.x-oldpos.x; // else // dx:=oldpos.x-position.x; // if position.Y-oldpos.y > -1 then dy:=position.Y-oldpos.y; // else // dy:=oldpos.y-position.Y; position:=Point(dx+x,dy+y); caption:=IntTostr(dx) + '\' + IntTostr(dY); end else Position:=Point(X,Y); objList.DrawObj; end; end; end; end; // objList.DrawObj; end; end; oldpos.x:=x; oldpos.y:=y; in position wird nur die position gepseichert also nicht die objekte größe ! die wird in size gepseichert und es auch ein Tpoint |
Re: Mehrer objekte gleichzeig verschieben auf einer Paintbox
habe den fehler gefunden hier mein code:
Delphi-Quellcode:
schuld war dran das über der foschleife noch was stand.... und das die differtanz in der schleife berechnet wurde ist !
if objlist.itemindex > -1 then begin
if ssCtrl in Shift then begin TPaint2Obj(objList.objList[objlist.itemindex]).Size:=Point(x-mx,y-my); objList.DrawObj; end else begin if ssleft in Shift then begin dx:=x-oldpos.x; dy:=Y-oldpos.y; for i:=0 to objlist.objList.Count-1 do begin if (TPaint2Obj(objList.objList[i]).Sel = true) then begin with TPaint2Obj(objList.objList[i]) do begin if objlist.ItemIndex <> i then begin caption:=IntTostr(dx) + '\' + IntTostr(dY); position:=Point(dx+position.x,dy+position.y); end else Position:=Point(X,Y); objList.DrawObj; end; end; end; end; // objList.DrawObj; end; end; oldpos.x:=x; oldpos.y:=y; vielen dank für diesen hilfreichen tipp ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz