Thema: Delphi Rechteck verschieben

Einzelnen Beitrag anzeigen

delphicoder123

Registriert seit: 14. Feb 2019
102 Beiträge
 
#1

Rechteck verschieben

  Alt 15. Jun 2019, 11:11
Ich möchte ein Programm erstellen, indem man ein Rechteck an beliebiger Stelle im Formular verschieben kann.
Nach dem Verschieben, soll das alte Rechteck verschwinden.
Mir ist klar, dass ich noch einiges zu implementieren und zu bearbeiten habe.

Zu meinem Code habe ich aktuell folgende Fragen:


1) Warum wird beim FormCreate kein Rechteck angezeigt? Beim Button1 Click Event, wird das Rechteck angezeigt, obwohl es derselbe Code ist.
2) In der Funktion rechteckGetroffen erkennt er, die Variablen x1,x2,y1,y2 nicht. Warum ist das so?
3) Mit Mouse.CursorPos.X und Mouse.CursorPos.Y möchte ich herausfinden, ob sich die Maus im Rechteck befindet.
Wenn ich den Wert, von Mouse.CursorPos.X/Mouse.CursorPos.Y abfrage, erhalte ich jedesmal einen unterschiedlichen Wert. Was mache ich falsch?
4) Über jeden weiteren Tip, bin ich auch dankbar


Das ist mein Code:

Code:
unit unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, rechteck;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  rechteck1 : TRect;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
//var TheRect: TRect;
begin
  {TheRect := Rect(10,10,100,100);
  paintbox1.Canvas.Brush.Color := clBlack;
  paintbox1.Canvas.FrameRect(TheRect);}
  rechteck1:=TRect.erzeugen(10, 10, 100, 100, clred, form1);
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
  rechteck1:=TRect.erzeugen(10, 10, 100, 100, clred, form1);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  rechteck1.anfassen;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  rechteck1.ziehen;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  rechteck1.loslassen;
end;

end.
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
  TRect = class(TObject)

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

  public
    constructor erzeugen(b1,h1,b2,h2: Integer; co: TColor; f:TForm);
    procedure zeichnen;
    procedure anfassen;
    procedure ziehen;
    procedure loslassen;
end;



implementation

constructor TRect.erzeugen;
begin
  z:=0;
  f.Color:=clwhite;
  x1:=b1;
  x2:=b2;
  y1:=h1;
  y2:=h2;
  cvs:=f.Canvas;
  //cvs.Pen.Mode:= pmXOR;
  //clr:= co XOR clWhite;
  zeichnen;
end;

procedure TRect.zeichnen;
begin
  with cvs do
    begin
      Pen.Color:=clred;
      Rectangle(x1,y1,x2,y2);
      MoveTo(Mouse.CursorPos.X, Mouse.CursorPos.Y);
    end;
end;

function rechteckGetroffen: Boolean;
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 }
      result:=false;

end;

procedure TRect.ziehen();
begin
  if z=0 then
      exit
    else
      begin
        zeichnen;
      end;
end;

procedure TRect.loslassen;
begin
  z:=0;
end;

procedure TRect.anfassen;
begin
   if rechteckGetroffen then
    z:=1;
end;

end.
  Mit Zitat antworten Zitat