AGB  ·  Datenschutz  ·  Impressum  







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

unverständlicher DCC-Fehler E2506

Ein Thema von himitsu · begonnen am 20. Apr 2009 · letzter Beitrag vom 10. Jan 2011
Antwort Antwort
Seite 2 von 3     12 3      
BlackSeven

Registriert seit: 25. Sep 2004
79 Beiträge
 
Delphi XE7 Professional
 
#11

AW: unverständlicher DCC-Fehler E2506

  Alt 8. Jan 2011, 10:53
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: unverständlicher DCC-Fehler E2506

  Alt 8. Jan 2011, 12:04
Funktionieren sollte dieses.

Wie hast du es denn deklariert?
$2B or not $2B
  Mit Zitat antworten Zitat
BlackSeven

Registriert seit: 25. Sep 2004
79 Beiträge
 
Delphi XE7 Professional
 
#13

AW: unverständlicher DCC-Fehler E2506

  Alt 8. Jan 2011, 15:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: unverständlicher DCC-Fehler E2506

  Alt 8. Jan 2011, 17:25
Ups, da hatte ich was falsch verstanden.

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 MyArr[String('123')] hilft nix.


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

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)
$2B or not $2B

Geändert von himitsu ( 8. Jan 2011 um 17:28 Uhr)
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#15

AW: unverständlicher DCC-Fehler E2506

  Alt 9. Jan 2011, 18:19
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.
(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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: unverständlicher DCC-Fehler E2506

  Alt 9. Jan 2011, 18:26
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.
$2B or not $2B
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#17

AW: unverständlicher DCC-Fehler E2506

  Alt 9. Jan 2011, 19:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#18

AW: unverständlicher DCC-Fehler E2506

  Alt 10. Jan 2011, 13:10
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*
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#19

AW: Re: unverständlicher DCC-Fehler E2506

  Alt 10. Jan 2011, 13:14
Derweil gibts ja C# um Generics zu genießen.
Oder C++ mit Templates. Himmlisch ... speziell mit Boost.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: unverständlicher DCC-Fehler E2506

  Alt 10. Jan 2011, 15:47
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:27 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