Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Shape soll Form nicht überschreitten. (https://www.delphipraxis.net/175433-shape-soll-form-nicht-ueberschreitten.html)

Aboz1 20. Jun 2013 20:55

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

Uwe Raabe 20. Jun 2013 21:59

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.

QuickAndDirty 20. Jun 2013 22:25

AW: Shape soll Form nicht überschreitten.
 
Zitat:

Zitat von Aboz1 (Beitrag 1219275)
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

Kanst du das Problem bitte mathematisch beschreiben.

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.

Aboz1 21. Jun 2013 00:12

AW: Shape soll Form nicht überschreitten.
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1219285)

Kanst du das Problem bitte mathematisch beschreiben.

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.

Ich hoffe ich hab das richtig verstanden.
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.

QuickAndDirty 21. Jun 2013 01:46

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.

Volker Z. 21. Jun 2013 02:09

AW: Shape soll Form nicht überschreitten.
 
Hallo,

Zitat:

Ich habe ein einfaches Shape welches sich mit der Maus steuern lässt.
Wie du das machst wäre schon interessant.

Zitat:

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
Naja, mit Deinen Vorgaben nicht leicht, aber vielleicht hilft Dir folgendes weiter:

Delphi-Quellcode:
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;
Gruß

Aboz1 21. Jun 2013 16:29

AW: Shape soll Form nicht überschreitten.
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1219295)
Du hast doch einfach 2 Randbedingungen die zu behandeln sind.

Es klappt,tausend Dank. So sieht mein Quelltext aus
Delphi-Quellcode:
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;
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.

Habs jetzt. Vielen Dank nochmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz