AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente im Raster verschieben

Ein Thema von oki · begonnen am 15. Aug 2007 · letzter Beitrag vom 30. Aug 2007
Antwort Antwort
Seite 2 von 3     12 3      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 11:58
Hallo Hawkeye219

auch wenn es jetzt blöd klingt, aber ich möchte (muss) meine eigene Collektion von Controls erstellen. Wird für mich im Nachgang einfacher, wenn alle meine Controls den gleichen Vorfahren haben. Das Moving/Sizing ist auch kein Problem. Hab ich schon alles zu meiner Zufriedenheit gelöst. Das Thema SnaptoGrid ist ja auch keine Gewalt. Hätte ich halt etwas schicker (wie beschrieben während der Bewegung). Somit stehe ich eigentlich nicht vor dem Problem der gesamten Lösung, sondern nur für ein "kleines Detail". ehrlich gesagt würde ich eher auf dieses Detail verzichten, als meine Kompo weg werfen und eine Fremdkompo verwenden.


Zitat von _frank_:
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
Und genau das ist im Moment mein Problem! Wie gesagt, mit meiner einfachen Lösung im Paint klappt das erstaunlicher weise mit der Größenänderung zur "Ziehzeit". Beim Moving halt erst beim Drop.

Ich habe das Gefühl, dass folgender Code nicht dazu führt, dass mein vererbtes Paint aufgerufen wird:
Delphi-Quellcode:
   ReleaseCapture;
   TWinControl(self).Perform(WM_SYSCOMMAND, $F012, 0);
Aber warum bei den anderen?
Delphi-Quellcode:
   ReleaseCapture;
      ...
        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);
gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 12:02
Noch ein Nachtrag,

mein Control wird auch während des verschiebens immer sauber gezeichnet. Halt ohne einrasten.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 12:38
es im Paint zu korrigieren halte ich für den falschen Weg, dann kannst du auch gleich einen Timer nehmen der korrigiert. Richtiger finde ich, das gleich zu verhindern durch eben behandeln der Messages wm_sizing und wm_moving.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 12:41
Zitat von SirThornberry:
es im Paint zu korrigieren halte ich für den falschen Weg, dann kannst du auch gleich einen Timer nehmen der korrigiert. Richtiger finde ich, das gleich zu verhindern durch eben behandeln der Messages wm_sizing und wm_moving.
Joop, war auch erst mal nur eine Notlösung mit dem Korrogieren im Paint.
Teste heute noch das Message-Thema.

Gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 15:18
Habe jetzt das ganze mal in den Messages wmsizing und wmmoving getestet.
Delphi-Quellcode:
procedure TBaseCustomControl.WMMoving(var Message: TWMMove);
begin
  if Grid then
    RastControl;
end;

procedure TBaseCustomControl.WMSizing(var Message: TWMSize);
begin
  if Grid then
    RastControl;
end;

procedure TBaseCustomControl.RastControl;
var ALeft, ATop, AHeight, AWidth : Integer;
begin
  if not Grid then
    Exit;
  ALeft := (Left Div FGridWidth) * FGridWidth;
  ATop := (Top Div FGridWidth) * FGridWidth;
  AWidth := (Width Div FGridWidth) * FGridWidth;
  AHeight := (Height Div FGridWidth) * FGridWidth;
  SetBounds(ALeft, ATop, AWidth, AHeight);
end;
Gute Nachricht: Er rastet jetzt auch während des Movens.
Schlechte Nachricht: Das Control "zappelt" am Mauszeiger. Dabei habe ich den Eindruck, dass das Control beim bewegen auf die neue "krumme" Koordinate verschoben und gezeichnet und dann wmmoving ausgeführt wird. Dort wird dann korrigiert und wieder neu an den Gitterkoordinaten gezeichnet (SetBounds siehe Code).

Ein Problem gelöst, nächste da.

Somit müsste vor dem Zeichnen korrigiert werden. Aber wie?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#16

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 16:29
Rufe das RastControl mal nur in einer der beiden Messages aus. Vielleicht hilft das ja schon.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 16:42
Hab ich getestet. Zappeln bleibt, halt nur bei der entsprechenden aktion.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#18

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 16:46
ich hab das mal in die SizeControl-Komponente von Angus Johnson integriert (da ich dieses Feature auch im DFM-Editor haben wollte):

Delphi-Quellcode:
  TTargetObj = class
  private
    ....
    procedure AlignToGrid(Ctrl: TControl; ProposedBoundsRect: TRect; GridSize: integer);
...
  TSizeCtrl = class(TComponent)
  private
...
    fSnapToGrid: boolean;
...
  published
...
    property SnapToGrid: boolean read fSnapToGrid write fSnapToGrid;
...
//changed global function AlignToGrid to method of TTargetObj
procedure TTargetObj.AlignToGrid(Ctrl: TControl; ProposedBoundsRect: TRect; GridSize: integer);
begin
  //AlignToGrid() assumes 'Control' is assigned.
  if (GridSize > 1) and (FSizeCtrl.SnapToGrid) then
  begin
...

procedure TTargetObj.MoveFocus(dx,dy: integer);
begin
  fFocusRect := fStartRec;
  if fSizeCtrl.SnapToGrid then
  begin
    dx:=dx div fsizectrl.GridSize * fsizectrl.GridSize;
    dy:=dy div fsizectrl.GridSize * fsizectrl.GridSize;
  end;
  offsetRect(fFocusRect, dx,dy);
end;
//------------------------------------------------------------------------------

procedure TTargetObj.SizeFocus(dx,dy: integer; BtnPos: TBtnPos);
begin
  fFocusRect := fStartRec;
  if fSizeCtrl.SnapToGrid then
  begin
    dx:=dx div fsizectrl.GridSize * fsizectrl.GridSize;
    dy:=dy div fsizectrl.GridSize * fsizectrl.GridSize;
  end;
...
für die faulen unter euch ist die komplette Komponente im Anhang

Gruß Frank
Angehängte Dateien
Dateityp: pas sizecontrol_946.pas (46,4 KB, 24x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Komponente im Raster verschieben

  Alt 16. Aug 2007, 20:15
schau dir mal die Hilfe zu wm_sizing und wm_moving an!
Mit der Message kommt ein Pointer auf die neuen Koordinanten des Forms. Diese solltest du direkt korrigieren. Andernfalls änderst du eben die Korrdinanten durch deine Methode und beim rückkehren aus der Messageroutine wird nochmal korrigiert - daher auch das zappeln.

Schau dir zur Orientierung mal folgendes an:
http://www.delphipraxis.net/internal...=699256#699256
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Komponente im Raster verschieben

  Alt 17. Aug 2007, 10:21
Hallo SirThomberry,

erst mal herzlichen Dank für die Hilfe. Das klappt jetzt super für wm_Sizing. Alles ohne Zappeln und wie gewollt im Raster. Für wm_moving aber leider nicht.
Folgende Erscheinung. Bewege ich das Control mit der Maus nach rechts oben, macht er aus einem Pixel Move 10 Pixel. Somit wandert das Control mit 10-facher Geschwindigkeit von meiner Maus nach oben/rechts weg. Nach links/unten geht gar nichts. Das erscheint normal, wenn man davon ausgeht, das jedes neue moving von den aktuellen Controlposition + Mausoffset ausgeht. Das es dann nicht nach rechts/unten klappt ist logischerweise auf mein Div zurückzuführen. aber warum ist das nur beim Moving und nicht beim Sizing so? Sizing ist in alle Richtungen so wie ich es haben will.

Hier der veränderte Code:
Delphi-Quellcode:
Procedure TBaseCustomControl.GetRastControlRect(var ARect: PRect);
begin
  if not Grid then begin
    Exit;
  end;
  ARect.Left := (ARect.Left Div FGridWidth) * FGridWidth;
  ARect.Top := (ARect.Top Div FGridWidth) * FGridWidth;
  ARect.Right := (ARect.Right Div FGridWidth) * FGridWidth;
  ARect.Bottom := (ARect.Bottom Div FGridWidth) * FGridWidth;
end;

procedure TBaseCustomControl.WMMoving(var AMsg: TMessage);
var ARect : PRect;
begin
  if not Grid then
    Exit;
  ARect := PRect(AMsg.lParam);
  GetRastControlRect(ARect);
end;

procedure TBaseCustomControl.WMSizing(var AMsg: TMessage);
var ARect : PRect;
begin
  if not Grid then
    Exit;
  ARect := PRect(AMsg.lParam);
  GetRastControlRect(ARect);
end;
Herzlichen Dank für deine Gedult und Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 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