Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Rechteck verschieben (https://www.delphipraxis.net/201012-rechteck-verschieben.html)

delphicoder123 16. Jun 2019 09:49

AW: Rechteck verschieben
 
Könntet ihr mir bei folgenden Punkten noch helfen:

1) Wie überprüfe ich, ob die Maus innerhalb vom Rechteck ist? Mit welcher Methode?
2) Wenn der User die Maus loslässt, dann brauche ich zu diesem Zeitpunkt die Koordinaten der Maus im Formular. Wie bekomme ich diese? Mit welcher Methode?

peterbelow 16. Jun 2019 15:10

AW: Rechteck verschieben
 
Zitat:

Zitat von delphicoder123 (Beitrag 1434726)
Könntet ihr mir bei folgenden Punkten noch helfen:

1) Wie überprüfe ich, ob die Maus innerhalb vom Rechteck ist? Mit welcher Methode?
2) Wenn der User die Maus loslässt, dann brauche ich zu diesem Zeitpunkt die Koordinaten der Maus im Formular. Wie bekomme ich diese? Mit welcher Methode?

Der OnMouseUp-Event bringt die Koordinaten der Maus mit, schon auf Clientkoordinaten umgerechnet.

Du hast leider den Fehler gemacht, deine Rechteck-Klasse TRect zu nennen. Dadurch hast Du einen Namenskonflikt mit dem Delphi-Typ TRect aus der Unit System.Types. Das ist ein Record mit vielen nützlichen Methoden, darunter

Delphi-Quellcode:
 function Contains(const Pt: TPoint): Boolean; overload;
Siehe http://docwiki.embarcadero.com/Libra...em.Types.TRect

delphicoder123 16. Jun 2019 16:51

AW: Rechteck verschieben
 
Mit ClientToScreen und ScreenToClient bekomme ich also die Koordinaten der Maus.
Screen Koordinaten sind wahrscheinlich Koordinaten auf dem Bildschirm?
Und was sind Client Koordinaten?

Luckie 16. Jun 2019 17:42

AW: Rechteck verschieben
 
Rat mal. Oder guck in der Hilfe.

Was bleibt denn noch übrig? Richtig das übergeordnete Fenster.

delphicoder123 16. Jun 2019 21:13

AW: Rechteck verschieben
 
Zitat:

Zitat von EWeiss (Beitrag 1434718)
Zitat:

Ich brauche aber einen Rückgabewert.
Delphi-Quellcode:
procedure MeineProcedure(Test: string; var MeineRückgabeinderProcedure: Integer);
begin
  if Test <> '' then
    MeineRückgabeinderProcedure := 10;
end;
Du siehst also um eine Rückgabe zu erhalten benötigt man nicht in jedem fall eine Funktion.
var ist das Schlüsselwort vor MeineRückgabeinderProcedure.

Ob er jetzt das als Methode meint keine Ahnung.

Oder wie in deinem Beispiel.
Delphi-Quellcode:
procedure rechteckGetroffen(var Getroffen: BOOL);
 begin
   if (Mouse.CursorPos.X > x1) AND (Mouse.CursorPos.X < x2) AND
       (Mouse.CursorPos.Y > y1) AND (Mouse.CursorPos.Y < y2) then
       Getroffen:=true
     else
       Getroffen:=false;

 end;
Delphi-Quellcode:
procedure TRect.anfassen;
var
 FGetroffen: BOOL;
begin
   rechteckGetroffen(FGetroffen);
   if FGetroffen then
     z:=1;
end;
gruss


Ich habe aus der Funktion eine Prozedur gemacht. Trotzdem werden die Variablen x1,x2,y1 und y2 nicht erkannt

Code:
procedure rechteckGetroffen(var getroffen: Bool);
begin
  if (Mouse.CursorPos.X > x1) AND (Mouse.CursorPos.X < x2) AND
      (Mouse.CursorPos.Y > y1) AND (Mouse.CursorPos.Y < y2) then
      result:=true
    else
      getroffen:=false;

end;

Luckie 16. Jun 2019 21:35

AW: Rechteck verschieben
 
Wo sind sie denn deklariert?

delphicoder123 16. Jun 2019 21:39

AW: Rechteck verschieben
 
Sind als private-Variablen deklariert

Code:
unit rechteck;

interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
  TRechteck = class(TObject)

  private
  z:Integer; // Zustand (0,1)
  x1,x2,y1,y2: Integer;
  clr: TColor;
  cvs: TCanvas; // Zeichenfläche
  formular: TForm;

Luckie 16. Jun 2019 22:12

AW: Rechteck verschieben
 
Deine Procedure ist aber keine Methode deiner Klasse. Du solltest dich mal mit den Grundlagen der Objektorientierten Programmierung unter vertraut machen.

EWeiss 16. Jun 2019 22:17

AW: Rechteck verschieben
 
Du musst deine Procedure und oder Function in deine Klasse packen..


Delphi-Quellcode:
  TRechteck = class(TObject)

   private
     z:Integer; // Zustand (0,1)
     x1,x2,y1,y2: Integer;
     clr: TColor;
     cvs: TCanvas; // Zeichenfläche
     procedure rechteckGetroffen(var getroffen: Bool); // <<< Hier gehört die rein!!!
   public
   
   end;
Das ergebniss ist dann

Delphi-Quellcode:
procedure TRechteck.rechteckGetroffen(var getroffen: Bool);


Und nicht...
Delphi-Quellcode:
procedure rechteckGetroffen(var getroffen: Bool);

TIP: Rechte maustaste auf die Class und dann im Menu auf "complete class at Cursor" und da dann dein Zeugs rein!

Damit hast du keinen zugriff auf die Koordinaten die in deiner Klasse definiert sind.
Zitat:

Trotzdem werden die Variablen x1,x2,y1 und y2 nicht erkannt
Du kannst nicht auf eine private Eigenschaft von TRechteck zugreifen wenn du kein Member von TRechteck bist.
Das bist du erst dann wenn du deine Procedure dort einlagerst.

Delphi-Quellcode:
procedure rechteckGetroffen(var getroffen: Bool);
 begin
   if (Mouse.CursorPos.X > x1) AND (Mouse.CursorPos.X < x2) AND
       (Mouse.CursorPos.Y > y1) AND (Mouse.CursorPos.Y < y2) then
       result:=true
     else
       getroffen:=false;

 end;
Das ist auch falsch wenn schon dann beide Rückgaben "getroffen" nicht einmal Result und einmal getroffen
Verwende bitte in Zukunft die Delphi Tags im Forum Editor das ist das Icon mit dem Delphi Symbol nicht das Code(C++) Symbol.

gruss

delphicoder123 17. Jun 2019 08:04

AW: Rechteck verschieben
 
Bei mir wird beim onmouseDown Event folgender Code ausgeführt:
"formular" ist eine private Variable.
Warm bekomme ich immer noch die falschen koordinaten wenn ich innerhalb vom Rechteck bin?
Delphi-Quellcode:
function TRechteck.rechteckGetroffen(): Boolean;
var
  pt: TPoint;
begin
    pt:= Mouse.CursorPos;
    {if (formular.ScreenToClient(Mouse.CursorPos).X >= x1) AND (formular.ScreenToClient(Mouse.CursorPos).x <= x2) AND
      (formular.ScreenToClient(Mouse.CursorPos).Y >= y1) AND (formular.ScreenToClient(Mouse.CursorPos).Y <= y2) then
      result:=true
    else
      result:=false;  }

    pt := formular.screenToClient(pt);
    if (pt.X >= x1) AND (pt.x <= x2) AND
      (pt.Y >= y1) AND (pt.Y <= y2) then
      result:=true
    else
      result:=false;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Seite 2 von 4     12 34      

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