Execute Delphi News

L'actualité Delphi par http://www.execute.fr RSS « Avant

Utilisation des Records Managés sous Delphi Sydney

Publié le 11/08/2020
Une des grosses nouveauté de Sydney au niveau du compilateur est le support des Records Managés.

Cette fonctionnalité est assez intéressante dans son fonctionnement, elle permet d'appeler une fonction automatiquement pour initialiser un Record et une autre pour faire le ménage.

Prenons un exemple simple.
procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.Add('Hello');
    SL.Add('World');
    ShowMessage(SL.Text);
  finally
    SL.Free;
  end;
end;

dans cet exemple classique (et bidon) j'instancie un StringList qui est détruit à la fin de la procédure...mais voici comment éviter le try/finally/end
type
  TStringListRecord = record
    SL: TStringList;
    class operator Initialize(out R: TStringListRecord);
    class operator Finalize(var R: TStringListRecord);
  end;

class operator TStringListRecord.Initialize(out R: TStringListRecord);
begin
  R.SL := TStringList.Create;
end;

class operator TStringListRecord.Finalize(var R: TStringListRecord);
begin
  R.SL.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TStringListRecord;
begin
  R.SL.Add('Hello');
  R.SL.Add('World');
  ShowMessage(R.SL.Text);
end;

et voilà ! grâce aux deux opérateurs déclarés, TStringListRecord instancie automatiquement un TStringList qui est libéré en fin de procédure car la variable R est locale.

Alors évidemment ça n'a d'intérêt que si vous utiliser (TStringListRecord) à différents endroits, mais ce n'est qu'un exemple...et on peut aussi imager utiliser un <generic> pour faire des choses plus évoluées.
type
  TRecord<T:class,constructor> = record
    Instance: T;
    class operator Initialize(out R: TRecord);
    class operator Finalize(var R: TRecord);
  end;

class operator TRecord<T>.Initialize(out R: TRecord);
begin
  R.Instance := T.Create;
end;

class operator TRecord<T>.Finalize(var R: TRecord);
begin
  R.Instance.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  R: TRecord<TStringList>;
begin
  R.Instance.Add('Hello');
  R.Instance.Add('World');
  ShowMessage(R.Instance.Text);
end;

Pourquoi je n'aime pas les overloads

Publié le 06/12/2019
Je n'ai jamais aimé la possibilité de créer plusieurs fonctions portant le même nom mais avec différents paramètres (overload).

Je viens de taper un code utilisant les RTTI qui exprime bien en quoi cela rend les choses ambiguës

begin
  case TypeInfo.Kind of
    tkInteger: Result := IntToStr(TypeInfo.GetOrd(Instance));
    tkInt64  : Result := IntToStr(PInt64(Instance)^);
  end;
end;


On a ici un code qui cherche à déterminer le type d'une variable pour appeler dans les deux cas la fonction IntToStr()...sauf que dans le premier cas c'est un Integer et dans le second un Int64, ce n'est donc PAS la même fonction qui est invoquée !

function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;


j'aurais préféré deux fonctions distinctes

function IntToStr(Value: Integer): string;
function Int64ToStr(Value: Int64): string;


voir, éventuellement

function IntToStr(Value: Integer): string; inline; // appelle Int32ToStr()
function Int32ToStr(Value: Int64): string;
function Int64ToStr(Value: Int64): string;

ARC est mort, vive Rio 10.3

Publié le 26/10/2018
Marco en parle, c'est donc officiel, Embarcadero abandonne progressivement la gestion de la mémoire via ARC (Comptage de Référence Automatique)

je viens de traduire l'article de Marco.

La confiance est là

Publié le 01/08/2018
Je viens de suivre la conférence en ligne des MVP chez Embarcadero

je ne vous dirais rien de ce qu'il s'y est dit puisque tout cela est confidentiel, mais sachez que j'ai pleinement confiance dans ce qui est à venir :)

Paul

Delphi Community Edition !

Publié le 19/07/2018
Nouvelle version (non) commerciale de Delphi : Community Edition.

Avec cette nouvelle version gratuite vous avez toutes les fonctionnalités de la version Pro :
- Win32/64 VCL et Firemonkey
- OSX
- iOS32/64
- Android ARM

par contre vous ne devez pas gagner plus de 5.000$ par an pour avoir le droit d'utiliser ce produit gratuitement.