Results 1 to 7 of 7

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
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    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:	165 
Size:	9.6 KB 
ID:	7655

    Peter
    Last edited by Wok; 12-Oct-17 at 22:20.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  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

  6. #6
    Last edited by Dany; 28-May-18 at 20:08.
    Vriendelijke groeten,
    Dany

  7. #7
    Hoi, er is een nieuwe versie, met wat meer lineair re-size gedrag.

    Het gebruik is iets anders:

    1. Creeer een variabele van het type "TMyResize":
    Code:
    var MyResize_: TMyResize;
    1a. Creeer een boolean variabele bv:
    Code:
    var MyResize_Enabled: boolean;
    2. In het Form.Create event toevoegen:
    Code:
    MyResize_Enabled := false;
    MyResize_ := TMyResize.Create(Self);
    MyResize_Enabled := true;
    3. In het Form.Resize event toevoegen:
    Code:
    if MyResize_Enabled then MyResize_.Resize(Self);
    4. In het Form.Destroy event toevoegen:
    Code:
    MyResizeEnabled := false;
    MyResize_.Free;
    Het toevoegen van variabele 'MyResize_Enabled' is er om te verhinderen dat 'MyResize_.Resize' aangeroepen wordt voordat 'MyResize_' helemaal gecreerd is.


    De 'Create' functie (constructor) signatuur ziet er nu zo uit:
    Code:
    constructor TMyResize.Create(F: TForm; Fnct: TResizeCallbackFunction = nil;  ResizeFont: boolean = false);
    Dus geen compilerdirectives meer nodig. Ook TStringgrids en TDawGrids worden nu altijd meegenomen in het re-sizen. Enkel de textfont is optioneel (zie de ResizeFont parameter).


    De Callback functie heeft ook een andere signatuur gekregen:
    Code:
    TResizeCallbackFunction = function(Control: TControl; VFactor, HFactor: real; L, W, H, T, S, D1, D2: integer): boolean;
    S is de originele Fontsize,
    D1 en D2 gelden enkel voor TStringrids en TDrawGrids en zijn respectievelijk de originele 'DefaultColWidth' en 'DefaultRowHeight' van de grid.
    Last edited by Dany; 20-Jun-18 at 12:24.
    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
  •