![]() |
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; |
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] |
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:
Nun verschiebt sich aber der Rahmen zum Fensterinhalt. Und die „Ecken“ Lösung bin ich noch nicht angegangen
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; 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. |
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 ![]() Gruß oki |
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 |
Re: Form Skalieren/OnResize Problem mit Delphi2007
Ähm,
ganz am Ende? |
Re: Form Skalieren/OnResize Problem mit Delphi2007
Hi
Danke für Deine Hilfe und ich finde folgendes:
Delphi-Quellcode:
und
procedure TBaseCustomControl.WMSizing(var AMsg: TMessage);
var ARect : PRect; begin if not Grid then Exit; ARect := PRect(AMsg.lParam); GetRastControlRect(ARect); end; procedure WMMoving .. Hab ich da was nicht verstanden oder nicht gefunden? Gruss |
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 |
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ß |
Re: Form Skalieren/OnResize Problem mit Delphi2007
Zitat:
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 17:16 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 by Thomas Breitkreuz