Newsgroup: it.comp.lang.delphi
Titolo: mantenere il ratio di un form nonostante il resize.

Sto cercando una soluzione inline (cioè con sorgente nel codice e non 
in un componente a parte) per far sì che al ridimensionamento di un 
form tramite maximize/trascinamento bordi, questi si limiti a mantenere 
la proporzione iniziale.
Una cosa simile la fa questo componente: 
http://www.torry.net/vcl/forms/aspect/aspect.zip
non posso utilizzare componenti, deve essere tutto codice runtime..
Saluti


Non ho visto il componente, e non so esattamente come gestisca il
maximize (a meno che sin dal formcreate non dimensioni il form in base
all'area client dello schermo.
Una soluzione Q&D è nel canResize:
  ratio := MulDiv(10000, Height, Width);
  // variazione piccola? lascia perdere
  if abs(MulDiv(10000, newHeight, newWidth) - ratio) < 5 then Exit;
  // variata solo una dimensione -> adegua l'altra
  if (width = newWidth) then
    NewWidth :=  NewHeight *10000 div ratio
  else if height = NewHeight then
    NewHeight := NewWidth * ratio div 10000
  else begin
    // mantieni la dimensione che è variata di più e adegua l'altra
    if abs(NewHeight - Height) >= abs(NewWidth - Width) then
      NewWidth :=  NewHeight *10000 div ratio
    else
      NewHeight := NewWidth * ratio div 10000
  end;
Che appunto non tiene conto della massimizzazione.
Saluti
Paolo Arosio


Si puo' provare a "cannibalizzare" il codice del componente:
type
  TForm4 = class(TForm)
    ....
    AspectX, AspectY : integer;
    procedure WM_Sizing( var Msg : TMessage ); message WM_SIZING;
    ....
  end;
.....
procedure TForm4.WM_Sizing(var Msg: TMessage);
    procedure EstablishAspectRatio (Side : word; var Rect : TRect);
    var
      ClientXmod,
      ClientYmod : integer;
    begin
      ClientYmod := Height - ClientHeight;
      ClientXMod := Width - ClientWidth;
      // Rect is the current form size (not client area), we can
      // play with this TRect to change the form size in anyway.
      with Rect do
      // the Side contains a value indicating what is to be adjusted
      // actually uses the WMSZ_XXXX values which is the side being
pulled
      // or the corner being pulled (eight choices).
      // So calculate Right, Top, Bottom or Left values.  The
combinations set
      // here are based on what feels "right" for me, some
experimentation
      // for your feel may be necessary.  If you change this
behaviour, you may
      // need to change the saXXXX constants as well.
        case Side of
          WMSZ_BottomRight,
          WMSZ_Bottom : Right := Left +
            (Bottom - Top - ClientYmod) * AspectX div AspectY +
ClientXmod;
          WMSZ_BottomLeft,
          WMSZ_Right  : Bottom := Top +
            (Right - Left - ClientXmod)* AspectY div AspectX +
ClientYmod;
          WMSZ_TopRight,
          WMSZ_Left   : Top := Bottom -
            (Right - Left - ClientXmod) * AspectY div AspectX -
ClientYmod;
          WMSZ_TopLeft,
          WMSZ_Top    : Left := Right -
           (Bottom - Top - ClientYmod) * AspectX div AspectY -
ClientXmod
        end
    end;
begin
  EstablishAspectRatio (Msg.wParam, PRect (Msg.lParam)^);
end;
Sembra funzionare piuttosto bene.
ciao
Giacomo

 Sembra funzionare piuttosto bene.
E' quasi perfetto: fa solo un piccolo resize nel momento in cui vai a 
cliccare sul bordo senza trascinare. Vanno impostati AspectX e AspectY 
ai valori ottimali. ci sto lavorando.
Grazie :)