![]() |
Komponente im Raster verschieben
Hi Leute!
Ich habe eine eigene Klasse mit dem Vorfahren TCustomControl. Im MouseDown-Ereignis reagiere ich wie folgt:
Delphi-Quellcode:
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.
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; 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 |
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 . |
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 |
Re: Komponente im Raster verschieben
*push* :roll:
|
Re: Komponente im Raster verschieben
Hallo oki,
die Konstante GRIDINTERVAL habe ich (auch) für dich in ![]() Gruß Hawkeye |
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 |
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.
|
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:
FGrid ist ein boolsches Property (Raster an aus) und FGridWidth ist natürlich die Gitterweite.
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; 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 |
Re: Komponente im Raster verschieben
Hallo oki,
Angus Johnson bietet auf ![]() Gruß Hawkeye |
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 07:44 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