Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Begrenzter String, TList und InterfaceObject > Datenmüll (https://www.delphipraxis.net/186522-begrenzter-string-tlist-und-interfaceobject-datenmuell.html)

Sir Rufo 9. Sep 2015 10:23

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Zitat:

Zitat von mkinzler (Beitrag 1315265)
Das dürfte nicht erlaubt sein. Diese würden mit großer Wahrscheinlichkeit auch nicht so einfach unter XE8 funktionieren.

Doch, funktionieren tut das, aber das Veröffentlichen ist (mir zumindest) nicht erlaubt.

stahli 9. Sep 2015 10:23

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Schreib doch mal MEissing an und frage nach einer schnellen Lösung.

Sir Rufo 9. Sep 2015 10:35

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Es gibt aber Abhilfe
Delphi-Quellcode:
program dp_186522;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.Generics.Collections,
  System.SysUtils;

type
  TMyID = string[ 10 ];

  IMyObject<T> = interface
    [ '{22041332-1221-4EBD-BBC5-1AF3C914E08B}' ]
    procedure AddValue( const Value: T );
    function GetValue( const Index: Integer ): T;
  end;

  TMyObject<T> = class( TInterfacedObject, IMyObject<T> )
  strict private
    internalList: TList<T>;
  public
    constructor Create;
    destructor Destroy; override;

    procedure AddValue( const Value: T );
    function GetValue( const Index: Integer ): T;
  end;

  TWrap<T> = record
  private
    FValue: T;
  public
    class operator implicit( const a: T ): TWrap<T>;
    class operator implicit( const a: TWrap<T> ): T;
  end;

  TMyWrappedObject<T> = class( TInterfacedObject, IMyObject<T> )
  strict private
    internalList: TList<TWrap<T>>;
  public
    constructor Create;
    destructor Destroy; override;

    procedure AddValue( const Value: T );
    function GetValue( const Index: Integer ): T;
  end;

  { TMyObject<T> }

procedure TMyObject<T>.AddValue( const Value: T );
begin
  internalList.Add( Value );
end;

constructor TMyObject<T>.Create;
begin
  inherited;
  internalList := TList<T>.Create;
end;

destructor TMyObject<T>.Destroy;
begin
  internalList.Free;
  inherited;
end;

function TMyObject<T>.GetValue( const Index: Integer ): T;
begin
  Result := internalList[ index ];
end;

{ TWrap<T> }

class operator TWrap<T>.implicit( const a: T ): TWrap<T>;
begin
  Result.FValue := a;
end;

class operator TWrap<T>.implicit( const a: TWrap<T> ): T;
begin
  Result := a.FValue;
end;

{ TMyWrappedObject<T> }

procedure TMyWrappedObject<T>.AddValue( const Value: T );
begin
  internalList.Add( Value );
end;

constructor TMyWrappedObject<T>.Create;
begin
  inherited;
  internalList := TList < TWrap < T >>.Create;
end;

destructor TMyWrappedObject<T>.Destroy;
begin
  internalList.Free;
  inherited;
end;

function TMyWrappedObject<T>.GetValue( const Index: Integer ): T;
begin
  Result := internalList[ index ];
end;

procedure Test1;
var
  ID1, ID2: TMyID;
  Liste  : TList<TMyID>;
begin
  ID1   := ( 'ABCDEFGHIJ' );
  Liste := ( TList<TMyID>.Create );
  Liste.Add( ID1 );
  ID2 := ( Liste[ 0 ] );
  Assert( ID1 = ID2 );
end;

procedure Test2;
var
  ID1, ID2: TMyID;
  MyObj1  : IMyObject<TMyID>;
begin
  ID1    := ( 'ABCDEFGHIJ' );
  MyObj1 := ( TMyObject<TMyID>.Create );
  MyObj1.AddValue( ID1 );
  ID2 := ( MyObj1.GetValue( 0 ) );
  Assert( ID1 = ID2 );
end;

procedure Test3;
var
  ID1, ID2: TMyID;
  MyObj1  : IMyObject<TMyID>;
begin
  ID1    := ( 'ABCDEFGHIJ' );
  MyObj1 := ( TMyWrappedObject<TMyID>.Create );
  MyObj1.AddValue( ID1 );
  ID2 := ( MyObj1.GetValue( 0 ) );
  Assert( ID1 = ID2 );
end;

begin
  try
    Test1;
    Test2; // fails
    Test3; // pass
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  Readln;

end.

QStorm 9. Sep 2015 11:44

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Zitat:

Zitat von Sir Rufo (Beitrag 1315264)
Zitat:

Zitat von QStorm (Beitrag 1315263)
Kann einer bitte die Units "System.Generics.Collections" und "System.Generics.Defaults" von Delphi XE7 posten?

Glaube ich mal eher nicht, denn die sind urheberrechtlich geschützt!

Kann man sich die mit einer XE8 Lizenz irgendwo runterladen, ohne Delphi neu zu installieren (ist ja im Kaufpreis von XE8 enthalten)?

himitsu 9. Sep 2015 12:10

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Nein, ist nur verschlüsselt im Setup enthalten. (natürlich installieren mit der XE7-Lizenz)

In VM/Sandbox installieren?

QStorm 10. Sep 2015 13:48

AW: Begrenzter String, TList und InterfaceObject > Datenmüll
 
Ich danke euch allen für die Antworten und Abhilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz