Det er almindelig typecasting. TRoundToRange er defineret som et heltalsinterval indenfor grænserne af en integer - og så kan man sagtens typecaste. Du kan evt. prøve at følge funktionen ud i VCL'et ved at klikke på RoundTo mens du holder CTRL nede. Så ser du hvordan den er defineret.
Typecasting bruger jeg også når jeg bekvemt bruger TStrings.Objects til at gemme et heltal sammen med en tekst (som regel en tekst og den tilhørende primørnøgle i en database):
AnInt := 7;
with ComboBox1 do
if ItemIndex >= 0 then
AnInt := integer(Items.Objects[i]);
... eller den anden vej
ComboBox.Items.AddObject('Hej verden',TObject(AnInt));
For objekter er der den lidt blødere variant med "is" og "as" så man ikke får typecastet til noget der ikke nødvendigvis er korrekt.
type
TMyStringList = class(TStringList);
...
// Parameteren burde være aStrings: TStrings men dette her er et eksempel.
procedure DumpList(aObject: TObject);
begin
if aObject is TMyStringList then
with aObject as TMyStringList do
...
end;
Det er lidt kønnere end brutalt at typecaste til klassen (TMyStringList(aObject))