Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Du kan bruge OnMouseDown, OnMouseMove og OnMouseUp, dvs. du trykker på shapen og får en OnMouseDown hvor du så starter dit drag. I OnMouseMove sker selve flytningen som så afslutter når du får en OnMouseUp.
Her er lige et forslag til de 3 procedurer, jeg bruger Shapens Tag felt til at gemme x og y værdierne for musens position når drag startes, x gemmes i HiWord og y gemmes i LoWord. De $4000 (bit 15) jeg ligger til når tag sættes er for at fortælle OnMouseMove at vi er i gang med et drag.
procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Shape.Tag and $4000=$4000 then //jep bit 15 er sat hvis true begin Shape.Left:=Shape.Left+(X-HiWord(Shape.Tag)); Shape.Top:=Shape.Top+(Y-LoWord(Shape.Tag)+$4000); end; end;
At kunne resize kræver kun en smule mere kode i ShapeOnMouseMove, her skal du tage højde for de 8 muligheder der findes dvs. NV, N, NØ, Ø, SØ, S, SV, V. Jeg har en ide om hvordan det kan laves rimelig let så hvis du vil kan jeg godt lave et eks.?
Hvis du opretter dem dynamisk og skal bruge procedurene til alle skal der blot en lille ændring til således:
procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TShape).Tag:=((x shl 16)+y) + $4000; end;
procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with (Sender as TShape) do if Tag and $4000=$4000 then //jep bit 15 er sat hvis true begin Left:=Left+(X-HiWord(Tag)); Top:=Top+(Y-LoWord(Tag)+$4000); end; end;
procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TShape).Tag:=0; end;
En anden ting. Hvis du opretter dine shapes at runtime så kunne du jo lave din egen Shape klasse og tilføje nogle Move, resize værdier således at man ikke behøver bruge Tag til at gemme X,Y værdierne i.
Man kan så bruge MoveStartX, MoveStartY til at gemme x,y start værdierne, men hvis det virker fint med Tag og man ikke skal bruge Tag til andet så er der jo ingen grund til det, det skulle da kun lige være for at gøre koden lettere at forstå. Jeg kikker lige på det med trækpunkterne og vender tilbage.
Her har jeg lavet en ny Shape class som kan flyttes og resizes, cursoren ændres sig også afhængig af hvor mus markøren befinder sig, man kan resize shapen på 8 forskellige steder. Du kan så evt. gemme class´en af vejen i en unit.
procedure TMyShape.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var bs : byte; begin if DoMove then begin if MoveMode=0 then // flyt MoveShape(x-MoveStartX,y-MoveStartY);
if MoveMode and 1=1 then // size venstre begin MoveShape(x-MoveStartX,0); SizeShape(-x+MoveStartX,0); end; if MoveMode and 2=2 then // size højre begin SizeShape(x-MoveStartX,0); MoveStartX:=x; end; if MoveMode and 4=4 then // size top begin MoveShape(0,y-MoveStartY); SizeShape(0,-y+MoveStartY); end; if MoveMode and 8=8 then // size bund begin SizeShape(0,y-MoveStartY); MoveStartY:=y; end; exit; end;
MoveMode:=0; bs:=10; // afstand fra kant i pixel if x<bs then MoveMode:=MoveMode+1; // venstre if x>Width-bs then MoveMode:=MoveMode+2; // højre if y<bs then MoveMode:=MoveMode+4; // top if y>Height-bs then MoveMode:=MoveMode+8; // bund; end;
procedure TMyShape.ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin DoMove:=false; end; // *** Slut på koden for TMyShape
procedure TForm1.Button1Click(Sender: TObject); begin with TMyShape.Create(Self) do begin Left:=10; Top:=10; OnMouseDown:=ShapeMouseDown; OnMouseMove:=ShapeMouseMove; OnMouseUp:=ShapeMouseUp; Parent:=Self; end; end;
end.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.