Ce qui compte ici c'est de choisir une variable publique arbitraire de la classe qui soit accessible directement en tant que variable (style Sorted:boolean read FSorted ) et non en tant que fonction (style Count:Integer read GetCount) ; on choisit ici Sorted pour la classe TStringList.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| procedure TForm1.Button7Click(Sender: TObject);
procedure AfficheCount(List:TStringList);
begin
ShowMessage( IntToStr(List.Count) );
end;
begin
with TStringList.Create do
try
Add('ESSAI');
Add('ESSAI2');
Add('ESSAI3');
AfficheCount( TStringList( Integer(@Sorted) - Integer(@TStringList(nil).Sorted) ) ); // just for fun!!!
finally
Free;
end;
end; |
Mais que fait :
TStringList( Integer(@Sorted) - Integer(@TStringList(nil).Sorted) )
@Sorted : calcule l'adresse absolue de la variable Sorted du TStringList
@TStringList(nil).Sorted : calcule l'adresse absolue de la variable Sorted du TStringList pour un TStringList = nil donc calcule l'offset de Sorted dans le TStringList
Le cast en Integer est là pour faciliter la soustraction des 2 adresses (adresse absolue de Sorted - offset de Sorted = adresse absolue du TStringList)
et on caste ensuite en TStringList pour "retrouver" le type d'origine (et pour éviter l'erreur de compil').
je sais ça ne sert à rien donc les râleurs.... et j'entends déjà les "il suffit de créer une variable locale"
Partager