![]() |
Delphi-Version: 2010
MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Moin !
Ich habe da eine sehr primitive Klasse:
Delphi-Quellcode:
Ich würde gerne dieser Klasse Funktionen wie OnMouseMove, OnMouseDown, ... geben. Kann mir jemand einen Tip geben wie man das am besten anstellt?
{$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 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. |
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.
|
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] |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Was müsste ich denn umbauen um die entsprechenden Nachrichten abfangen zu können?
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Zitat:
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Moin !
Zitat:
Delphi-Quellcode:
Habe dann aber 2 neue Fragen ...
TRecty = Class(TGraphicControl)
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? |
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; |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
<ot mode="klugscheiss">Wäre statt dem
Zitat:
Delphi-Quellcode:
besser?
FLeft, FTop,
FWidth, FHeight: Integer; </ot> |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Ist ja jetzt gar nicht mehr nötig, da automatisch geerbt. ;)
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Zitat:
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Moin !
Irgendwas fehlt da noch, denn gezeichnet wird noch nix. Meine Klasse:
Delphi-Quellcode:
Und so erzeuge ich eine Instanz (Items : array of TRecty):
{$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.
Delphi-Quellcode:
Bei dem Paint komme ich allerdings nie an. :gruebel:
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; |
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:
Und im überschriebenen Paint brauchst du natürlich dann nicht x,y,w und h zu verwenden sondern einfach nur breite und höhe.
yourComponent := TYourComponent.Create(Nil_Or_wanted_Owner);
yourComponent.Parent := your_wanted_parent; yourComponent.setbounds(0, 0, 250, 250); |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Moin !
Delphi-Quellcode:
Ich dachte das würde mit dem Create direkt übergeben mittels Owner, aber ok. Falsch gedacht.
Items[ID].Parent := Form1;
Delphi-Quellcode:
Ok, da wäre ich nie drauf gekommen.
Items[ID].setbounds(0, 0, 250, 250);
Damit setzte ich den Bereich in dem gezeichnet werden kann, richtig? |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Zitat:
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
folgender Code
Delphi-Quellcode:
macht nichts anderes als
Items[ID].setbounds(0, 0, 250, 250);
Delphi-Quellcode:
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.
Items[ID].Left := 0;
Items[ID].Top := 0; Items[ID].Width := 250; Items[ID].Height := 250; |
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
So steht es ja auch in der Hilfe.
Zitat:
|
AW: MouseDown, ..Up, ..Move einer Klasse hinzufügen?
Ich glaub du bist der einzige in dem Thema hier der die Hilfe gelesen hat :thumb:
|
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:47 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