Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi unverständlicher DCC-Fehler E2506 (https://www.delphipraxis.net/132817-unverstaendlicher-dcc-fehler-e2506.html)

BlackSeven 8. Jan 2011 09:53

AW: unverständlicher DCC-Fehler E2506
 
Zitat:

A['123'] := 'abc'; -> [DCC Error] Unit1.pas(61): E2010 Incompatible types: 'Integer' and 'string'
A['456'] := 'def';
A['alfred'] := 'xyz';
Ich bin davon ausgegangen, dass überladene Array-Properties unterstützt werden, bekomme aber einen Fehler unter Delphi XE.
Erlich gesagt, habe ich diese bisher noch nicht benötigt. Mache ich da etwas falsch?

himitsu 8. Jan 2011 11:04

AW: unverständlicher DCC-Fehler E2506
 
Funktionieren sollte dieses.

Wie hast du es denn deklariert?

BlackSeven 8. Jan 2011 14:58

AW: unverständlicher DCC-Fehler E2506
 
Zitat:


Delphi-Quellcode:

program Project1;

uses
  SysUtils, AssocArray;

type
  TStringAssocArray = TAssocArray<String>;

var
  A: TStringAssocArray;

begin
  A['123'] := 'abc';

end.


Ich habe die Unit "AssocArray" eingebunden und Dein Testprogramm verwendet. :?:

himitsu 8. Jan 2011 16:25

AW: unverständlicher DCC-Fehler E2506
 
Ups, da hatte ich was falsch verstanden. :oops:

OK, so wie es aussieht, hat Emba mal wieder Mist gebaut, welcher sich auch schon in Delphi 2010 nachvollziehen läßt.

Irgendwie wird bei direkten Angaben von Werten immer nur das zuerst deklarierte Property erkannt.
Delphi-Quellcode:
var MyArr: TAssocArray<String>;

MyArr['123'] := ...;
Nimmt man Variablen, dann klappt es.
Delphi-Quellcode:
var MyArr: TAssocArray<String>;
  S: String;
S := '123';
MyArr[S] := ...;
Auch sowas wie
Delphi-Quellcode:
MyArr[String('123')]
hilft nix.


Meine einzig mögliche Antwort ist aktuell also:
Toll gemacht Emba ... wieder was, welches nicht mehr funktioniert. :thumb:

Die einzige Lösung wäre, wenn man statt der überladenen Property nun nur noch ein Property nutzt, welches als Parameter einen Variant besitzt und man dann intern die entsprechenden Varianten Anhand des Variant-Inhalts ausführt.
Oder man mißhandelt wieder mal die Record-Operatoren und bastelt sich einen gemischten Parameter-Typen.
Allerdings sind beide Varianten zwar möglich, aber sie sind keine "optimale" Lösung.

Schön wäre es, wenn Embarcadero dieses reparieren würde.
(aber aus Erfahrung passiert sowas eher garnicht oder man muß sich die Bugfixes mit der nächsten Delphi-Version teuer erkaufen)

USchuster 9. Jan 2011 17:19

AW: unverständlicher DCC-Fehler E2506
 
Zitat:

Zitat von himitsu (Beitrag 1073282)
Schön wäre es, wenn Embarcadero dieses reparieren würde.

Hilfreich dafür wäre ein QC Report mit folgendem Testcase und dem Hinweis Regression.

Delphi-Quellcode:
program GenericsMultipleDefaultPropertiesTest;

{$APPTYPE CONSOLE}

type
  TAssocArray<T> = record
  private
    function GetNamedValue(const AName: string): T;
    function GetValue(AIndex: Integer): T;
    procedure SetNamedValue(const AName: string; const AValue: T);
    procedure SetValue(AIndex: Integer; const AValue: T);
  public
    property Value[AIndex: Integer]: T read GetValue write SetValue; default;
    property Value[const AName: string]: T read GetNamedValue write SetNamedValue; default;
  end;

{ TAssocArray<T> }

function TAssocArray<T>.GetNamedValue(const AName: string): T;
begin
  Result := Default(T);
end;

function TAssocArray<T>.GetValue(AIndex: Integer): T;
begin
  Result := Default(T);
end;

procedure TAssocArray<T>.SetNamedValue(const AName: string;
  const AValue: T);
begin
//
end;

procedure TAssocArray<T>.SetValue(AIndex: Integer; const AValue: T);
begin
//
end;

type
  TStringAssocArray = TAssocArray<string>;

procedure Test;
var
  A: TStringAssocArray;
begin
  A['123'] := 'abc';
  if A[0] = A['123'] then;
end;

begin
  WriteLn('PASS'); // on compile
end.
Zitat:

Zitat von himitsu (Beitrag 1073282)
(aber aus Erfahrung passiert sowas eher garnicht oder man muß sich die Bugfixes mit der nächsten Delphi-Version teuer erkaufen)

Eine Lösung wird es sehr wahrscheinlich nur für XE2 geben.

himitsu 9. Jan 2011 17:26

AW: unverständlicher DCC-Fehler E2506
 
Solange Emba in Punkto Datenschutz im QC nichts macht, werde ich da nichts mehr posten.
Abgesehn davon, daß ich dort schon Einiges reingestellt hab und dieses dennoch nicht behoben ist.

USchuster 9. Jan 2011 18:42

AW: unverständlicher DCC-Fehler E2506
 
Ich habs als

Report No: 90767 Status: Reported
Regression: E2010 with multiple default properties in a generic type
http://qc.embarcadero.com/wc/qcmain.aspx?d=90767

gemeldet.

Stevie 10. Jan 2011 12:10

AW: unverständlicher DCC-Fehler E2506
 
Zitat:

Zitat von himitsu (Beitrag 1073282)
Die einzige Lösung wäre, wenn man statt der überladenen Property nun nur noch ein Property nutzt, welches als Parameter einen Variant besitzt und man dann intern die entsprechenden Varianten Anhand des Variant-Inhalts ausführt.
Oder man mißhandelt wieder mal die Record-Operatoren und bastelt sich einen gemischten Parameter-Typen.
Allerdings sind beide Varianten zwar möglich, aber sie sind keine "optimale" Lösung.

Delphi-Quellcode:
type
  TAssocArray<T> = record
  private
    function GetNamedValue(const AName: string): string;
    function GetValue(AIndex: Integer): string;
    procedure SetNamedValue(const AName: string; const AValue: string);
    procedure SetValue(AIndex: Integer; const AValue: string);
  public
    property Value[AIndex: Integer]: string read GetValue write SetValue; default;
    property ValueByName[const AName: string]: string read GetNamedValue write SetNamedValue;
  end;
*fixed*

Assarbad 10. Jan 2011 12:14

AW: Re: unverständlicher DCC-Fehler E2506
 
Zitat:

Zitat von jaenicke (Beitrag 904875)
Derweil gibts ja C# um Generics zu genießen. :mrgreen:

Oder C++ mit Templates. Himmlisch ... speziell mit Boost. :tongue:

himitsu 10. Jan 2011 14:47

AW: unverständlicher DCC-Fehler E2506
 
Zitat:

*fixed*
Wenn man das so macht, dann sind die ganzen überladenen Default-Property nutzlos.
(sind sie jetzt zwar auch, da man sie nicht mehr nutzen kann)

Also ich würde diese gerne schon noch verwenden können.
Wobei ich es schonmal schade finde, daß man sowas (früher) nur bei den Defaultproperty und nicht bei allen Property nutzen konnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Seite 2 von 3     12 3      

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