Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MouseDown, ..Up, ..Move einer Klasse hinzufügen? (https://www.delphipraxis.net/152179-mousedown-up-move-einer-klasse-hinzufuegen.html)

moelski 14. Jun 2010 12:50

Delphi-Version: 2010

MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Moin !

Ich habe da eine sehr primitive Klasse:
Delphi-Quellcode:
{$M+}
unit Recty;

interface

uses Classes, Graphics;

type
 TRecty = Class
   private
     FX, FY,                    // X, Y Position (Left Top)
     FW, FH        : Integer;  // Width, Height
     FScale        : Double;   // Scaling ...
     FCanvas       : TCanvas;
   published
     constructor Create();

     procedure Draw;

     property X     : Integer read FX      write FX;
     property Y     : Integer read FY      write FY;
     property W     : Integer read FW      write FW;
     property H     : Integer read FH      write FH;
     property Scale : Double  read FScale  write FScale;
     property Canvas : TCanvas read FCanvas write FCanvas;
 end;

implementation

constructor TRecty.Create();
begin
  inherited;
  Scale := 1.0;
end;

procedure TRecty.Draw;
begin
  FCanvas.Rectangle(Trunc(X  ),
                    Trunc(Y  ),
                    Trunc((X+W) * Scale),
                    Trunc((Y+H) * Scale));
end;

end.
Ich würde gerne dieser Klasse Funktionen wie OnMouseMove, OnMouseDown, ... geben. Kann mir jemand einen Tip geben wie man das am besten anstellt?
Ich kann zwar in meinem Formular wo ich zeichne die entsprechenden Funktionen hinterlegen, aber ich fände es eleganter wenn das die Klasse (sofern das geht) selber übernimmt.
Ziel soll es erstmal sein, dass ich mit gedrückter Maustaste das Rechteck verschieben kann.

SirThornberry 14. Jun 2010 12:53

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
da deine Klasse von TObject abgeleitet wurde und somit nicht selbst Nachrichten empfängt etc. ist das nicht möglich.

DeddyH 14. Jun 2010 12:54

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Ich würde an Deiner Stelle von TGraphicControl oder TCustomControl ableiten, dann musst Du das Rad nicht neu erfinden. Zumindest muss Deine Klasse aber in der Lage sein, Botschaften zu empfangen.

[edit] Einen Hauch zu spät :? [/edit]

moelski 14. Jun 2010 12:55

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Was müsste ich denn umbauen um die entsprechenden Nachrichten abfangen zu können?

DeddyH 14. Jun 2010 12:56

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Zitat:

Zitat von DeddyH (Beitrag 1028735)
Ich würde an Deiner Stelle von TGraphicControl oder TCustomControl ableiten, ...

Schon versucht?

moelski 14. Jun 2010 13:20

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Moin !

Zitat:

Schon versucht?
Ja. Habe meine Klasse jetzt so abgeleitet:
Delphi-Quellcode:
TRecty = Class(TGraphicControl)
Habe dann aber 2 neue Fragen ...

1) OnMouseMove (u.a.) ist protected. Muss ich das dann als Property in meiner eigenen Klasse definieren?
2) Die Klasse TGraphicControl hat eine Methode Paint. Übernimmt die für mich das Zeichnen? Wenn ja, muss ich die vermutlich mit einer eigenen Methode überschreiben, oder?

DeddyH 14. Jun 2010 13:31

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Du musst die Ereignisse nur noch in den public- oder published(wenn Komponente)-Abschnitt verschieben. Und richtig, die Paint-Methode ist der richtige Angriffspunkt, die musst Du überschreiben.

[edit] Das sollte dann ungefähr so aussehen:
Delphi-Quellcode:
TRecty = Class(TGraphicControl)
  ...
protected
  procedure Paint; override;
public
  property OnMouseMove;
  property OnMouseDown;
  ...
end;

...

procedure TRecty.Paint;
begin
  inherited;
  //Dein Code
end;

uligerhardt 14. Jun 2010 14:36

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
<ot mode="klugscheiss">Wäre statt dem
Zitat:

Zitat von moelski (Beitrag 1028732)
Delphi-Quellcode:
     FX, FY, // X, Y Position (Left Top)
     FW, FH : Integer; // Width, Height

nicht das
Delphi-Quellcode:
     FLeft, FTop,
     FWidth, FHeight: Integer;
besser?
</ot>

DeddyH 14. Jun 2010 18:15

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Ist ja jetzt gar nicht mehr nötig, da automatisch geerbt. ;)

uligerhardt 14. Jun 2010 18:38

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Zitat:

Zitat von DeddyH (Beitrag 1028848)
Ist ja jetzt gar nicht mehr nötig, da automatisch geerbt. ;)

Stümmbt natürlich. :mrgreen:

moelski 17. Jun 2010 08:03

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Moin !

Irgendwas fehlt da noch, denn gezeichnet wird noch nix.
Meine Klasse:
Delphi-Quellcode:
{$M+}
unit Recty;

interface

uses Classes, Graphics, Controls;

type
 TRecty = Class(TGraphicControl)
   private
     FX, FY,                    // X, Y Position (Left Top)
     FW, FH        : Integer;  // Width, Height
     FScale        : Double;   // Scaling ...
   protected
     procedure Paint; override;
   published
//     constructor Create();

     property X     : Integer read FX      write FX;
     property Y     : Integer read FY      write FY;
     property W     : Integer read FW      write FW;
     property H     : Integer read FH      write FH;
     property Scale : Double  read FScale  write FScale;

//     Property OnMouseMove;
 end;

implementation

procedure TRecty.Paint;
begin
  inherited;
  Scale := 1;
  Canvas.Rectangle(Trunc(X  ),
                   Trunc(Y  ),
                   Trunc((X+W) * Scale),
                   Trunc((Y+H) * Scale));
end;

end.
Und so erzeuge ich eine Instanz (Items : array of TRecty):
Delphi-Quellcode:
  Items[ID] := TRecty.Create(Form1);
  Items[ID].Scale := 1;
  Items[ID].X := 10;
  Items[ID].Y := 10;
  Items[ID].W := 30;
  Items[ID].H := 30;
//  Items[ID].OnMouseMove := nil;
  Items[ID].Repaint;
  Canvas.Refresh;
Bei dem Paint komme ich allerdings nie an. :gruebel:

SirThornberry 17. Jun 2010 08:11

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Du hast keinen Parent angegeben und auch die Größe und Position (Left, Top, Width, Height) nicht gesetzt.
Zu dem kannst du x,y,w,h weg lassen da visuelle Komponenten bereits die Properties für Größe und Position besitzen:
Delphi-Quellcode:
yourComponent := TYourComponent.Create(Nil_Or_wanted_Owner);
yourComponent.Parent := your_wanted_parent;
yourComponent.setbounds(0, 0, 250, 250);
Und im überschriebenen Paint brauchst du natürlich dann nicht x,y,w und h zu verwenden sondern einfach nur breite und höhe.

moelski 17. Jun 2010 08:20

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Moin !

Delphi-Quellcode:
Items[ID].Parent := Form1;
Ich dachte das würde mit dem Create direkt übergeben mittels Owner, aber ok. Falsch gedacht.

Delphi-Quellcode:
Items[ID].setbounds(0, 0, 250, 250);
Ok, da wäre ich nie drauf gekommen.

Damit setzte ich den Bereich in dem gezeichnet werden kann, richtig?

uligerhardt 17. Jun 2010 09:07

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Zitat:

Zitat von moelski (Beitrag 1029554)
Delphi-Quellcode:
Items[ID].setbounds(0, 0, 250, 250);
Ok, da wäre ich nie drauf gekommen.

Damit setzte ich den Bereich in dem gezeichnet werden kann, richtig?

Das setzt die Größe des Controls. Und da der Canvas eines TGraphicControls selbiges komplett überdeckt, kannst du dann auch überall im BoundsRect malen (bis auf einen etwaigen Rand vielleicht - muttu ausprobieren).

SirThornberry 17. Jun 2010 13:15

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
folgender Code
Delphi-Quellcode:
Items[ID].setbounds(0, 0, 250, 250);
macht nichts anderes als
Delphi-Quellcode:
Items[ID].Left := 0;
Items[ID].Top := 0;
Items[ID].Width := 250;
Items[ID].Height := 250;
Der Unterschied ist das es mit einem Funktionsaufruf erledigt ist. Wenn man Left, Top, Width und Height einzeln zuweist wird intern 4 mal setbounds aufgerufen.

DeddyH 17. Jun 2010 13:17

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
So steht es ja auch in der Hilfe.
Zitat:

Use SetBounds to change all of the component's boundary properties at one time. The same effect can be achieved by setting the Left, Top, Width, and Height properties separately, but SetBounds changes all four properties at once ensuring that the control will not repaint between changes.

SirThornberry 17. Jun 2010 13:21

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Ich glaub du bist der einzige in dem Thema hier der die Hilfe gelesen hat :thumb:

DeddyH 17. Jun 2010 14:38

AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
 
Nunja, die gibt es ja schließlich nicht zum Spaß :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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