Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Form Skalieren/OnResize Problem mit Delphi2007 (https://www.delphipraxis.net/99200-form-skalieren-onresize-problem-mit-delphi2007.html)

D6to2007 8. Sep 2007 13:02


Form Skalieren/OnResize Problem mit Delphi2007
 
Hallo Delphi Spezialisten

Mit D6 funktioniert folgendes problemlos (s.U).

Unter Delphi 2007 wird OnResize durch Zuweisung von Width, Height oder Aufruf von ScaleBy sofort wieder aufgerufen und das ganze geht nicht mehr.

Ich habe geraume Zeit mit dem Problem verbracht und konnte hierzu nichts finden.
Bin mir auch nicht sicher ob es sich evtl. um einen Bug in D2007 handelt .

hat jemand eine Idee hierzu ?


Delphi-Quellcode:


procedure TMainForm.OnResize(Sender: TObject);
Var h, w : single ;
begin

  w := Width / InitWidth ;
  h := Height / InitHeight ;
  If h > w Then
    Width := round(InitWidth * h)
  Else
    Height := round(InitHeight * w) ;

  If (Width div 4) <> Currentscale Then
    Begin
      ScaleBy ( Width div 4 , CurrentScale );
      CurrentScale := Width div 4 ;
    end;

end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  inherited;
  If Screen.PixelsPerInch <> 96 Then
    begin
      Width := round ( Width * Screen.PixelsPerInch / 96 );
      Height := round ( Height * Screen.PixelsPerInch / 96 );
    end ;
  InitWidth := Width ;
  InitHeight := Height ;
  Constraints.MinWidth := Width ;
  Constraints.MinHeight := Height ;
  Constraints.MaxWidth := Screen.Width;
  Constraints.MaxHeight := Screen.Height ;
  MinWidth := ( Width * 3 ) div 4 ;
  MinHeight := ( Height * 3 ) div 4 ;
  CurrentScale := Width div 4 ;
end;

oki 8. Sep 2007 13:07

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Benutze die Procedure WMSizing (Botschaft wm_sizing) und ändere da den übergebenen Rect. Dann sollte alles klappen.

Gruß oki

[edit oki] Herzlich willkommen in der DP :dp: (Erst gar nicht gesehen) [/edit]

D6to2007 8. Sep 2007 18:45

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hallo Oki

Ich bin beeindruckt von Deiner schnellen Antwort, vielen Dank.
DP habe ich immer wieder besucht aber mich nie getraut mal eine (dumme) Frage zu stellen.
Dein Tipp WMSizing hat mich ein gutes Stück weitergebracht und ich hab dazu einiges gefunden und einbaut:

Delphi-Quellcode:
procedure TMainForm.FWM_Sizing(var AMsg: TMessage);    
var lRect     : PRect;
    lRatio    : TPoint;
    lNewHeight,
    lNewWidth : Integer;
begin
  lRatio := Point(4, 3);
  lRect := PRect(AMsg.LParam);
  lNewHeight := lRect.Bottom - lRect.Top + 1;
  lNewWidth := lRect.Right - lRect.Left + 1;
  case AMsg.WParam of
    WMSZ_BOTTOM, WMSZ_TOP: lRect.Right := lRect.Left + Round(lNewHeight * lRatio.X / lRatio.Y);
    WMSZ_LEFT, WMSZ_RIGHT: lRect.Bottom := lRect.Top + Round(lNewWidth * lRatio.Y / lRatio.X);

    //übrig bleibt noch was passieren soll wenn jemand direkt eine Ecke anpackt
  end;
  inherited;
end;

//Das scaleby hab ich nun hier untergebracht :

Procedure TMainForm.OnAfterResize(var msg: TMessage);
Var h, w : single ;
begin

  w := Width / InitWidth ;
  h := Height / InitHeight ;
  If h > w Then
    Width := round(InitWidth * h)
  Else
    Height := round(InitHeight * w) ;


  If (Width) <> Currentscale Then
    Begin
      ScaleBy ( Width, CurrentScale );
      CurrentScale := Width;
   End;
End;
Nun verschiebt sich aber der Rahmen zum Fensterinhalt. Und die „Ecken“ Lösung bin ich noch nicht angegangen

Leider blicke ich nicht richtig durch weil ich bisher so gut wie keine Erfahrung mit systemnaher Windows-Programmierung habe. Was die Windows Messages betrifft schwirren mir die Sinne: WM_SIZING, WM_SIZE, WM_RESIZE, WM_EXITSIZEMOVE etc. und deren diverse Parameter und Optionen. Was hat sich MS bloß bei dieser Vielfalt gedacht ? Wie kann da einer durchblicken ?

Hast Du vielleicht. noch eine Tipp wo ich ein kompletteres Beispiel für FormResizing finden kann welches Delphi 2007 kompatible ist?
Gefunden habe ich bisher nur dinge aus 1999 /2000.

oki 8. Sep 2007 19:55

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hi D6to2007,

es gibt keine dummen Fragen, nur dumme Antworten. Und das meine ich ernst!

Ich rieche auch erst seit kurzem in die Thematik rein. Ich habe herausbekommen, dass wm_sizing aufgerufen wird, wenn die entsprechende Windows-Botschaft abgesetzt wird. Ich nutze das in meinen Controls zu Änderung der Größe durch den Benutzer zur Laufzeit.

Hier ist mal ein Thread von mir wm_moving, wm_sizing , vielleicht hilft er dir weiter.

Gruß oki

D6to2007 9. Sep 2007 10:27

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hallo Oki

Ich hab mir Deinen Thread wm_moving, wm_sizing angesehen und find auch die Deklaration procedure WMSizing(var AMsg: TMessage); message WM_SIZING;
Und wo kann ich Deine src dazu finden?

Gruss D6To2007

oki 9. Sep 2007 18:29

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Ähm,

ganz am Ende?

D6to2007 10. Sep 2007 12:11

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hi

Danke für Deine Hilfe und ich finde folgendes:

Delphi-Quellcode:
procedure TBaseCustomControl.WMSizing(var AMsg: TMessage);
var ARect : PRect;
begin
  if not Grid then
    Exit;
  ARect := PRect(AMsg.lParam);
  GetRastControlRect(ARect);
end;
und

procedure WMMoving
..

Hab ich da was nicht verstanden oder nicht gefunden?

Gruss

oki 10. Sep 2007 12:31

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hi,

ich fange die Message ab, um das Control in einem Raster (Grid) zu verschieben. Dies berechnet bei mir die Funktion GetRastControlrect. Ich übergeben das aktuelle Rect und verändere die Werte auf mein Raster. Somit habe ich das Rect in Msg.LParam verändert. Dieses neue Rect wird dann vom Control genutzt. Du musst jetzt die Werte von ARect (bei mir) nach deinen Vorstellungen ändern. Somit nimmt das Control/Form dann die Werte für sein Rect an.

Wenn ich jetzt ganz daneben bin, dann haben wir die ganze Zeit mächtig aneinander vorbei gesprochen.

Gruß oki

D6to2007 12. Sep 2007 16:34

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Hallo Oki

Ich komme hiermit im Moment nicht richtig weiter.
Das rect ist ok aber „scaleby“ macht mir Probleme.
Hab verschiedenes probiert aber nach mehrfachem hin/her Skalieren verschiebt sich das ganze und ist dann kaput.
Ich will das später noch mal erneut angehen. Hab noch soviel anderes auf dem „zettel“.
Nochmals vielen Dank für Deine Bemühungen.

Gruß

RavenIV 13. Sep 2007 08:21

Re: Form Skalieren/OnResize Problem mit Delphi2007
 
Zitat:

Zitat von D6to2007
Delphi-Quellcode:
...
Var h, w : single ;
...

So als Hinweis:
h und w sind keine besonders tollen Variablennamen.
Solltest Dir mal den Borland-Styleguide reinziehen.
Auch wenn Du nur alleine an den Sourcen arbeitest und es nur für privat ist, tust Du Dir leichter, wenn Du Dich an bestimmte "Regeln" hältst...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 Uhr.
Seite 1 von 2  1 2      

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