Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente im Raster verschieben (https://www.delphipraxis.net/97756-komponente-im-raster-verschieben.html)

oki 15. Aug 2007 17:16


Komponente im Raster verschieben
 
Hi Leute!

Ich habe eine eigene Klasse mit dem Vorfahren TCustomControl. Im MouseDown-Ereignis reagiere ich wie folgt:
Delphi-Quellcode:
      ReleaseCapture;
      case CurPosState of
        cps_none:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F012, 0);
        cps_LeftTop:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F004, 0);
        cps_RightTop:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F005, 0);
        cps_LeftBottom:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F007, 0);
        cps_RightBottom:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F008, 0);
        cps_Left:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F001, 0);
        cps_Top:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F003, 0);
        cps_Right:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F002, 0);
        cps_Bottom:
          TWinControl(self).Perform(WM_SYSCOMMAND, $F006, 0);
      end;
CurPosState ist ein eigener Typ, der mir sagt ob und auf welchem Ziehpunkt der Cursor steht. So kann ich zur Laufzeit die Größe des Controls per Maus ändern. Mein cps_none bedeutet kein Ziehpunkt -> also gesamtes Control verschieben.
Jetzt möchte ich aber ein "Gitter" mit einer festgelegten Rasterweite einschalten (im Hauptprogramm). Als beispiel soll ein Raster von 10 Pixel gelten.
wenn ich nun die Kompo zur Laufzeit verschiebe oder in der Größe ändere, dann soll das in 10-er Schritten erfolgen. Das erspart dem Anwender ein nachträgliches mühsames Ausrichten. Leider hab ich nun keinen Film, wie ich das machen kann.

Ich hatte mir gedacht, dass nachträglich im MouseUp zu machen, find ich aber nicht so elegant.

Wenn einer 'ne Idee hat, würd mich freuen.

Gruß oki

Nikolas 15. Aug 2007 17:35

Re: Komponente im Raster verschieben
 
Da hilft dir die freundliche Funktion DIV.
Was du brauchst ist ganz klar die GanzZahlDivision. Wenn du deine Maus um 55px bewegst, bist du 55 div 10 = 5 Kästchen weit gekommen.
Die neue Koordinate deines WasAuchImmers liegt also bei (55 div 10)*10, wenn es davor richtig lag .

oki 15. Aug 2007 17:43

Re: Komponente im Raster verschieben
 
Hi,

schon mal dank für die antwort. Aber die Trifft es nicht. Die Mathematik ist mir schon klar. Wenn ich die Mausereignisse aber mittels ReleaseCapture abfange und mit Perform die Änderungen ausführen lasse, dann kann ich halt die korrigierten Koordinaten nicht mit übergeben. Oder ich weis halt nicht wie und wo.

Gruß oki

oki 16. Aug 2007 08:29

Re: Komponente im Raster verschieben
 
*push* :roll:

Hawkeye219 16. Aug 2007 09:03

Re: Komponente im Raster verschieben
 
Hallo oki,

die Konstante GRIDINTERVAL habe ich (auch) für dich in dieses Beispiel eingebaut.

Gruß Hawkeye

oki 16. Aug 2007 09:23

Re: Komponente im Raster verschieben
 
Hi Hawkeye219,

jooop, aber mit Move über X, Y. Nun ist es aber so, dass ich die im ersten Post dargestellte Variante verwende. Dabei werden die Mausereignisse ja abgefangen und bis zum MouseUp umgeleitet (Perform).
Mit der von mir verwendeten Methode (hab ich aber auch dem Forum an anderer Stelle entnommen) geht das alles etwas flüssiger mit dem Bewegen des Controls (subjektiv?). Zu dem ist der Code natürlich sehr schmal und übersichtlich bei gleicher Funktionalität.
Kehrseite; wie bekomme ich das mit dem Raster hin?

Gruß oki

SirThornberry 16. Aug 2007 09:41

Re: Komponente im Raster verschieben
 
Nachteil deiner Methode mit Release ist dass, das Control wohl ein Handle haben muss. Wenn es ein Handle hat solltest du die Messages wm_sizing und wm_moving abfangen können.

oki 16. Aug 2007 09:51

Re: Komponente im Raster verschieben
 
Hi sirThornberry,

das werd ich mal testen. Ich habe mich bis jetzt mit folgendem Trick beholfen:
- Move und Size wie erläutert,
- in Paint SetBounts mit korrogierten Positions- und Größenwerten aufgerufen.

Delphi-Quellcode:
procedure TBaseCustomControl.Paint;
begin
  inherited;
  Canvas.Font.Assign(self.Font);
  RastControl;
end;

procedure TBaseCustomControl.RastControl;
var Rest : Extended;
    ALeft, ATop, AHeight, AWidth : Integer;
begin
  if not FGrid then
    Exit;
  ALeft := ((Left Div FGridWidth) * FGridWidth) + (Round(Frac(Left/FGridWidth))*FGridWidth);
  ATop := ((Top Div FGridWidth) * FGridWidth) + (Round(Frac(Top/FGridWidth))*FGridWidth);
  AWidth := ((Width Div FGridWidth) * FGridWidth) + (Round(Frac(Width/FGridWidth))*FGridWidth);
  AHeight := ((Height Div FGridWidth) * FGridWidth) + (Round(Frac(Height/FGridWidth))*FGridWidth);
  SetBounds(ALeft, ATop, AWidth, AHeight);
end;
FGrid ist ein boolsches Property (Raster an aus) und FGridWidth ist natürlich die Gitterweite.
Erstaunlicher weise passiert jetzt folgendes. Bei Move wird während der Bewegung nicht gerastert, aber beim Ablegen auf das Raster korrigiert. Das hab ich auch so erwartet, wollte ich aber nicht haben.
Bei Größenänderung springt die gezogene Seite in Rasterschritten während des ziehens auf die neue Größe. Das wollte ich so haben, hab ich aber mit diesem Code nicht erwartet. :gruebel:

Na, ich probiers mal weiter.

Gruß oki

Hawkeye219 16. Aug 2007 10:34

Re: Komponente im Raster verschieben
 
Hallo oki,

Angus Johnson bietet auf seiner Seite mit TSizeControl eine Komponente an, die dein (Programmierer-)Leben etwas vereinfachen könnte.

Gruß Hawkeye

_frank_ 16. Aug 2007 10:41

Re: Komponente im Raster verschieben
 
die macht leider das snapToGrid erst, wenn das Control gedroppt wird.
evtl hat jemand eine Idee, wie man den Rahmen auch "snappen" kann.
Meine Versuche haben damals nicht funktioniert.

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Seite 1 von 3  1 23      

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