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:
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!
Bookmarks