Results 1 to 5 of 5

Thread: NLDRcs_Resize

  1. #1

    NLDRcs_Resize

    Een nieuwe unit: NLDRcs_Resize.pas.

    De bedoeling van deze unit is alles op een form mee te re-sizen als het form zelf ge re-sized wordt.

    Gebruik

    Het gebruik is erg eenvoudig: dit is de interface tussen het programma dat de unit gebruikt en de unit zelf:

    Voor ieder form dat op deze manier moet ge-resized worden:

    1. Creeer een variabele van het type "TMyResize":
    Code:
    var MyResize_: TMyResize;
    2. In het Form.Create event toevoegen:
    Code:
      MyResize_ := TMyResize.Create(Self);
    3. In het Form.Resize event toevoegen:
    Code:
    MyResize_.Resize(Self);
    4. In het Form.Destroy event toevoegen:
    Code:
      MyResize_.Free;
    De re-size unit berekent uit de oude en de nieuwe Width en Height van het form de horizontale en verticale zoom factoren en past alle items op het form aan wat betreft de properties Left, Top, Height en Width, dus zowel de afmetingen als de plaats (spaties tussen items) wordt aangepast aan de nieuwe afmetingen van het form.
    Het re-sizen is recursief, bv een Panel op het form wordt ge re-sized, maar ook alle items op dat panel worden ge re-sized.


    Afwijkingen van standaard gedrag

    Voor items op het form die een afwijkende re-sizing nodig hebben is die mogelijkheid voorzien door middel van een callback routine. Die wordt aangeroepen voor ieder item op het form.
    De signatuur van de routine is:
    Code:
    type TResizeCallbackFunction = function(Control: TControl; VFactor, HFactor: real; L, W, H, T
    {$IFDEF FONTRESIZE}
        , S
    {$ENDIF}
        : integer): boolean;
    Die routine krijgt als parameters:
    Control: het te re-sizen item; VFactor en HFactor: de zoom factoren; L, W, H, T: de originele afmetingen en posities van het item; S: de originele fontsize van het item.

    Die routine geeft een boolean terug die ofwel de waarde
    false geeft: de callback routine doet de re-sizing NIET,
    ofwel de waarde
    true geeft: de callback routine heeft de re-sizing gedaan.

    De routine zelf ziet er bv zo uit:
    Code:
    function ResizeCallbackFunction(Control: TControl; VFactor, HFactor: real; L, W, H, T
    {$IFDEF FONTRESIZE}
      , S
    {$ENDIF}
      : integer): boolean;
    var Tsg: TStringGrid;
    begin
      Result := false; // resizing not handled here = default
    
      if Control.Name = 'StringGrid3' then // special case
      begin
        Result := true; // resizing handled here
    
        // calculate new values
        W := Trunc(HFactor * W);
        H := Trunc(VFactor * H);
        L := Trunc(HFactor * L);
        T := Trunc(VFactor * T);
    
        // and use them
        Tsg := Control as TStringGrid;
        Tsg.Left := L;
        Tsg.Top  := T;
        Tsg.DefaultColWidth  := W + 20; // to be sure column 1 is always invisible
        Tsg.DefaultRowHeight := (H div Tsg.RowCount);
        Tsg.Width  := W;
        Tsg.Height := H;
      end;
    end;
    De callback routine wordt geactiveerd in de 'Create' call:
    Code:
    MyResize_ := TMyResize.Create(Self, ResizeCallbackFunction);
    Compiler directives

    De unit gebruikt 2 compilerdirectives:
    FONTRESIZE: de font.size property van ieder item wordt ook aangepast aan de zoofactoren
    STRINGGRIDRESIZE:
    ook stringgrids worden mee geresized. Het standaardgedrag is wel: alle kolommen en alle rijen dezelfde afmetingen.


    Veel plezier!
    Vriendelijke groeten,
    Dany

  2. #2
    Hi,
    Vergeten te vermelden: in sommige gevallen is het nodig om 2x "MyResize_.Resize(Self)" aan te roepen in de OnResize event, met name die waarin de positie van componenten afhangt van de positie van andere, bv een TUpDown associated met een TEdit component.
    Vriendelijke groeten,
    Dany

  3. #3
    I7 7700K Window10 Pro Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    1,754
    2x dezelfde routine is een beetje dubbel
    moet je dan niet het onchange event opvangen en de resize laten uitvoeren.

    Ook het resizen gaat niet helemaal goed met een Tupdown: Click image for larger version. 

Name:	resize.PNG 
Views:	6 
Size:	9.6 KB 
ID:	7655

    Peter
    Last edited by Wok; 12-Oct-17 at 21:20.
    Nog steeds in Delphi2010 & Lazarus. 1.6.4

  4. #4
    Ook het resizen gaat niet helemaal goed met een Tupdown
    Inderdaad, nog een foutje.

    Hierbij de gecorrigeerde versie: Rcs_Resize.pas.

    Merk op dat een TEdit niet ge-resized wordt (tenzij de "FONTRESIZE" compilerdirective aanstaat), daar zijn 'AutoSize' property aangezet wordt. De fout was dat de TUpDown wel geresized werd in dat geval...
    Vriendelijke groeten,
    Dany

  5. #5
    Quote Originally Posted by Wok View Post
    2x dezelfde routine is een beetje dubbel
    moet je dan niet het onchange event opvangen en de resize laten uitvoeren.
    Ik zoek even uit hoe het beter kan...
    Vriendelijke groeten,
    Dany

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •