![]() |
Shape soll Form nicht überschreitten.
Guten Abend.
Ich habe ein einfaches Shape welches sich mit der Maus steuern lässt. Dabei spielt für mich nur die Vertikale Bewegung eine Rolle und das klappt auch alles. Allerdings soll es nicht clientheight überschreitten oder oben, über die Form gehen. Ich hab schon vieles probiert, aber nichts davon klappte richtig. Eure Vorschläge bitte :-D |
AW: Shape soll Form nicht überschreitten.
Wäre nett, wenn du uns sagst, was du alles schon probiert hast. Wir wollen dich ja hier nicht langweilen.
|
AW: Shape soll Form nicht überschreitten.
Zitat:
Also wir haben ein Rechteck "Form" mit den Punkten (A,B,C,D) mit A(Ax,Ay) und C(Cx,Cy). Und wir haben ein Rechteck "Shape" mit den Punkten (EFGH) mit E(Ex,Ey) und G(Gx,Gy). Wenn wir Form als Bezugssystem nehmen ist Ax=0 und Ay=0 und Cx und Cy Konstanten Innerhalb welcher Werte darf sich Ex bewegen? Wenn du mir das sagen kannst, kann ich dir dein Problem lösen. |
AW: Shape soll Form nicht überschreitten.
Zitat:
Ex soll sich garnicht bewegen, nur Ey. Dafür hab ich schon selbst gesorgt. Die Bewegung des Shapes wird mit der Maus gesteuert, wobei nicht E(x/y) der Punkt ist an den der Mauscursor hängt, sondern die Hälfte der Höhe des Shapes. Wenn ich die Maus jetzt hoch zieh zu der Linie zwischen A und B(X-Achse), verschwindet das shape zur Hälfte. Unten bei der Linie von C und D ist es dann die andere Hälfte. Also E und F sollen A bis B nicht überschreitten und G und H sollen C bis D nicht überschreitten. |
AW: Shape soll Form nicht überschreitten.
Du hast doch einfach 2 Randbedingungen die zu behandeln sind.
Delphi-Quellcode:
GetCursorPos(mouseposition);
if mouseposition.y < Form.top then //Rand oben Shape.top := 0 else if mouseposition.y > Form.top + Form.clientheight-Shape.height then //Rand unten shape.top := Form.clientheight-Shape.height else shape.top := mouseposition.y-Form.top; //innerhalb des vorgesehenen Wertebereichs. |
AW: Shape soll Form nicht überschreitten.
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
Gruß
type
TForm1 = class(TForm) Shape1: TShape; procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private FMouseX : Integer; FMouseY : Integer; function GetShapeLeft (const X : Integer) : Integer; function GetShapeTop (const Y : Integer) : Integer; procedure SetMouseXY (const X, Y : Integer); end; implementation procedure TForm1.FormCreate(Sender: TObject); begin SetMouseXY (-1, -1) end; procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetMouseXY (X, Y); end; procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if FMouseX = -1 then Exit; Shape1.Left := GetShapeLeft (X); Shape1.Top := GetShapeTop (Y); end; procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetMouseXY (-1, -1) end; function TForm1.GetShapeLeft (const X : Integer) : Integer; begin Result := 0; if X < 0 then Exit; if Shape1.Left - FMouseX + X < 0 then Exit; if Shape1.Left + Shape1.Width + X - FMouseX > ClientWidth then Result := ClientWidth - Shape1.Width else Result := Shape1.Left - FMouseX + X end; function TForm1.GetShapeTop (const Y : Integer) : Integer; begin Result := 0; if Y < 0 then Exit; if Shape1.Top - FMouseY + Y < 0 then Exit; if Shape1.Top + Shape1.Height + Y - FMouseY > ClientHeight then Result := ClientHeight - Shape1.Height else Result := Shape1.Top - FMouseY + Y end; procedure TForm1.SetMouseXY (const X, Y : Integer); begin FMouseX := X; FMouseY := Y end; |
AW: Shape soll Form nicht überschreitten.
Zitat:
Delphi-Quellcode:
Für die untere Kante jedenfalls. Die Maus ist jetzt komischerweise ein Stück über dem Shape. Das heisst, wenn ich sie hochziehe, kommt das Shape nie ganz oben an, da die Maus die Form verlässt.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin shape1.top:= screentoclient (mouse.CursorPos).Y - shape1.Height div 2; if mouse.cursorpos.y < Form1.top then Shape1.top := 0 else if mouse.cursorpos.y > Form1.top + Form1.clientheight-Shape1.height then shape1.top := Form1.clientheight-Shape1.height else shape1.top := mouse.CursorPos.y-Form1.top; end; Habs jetzt. Vielen Dank nochmal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 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-2025 by Thomas Breitkreuz