AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Form Skalieren/OnResize Problem mit Delphi2007
Thema durchsuchen
Ansicht
Themen-Optionen

Form Skalieren/OnResize Problem mit Delphi2007

Offene Frage von "D6to2007"
Ein Thema von D6to2007 · begonnen am 8. Sep 2007 · letzter Beitrag vom 13. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
D6to2007

Registriert seit: 7. Sep 2007
Ort: Hamburg
9 Beiträge
 
Delphi 2007 Professional
 
#1

Form Skalieren/OnResize Problem mit Delphi2007

  Alt 8. Sep 2007, 13:02
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;
  Mit Zitat antworten Zitat
oki

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

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 8. Sep 2007, 13:07
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 (Erst gar nicht gesehen) [/edit]
42
  Mit Zitat antworten Zitat
D6to2007

Registriert seit: 7. Sep 2007
Ort: Hamburg
9 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 8. Sep 2007, 18:45
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.
  Mit Zitat antworten Zitat
oki

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

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 8. Sep 2007, 19:55
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
42
  Mit Zitat antworten Zitat
D6to2007

Registriert seit: 7. Sep 2007
Ort: Hamburg
9 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 9. Sep 2007, 10:27
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
  Mit Zitat antworten Zitat
oki

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

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 9. Sep 2007, 18:29
Ähm,

ganz am Ende?
42
  Mit Zitat antworten Zitat
D6to2007

Registriert seit: 7. Sep 2007
Ort: Hamburg
9 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 10. Sep 2007, 12:11
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
  Mit Zitat antworten Zitat
oki

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

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 10. Sep 2007, 12:31
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
42
  Mit Zitat antworten Zitat
D6to2007

Registriert seit: 7. Sep 2007
Ort: Hamburg
9 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 12. Sep 2007, 16:34
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ß
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Form Skalieren/OnResize Problem mit Delphi2007

  Alt 13. Sep 2007, 08:21
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...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:26 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