AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

into Record?

Ein Thema von himitsu · begonnen am 27. Aug 2022 · letzter Beitrag vom 5. Sep 2022
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#11

AW: into Record?

  Alt 28. Aug 2022, 17:36
Nja, ansonsten wäre noch die Überlegung für eine Attribut an Variable oder an einem Function-Result, so wie bei [Weak] und Co.
In dem Fall täte es auch eine simple lokale (nicht inline) Variable um das Interface bis zum Methodenende zu halten. Hätte auch den Charme von Abwärtskompatibilität.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: into Record?

  Alt 28. Aug 2022, 17:56
Mal schnell getestet und natürlich zuerst ein kleines Fehlerchen, mit blöder Auswirkung. (nur die lokalen Variablen wurden freigegeben)
Delphi-Quellcode:
type
  TTest = class(TInterfacedObject, ITest)
    Name: string;
    constructor Create(Name: string);
    destructor Destroy; override;
  end;
Delphi-Quellcode:
type
  ITest = interface
  end;

  TTest = class(TInterfacedObject, ITest)
    Name: string;
    constructor Create(Name: string);
    destructor Destroy; override;
  end;

class function TTest.Create(Name: string): ITest;
begin
  Result := inherited Create;
  (Result as TTest).Name := Name;
  ShowMessage('Start ' + Name);
end;

destructor TTest.Destroy;
begin
  ShowMessage('Stop ' + Name);
  inherited;
end;

procedure TForm11.FormCreate(Sender: TObject);
var
  Var1, Var2, Var3, Var4: ITest;
begin
  Var1 := TTest.Create('Var1'); // Start Var1
  var Inline1 := TTest.Create('Inline1'); // Start Inline1
  TTest.Create('Temp1'); // Start Temp1
  Beep;
  if Tag = 0 then
    Var2 := TTest.Create('Var2'); // Start Var2
  if Tag = 0 then
    var Inline2 := TTest.Create('Inline2'); // Start/Stop Inline2
  if Tag = 0 then
    TTest.Create('Temp2'); // Start/Stop Temp2
  Beep;
  if Tag = 0 then begin
    Var3 := TTest.Create('Var3'); // Start Var3
    var Inline3 := TTest.Create('Inline3'); // Start Inline3
    TTest.Create('Temp3'); // Start Temp3
  end; // Stop Temp3/Inline3
  Beep;
  if Tag = 0 then begin
    Var4 := TTest.Create('Var4'); // Start Var4
    var Inline4 := TTest.Create('Inline4'); // Start Inline4
    TTest.Create('Temp4'); // Start Temp4
    Beep;
    begin
      TTest.Create('Temp5'); // Start Temp5
    end; // Stop Temp5
    Beep;
    begin
      TTest.Create('Temp6'); // Start Temp6
      Beep;
      TTest.Create('Temp7'); // Start Temp7
      Beep;
    end; // Stop Temp7/Temp6
    Beep;
    begin
      var Temp8 := TTest.Create('Temp8'); // Start Temp8
      Beep;
      Temp8 := TTest.Create('Temp9'); // Stop Temp8 / Start Temp9
      Beep;
    end; // Stop Temp9
    Beep;
    ShowMessage('Show'); // Show
    Beep;
  end; // Stop Temp4/Inline4
  Beep;
end; // Stop Temp1/Inline1/Var4/Var3/Var2/Var1
Delphi-Quellcode:
class function TTest.Create(Name: string): ITest;
begin
  ShowMessage('Start ' + Name);
  Result := inherited Create;
  (Result as TTest).Name := Name;
end;

    begin
      var Temp8 := TTest.Create('Temp8'); // Start Temp8
      Beep;
      Temp8 := TTest.Create('Temp9'); // Start Temp9 / Stop Temp8
      Beep;
    end; // Stop Temp9

Jo, egal ob mit Begin/End oder nicht ... IF reagiert gleich einheitlich.
$2B or not $2B

Geändert von himitsu (28. Aug 2022 um 18:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: into Record?

  Alt 28. Aug 2022, 23:54
Ohhhh, die neuen Custom Managed Records verhalten sich übrigens ganz anders.
Sie werden "sofort" freigegeben, wenn sie nicht mehr benötigt werden ... nicht erst zum Ende des aktuellen Scopes.


Delphi-Quellcode:
type
  TTest = record
    Name: string;
    constructor Create(S: string);
    class operator Implicit(S: string): TTest;
    class operator Initialize(out Dest: TTest);
    class operator Finalize(var Dest: TTest);
    class operator Assign(var Dest: TTest; const [ref] Src: TTest);
  end;

constructor TTest.Create(S: string);
begin
  Name := S;
  ShowMessage('Create ' + Name);
end;

class operator TTest.Implicit(S: string): TTest;
begin
  Result.Name := S;
  ShowMessage('Impicit ' + Result.Name);
end;

class operator TTest.Finalize(var Dest: TTest);
begin
  ShowMessage('Final ' + Dest.Name);
  Dest.Name := '';
end;

class operator TTest.Initialize(out Dest: TTest);
begin
  Dest.Name := 'Init';
  ShowMessage('Init');
end;

class operator TTest.Assign(var Dest: TTest; const [Ref] Src: TTest);
begin
  if Dest.Name = 'Initthen
    ShowMessage('Assign ' + Src.Name)
  else
    ShowMessage('Assign ' + Src.Name + '>' + Dest.Name);
  Dest.Name := Src.Name;
end;

procedure TForm11.FormCreate(Sender: TObject);
var
  Var1a, Var1, Var2a, Var2, Var3a, Var3, Var4a, Var4: TTest;
begin // Init Var1a..Var4
  Var1a := 'Var1a'; // Init/Implicit (Temp)Var1a / Assign Var1a / Final (Temp)Var1a
  Var1 := TTest.Create('Var1'); // Init/Create (New)Var1 / Assign Var1 / Final (New)Var1
  var Inline1 := TTest.Create('Inline1'); // Init/Create Inline1
  TTest.Create('Temp1'); // Init/Create/Final Temp1
  Beep;
  if Tag = 0 then
    Var2a := 'Var2a'; // Init/Implicit (Temp)Var2a / Assign Var2a / Final (Temp)Var2a
  if Tag = 0 then
    Var2 := TTest.Create('Var2'); // Init/Create (New)Var2 / Assign Var2 / Final (New)Var2
  if Tag = 0 then
    var Inline2 := TTest.Create('Inline2'); // Init/Create/Final Inline2
  if Tag = 0 then
    TTest.Create('Temp2'); // Init/Create/Final Temp2
  Beep;
  if Tag = 0 then begin
    Var3a := 'Var3a'; // Init/Implicit (Temp)Var3a / Assign Var3a / Final (Temp)Var3a
    Var3 := TTest.Create('Var3'); // Init/Create (New)Var3 / Assign Var3 / Final (New)Var3
    var Inline3 := TTest.Create('Inline3'); // Init/Create Inline3
    TTest.Create('Temp3'); // Init/Create/Final Temp3
  end; // ###NOT FInal Temp3 / Final Inline3
  Beep;
  if Tag = 0 then begin
    Var4a := 'Var4a'; // Init/Implicit (Temp)Var4a / Assign Var4a / Final (Temp)Var4a
    Var4 := TTest.Create('Var4'); // Init/Create (New)Var4 / Assign Var4 / Final (New)Var4
    var Inline4 := TTest.Create('Inline4'); // Init/Create Inline4
    TTest.Create('Temp4'); // Init/Create/Final Temp4
    Beep;
    begin
      TTest.Create('Temp6'); // Init/Create/Final Temp6
      Beep;
      TTest.Create('Temp7'); // Init/Create/Final Temp7
      Beep;
    end; // ###NOT Final Temp7/Temp6
    Beep;
    begin
      var Temp8 := TTest.Create('Temp8'); // Init/Create Temp8
      Beep;
      Temp8 := TTest.Create('Temp9'); // Init/Create (New)Temp9 / Assign Temp9>Temp8 / Final (New)Temp9
      Beep;
    end; // NOT Final (Temp8)Temp9
    Beep;
    ShowMessage('Show'); // Show
    Beep;
  end; // ###NOT Final Temp4 / Final Inline4
  Beep;
end; // ###NOT Final Temp1 / Final Inline1/Var4..Var1a
$2B or not $2B
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: into Record?

  Alt 5. Sep 2022, 14:09
Kleine Info am Rande:
SmartPascal bzw. DWScript untrstützt sowas in der Art. Das wäre sicher auch eine schöne Sache für Delphianer:

Delphi-Quellcode:
TMy = class
  FInner: TMyInner;
  property Prop read (FInner.Value);
end;
Theoretisch kann man hier mit ( und ) jeden beliebigen Code aufrufen, der einen Wert des Typen TMyInner zurückgibt (oder der implizit dorthin konvertierbar wäre). Das ist schon manchmal ganz geil, weil das haufenweise unnötige Getter bzw. Setter einspart. Gerade bei indizierten Eigenschaften, die ja nunmal gar kein Feldzugriff so in-line erlauben...
Dennis
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz