Delphi-PRAXiS
Seite 3 von 3     123   

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 23. Aug 2007 15:31

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

oki 30. Aug 2007 08:00

Re: Komponente im Raster verschieben
 
Hi Leute,

also das mit dem Verschieben zur Laufzeit hat mir einige Kopfschmerzen bereitet. Das lag zum einen daran, dass man erst mal verstehen muß was wann sich ändert und dann muss man es auch noch schaffen seine Gehirnwindungen zu entknoten und einen machbaren ansatz finden.

Hier jetzt mein Ergebnis. Wenn jemand Verbesserungsvorschläge hat, her damit.

noch mal die Aufgabenstellung zum Verständnis:
- Das Control soll zur Laufzeit in einem Raster der Weite X verschoben werden können.
- Das Verschieben erfolgt mittels:
Delphi-Quellcode:
  //Fängt alle Mausereignisse ab
  ReleaseCapture;
  // verschiebt das Control (hängt am Mauszeiger)
  TWinControl(self).Perform(WM_SYSCOMMAND, $F012, 0);
in der vererbten MouseDown Methode.
- Das Control soll nicht erst nach dem Droppen einrasten, sondern fortlaufend während des movens.

Umsetzung:
Delphi-Quellcode:
  TBaseCustomControl = class(TCustomControl)
  private
    FGrid: Boolean;                    // Gitter zum einrasten an
    FGridWidth: Integer;               // Pixelweite des Gitters
    FOldScreenRect : TRect;            // letzte Größe des ClientRect beim moven
    MoveOffsetX, MoveOffsetY : Integer; // komulierte X-, Y-Offsets beim moven
    procedure WMSizing(var AMsg: TMessage); message WM_SIZING;
    procedure WMMoving(var AMsg: TMessage); message WM_MOVING;
....
  public
    property Grid : Boolean read FGrid write FGrid;
    property GridWidth : Integer read FGridWidth write FGridWidth;
...

procedure TBaseCustomControl.WMMoving(var AMsg: TMessage);
var ARect : PRect;
begin
  // am Gitter ausrichten
  if Grid then begin
    ARect := PRect(AMsg.lParam);

    // Startwert für Left setzen und auf Raster korrigieren
    if (FOldScreenRect.Left = 0) or
      ((FOldScreenRect.Left mod FGridWidth) > 0) then
      FOldScreenRect.Left := ARect.Left div FGridWidth * FGridWidth;

    // Startwert für Right setzen und auf Raster korrigieren
    if (FOldScreenRect.Right = 0) or
      ((FOldScreenRect.Right mod FGridWidth) > 0) then
      FOldScreenRect.Right := ARect.Right div FGridWidth * FGridWidth;

    // Startwert für Top setzen und auf Raster korrigieren
    if (FOldScreenRect.Top = 0) or
      ((FOldScreenRect.Top mod FGridWidth) > 0) then
      FOldScreenRect.Top := ARect.Top div FGridWidth * FGridWidth;

    // Startwert für Bottom setzen und auf Raster korrigieren
    if (FOldScreenRect.Bottom = 0) or
      ((FOldScreenRect.Bottom mod FGridWidth) > 0) then
      FOldScreenRect.Bottom := ARect.Bottom div FGridWidth * FGridWidth;

    Dec(MoveOffsetX, (ARect.Left - FOldScreenRect.Left));
    Dec(MoveOffsetY, (ARect.Top - FOldScreenRect.Top));
    // in X-Richtung verschieben
    if Abs(MoveOffsetX) > FGridWidth then begin
      // über das Raster hinaus
      Dec(ARect.Left, (FGridWidth*MoveOffsetX div Abs(MoveOffsetX)));
      Dec(ARect.Right, (FGridWidth*MoveOffsetX div Abs(MoveOffsetX)));
      MoveOffsetX := 0;
    end else begin
      ARect.Left := FOldScreenRect.Left;
      ARect.Right := FOldScreenRect.Right;
    end;
    // in Y-Richtung verschieben
    if Abs(MoveOffsetY) > FGridWidth then begin
      // über das Raster hinaus
      Dec(ARect.Top, (FGridWidth*MoveOffsetY div Abs(MoveOffsetY)));
      Dec(ARect.Bottom, (FGridWidth*MoveOffsetY div Abs(MoveOffsetY)));
      MoveOffsetY := 0;
    end else begin
      ARect.Top := FOldScreenRect.Top;
      ARect.Bottom := FOldScreenRect.Bottom;
    end;
    FOldScreenRect := ARect^;
  end;
end;
Jo, so klappt es bei mir erst mal sauber.

Gruß oki

torud 30. Aug 2007 08:34

Re: Komponente im Raster verschieben
 
Hier auch mal ein Tipp von mir an alle diejenigen, die sich nicht davor scheuen eine externe komponente zum Einsatz zu bringen...

Software von Greatis.com

Ich benutze die seit einigen Jahren und fahre ganz gut damit...

oki 30. Aug 2007 08:45

Re: Komponente im Raster verschieben
 
Hi Torud,

danke für den Link. Mein basecustomControl ist aber nur die Basisklasse für mehrere spezielle Controls. Somit hilft mir da eine externe Komponente nicht weiter. Derzeit implementiere ich die Basiseigenschaften meiner Controls. Jede weitere abgeleitete Klasse wird dann seine eigene Funktionalität bekommen (PID-Regler, T1-Glied ...). Jedoch sollen alle diese Komponenten zur Laufzeit eine Menge Basiseigenschaften besitzen wie verschieben, Größe ändern, farbe ändern, Gates verknüpfen, selektieren ...

somit muss und will ich mir die Arbeit selber machen.

Dank und Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 Uhr.
Seite 3 von 3     123   

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