Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponenten zur Laufzeit im Raster verschieben (https://www.delphipraxis.net/110688-komponenten-zur-laufzeit-im-raster-verschieben.html)

Christian18 22. Mär 2008 15:23


Komponenten zur Laufzeit im Raster verschieben
 
Hallo,

ich kann meine Komponenten auf meiner Form zur Laufzeit verschieben. Wie kann ich diese im Raster verschieben? z.b. Raster von 8 Pixel

MFG Christian18

dajuhsa 22. Mär 2008 15:27

Re: Komponenten zur Laufzeit im Raster verschieben
 
Delphi-Quellcode:
procedure Verschieben(var KomponenteXYZ:TObject; const XVerschiebefaktor,YVerschiebefaktor:Integer);
begin
//Edit: kleiner Zusatz, vielleicht meintest du ja sowas:
KomponenteXYZ.Left := KomponenteXYZ.Left div 8 * 8;
KomponenteXYZ.Top := KomponenteXYZ.Top div 8 * 8;
//^^^^^^^^^^^^
KomponenteXYZ.Left := KomponenteXYZ.Left + 8 * XVerschiebefaktor;
KomponenteXYZ.Top := KomponenteXYZ.Top + 8 * YVerschiebefaktor;

end;
meinst du so etwas :gruebel:
Ist doch ne ganz normale Verschiebung :|

Edit: Der Zusatz lässt deine Komponente eben noch am Raster einrasten, aber sonst is da nicht viel dran :mrgreen:

mfG,
dajuhsa

Christian18 22. Mär 2008 15:38

Re: Komponenten zur Laufzeit im Raster verschieben
 
Hallo,

ich meine das eher so wie man das auch in der Delphi IDE machen kann.

hier mein code, den ich so aus dem Internet übernommen habe (von den Schweizern):

und da will ich jetzt sowas einbauen, dass ich die Komponenten nicht pixelweise verschiebe, sondern immer gleich um 8 Pixel. Wie in Delphi halt auch.

Delphi-Quellcode:
type
  TMoveCracker = class(TControl);

procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDownX := X;
  FDownY := Y;
  FDragging := True;
  TMoveCracker(Sender).MouseCapture := True;
end;

procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then
    with Sender as TControl do
    begin
      Left := X - FDownX + Left;
      Top := Y - FDownY + Top;
    end;
end;

procedure TForm1.ControlMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FDragging then
  begin
    FDragging := False;
    TMoveCracker(Sender).MouseCapture := False;
  end;
end;

dajuhsa 22. Mär 2008 16:07

Re: Komponenten zur Laufzeit im Raster verschieben
 
da hast du doch deinen code schon^^ du musst halt nur
Delphi-Quellcode:
Left := {8 *} X - FDownX + Left;
Top := {8 *} Y - FDownY + Top;
schreiben, oder nicht :mrgreen:

Fussball-Robby 22. Mär 2008 17:00

Re: Komponenten zur Laufzeit im Raster verschieben
 
Probiers mal damit, so hab ichs vor nem halben Jahr gemacht:
Delphi-Quellcode:
//uses TypInfo

Procedure Verschieben(Sender:TObject; X, Y:Integer; Raster:Integer=8);
Var Pt   : TPoint;
    Info : PPropInfo;
begin
  Info := GetPropInfo(Sender, 'Top');
  if (Assigned(Info)) then
    //Nur ausführen, wenn das Objekt die Eigenschaft 'Top' und damit auch Left, Height & Width hat
  begin
    GetCursorPos(Pt);
      //Cursorposition ermitteln
    Pt := Form1.ScreenToClient(Pt);
      //Cursorposition innerhalb der Form ermitteln
    Pt:=Point(Pt.X-GetOrdProp(Sender,'Width') shr 1, Pt.Y-GetOrdProp(Sender,'Height') shr 1);
      //Cursorposition auf die Mitte des Objektes setzen
    if (frac(Pt.X / Raster)=0) then
      //falls X durch Raster eine Ganzzahl ist..
      SetOrdProp(Sender,'Left',Pt.X);
        //..Objekt auf X setzen
    if (frac(Pt.Y / Raster)=0) then
      //falls Y durch Raster eine Ganzzahl ist..
      SetOrdProp(Sender,'Top',Pt.Y);
        //..Objekt auf Y setzen
  end;
end;

//Aufruf:
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssleft in Shift then Verschieben(Panel1,X,Y);
end;

//Oder mit anderem Raster:
procedure TForm1.RadioButton1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if ssleft in Shift then Verschieben(Radiobutton1,X,Y,20);
end;
Mfg


PS.: Gefrohte Ostern :stupid:


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