Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [done] DEC class xy not found (https://www.delphipraxis.net/142709-%5Bdone%5D-dec-class-xy-not-found.html)

heri 2. Nov 2009 09:14


[done] DEC class xy not found
 
Hatte folgende Fehlermeldung vom DEC 5.2 nach dem Umstieg auf Delphi 2010: "class xy not found"

die Lösung (hier fett) lautet:

class function TDECObject.Identity: LongWord;
var
Signature: {$IFDEF UNICODE}AnsiString{$ELSE}String{$ENDIF};
begin
Signature := StringOfChar(#$5A, 256 - Length(Classname)) + UpperCase(ClassName); //°
Result := CRC32(IdentityBase, Signature[1], Length(Signature) * SizeOf(Signature[1]));
end;


man korrigiere mich bitte falls ich falsch liege.

himitsu 2. Nov 2009 09:44

Re: [done] DEC class xy not found
 
die/eine Lösung lautet nur
Zitat:

Signature: AnsiString;
PS: StringOfChar und UpperCase sind auch UnicodeFunktionen ... schau mal in Units wie AnsiStrings, ob es da AnsiVersionen gibt.

Aber ich war mir sicher, daß es hier auch irgendwo schon eine unicodefähige Version (D2009+) des DEC gibt.


aber eigentlich sieht es so aus, als wenn hier schon alles OK so war? :gruebel:
Code:
Result := CRC32(IdentityBase, Signature[1], Length(Signature) * [color=#ff0000]SizeOf(Signature[1])[/color]);

heri 2. Nov 2009 10:22

Re: [done] DEC class xy not found
 
ich habe diese Funktion jeweils unter D2006 und D2010 getestet und das Result waren jeweils unterschiedliche ID's - entsprechend konnte die Klasse natürlich nicht mehr gefunden werden

Zitat:

"Aber ich war mir sicher, daß es hier auch irgendwo schon eine unicodefähige Version (D2009+) des DEC gibt."
habe ich auch gedacht - muss es doch geben - aber wo?

himitsu 2. Nov 2009 11:03

Re: [done] DEC class xy not found
 
Daß es so unterschiedliche IDs ergibt, das ist schon klar, da die UnicodeDaten ja andere sind.

Aber dennoch sollte es funktionieren ... nur eben nicht Systemübergreifend :roll:



hmmmm ... also, da ClassName unter D2009+ auch Unicode ist und dies hier verwendeten Stringfunktionen auch, könnte es Probleme geben.
Aber wenn (da) der Klassenname nichts Exotisches ist, sollte es dennoch klappen (trotz der Unicode-Ansi-Umwandlung.
Delphi-Quellcode:
Signature: AnsiString;
sollte da vermutlich also schon ausreichen.

heri 2. Nov 2009 12:45

Re: [done] DEC class xy not found
 
ja, so funktionierts:

Delphi-Quellcode:
class function TDECObject.Identity: LongWord;
var
Signature: AnsiString;
begin
Signature := StringOfChar(#$5A, 256 - Length(Classname)) + UpperCase(ClassName); //° 
Result := CRC32(IdentityBase, Signature[1], Length(Signature) * SizeOf(Signature[1]));
end;
thx

Assertor 11. Mai 2010 15:46

Re: [done] DEC class xy not found
 
Hallo heri,

Zitat:

Zitat von heri
Delphi-Quellcode:
class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString;
begin
  Signature := StringOfChar(#$5A, 256 - Length(Classname)) + UpperCase(ClassName);
  Result := CRC32(IdentityBase, Signature[1], Length(Signature) * SizeOf(Signature[1]));
end;

SizeOf(Signature[1]) wird bei festem AnsiString nicht benötigt.

Ich arbeite gerade an der DEC 5.3, die Änderungen werde ich für Abwärtskompatibilität gerne übernehmen.

Gruß,
Assertor

himitsu 11. Mai 2010 16:03

Re: [done] DEC class xy not found
 
Warum eigentlich #$5A und nicht einfach 'Z' ?

Assertor 11. Mai 2010 16:07

Re: [done] DEC class xy not found
 
Zitat:

Zitat von himitsu
Warum eigentlich #$5A und nicht einfach 'Z' ?

;) Frag Hagen, möglich das früher Delphi das nicht geschluckt hat...

In der nächsten DEC wird es so gelöst:
Delphi-Quellcode:
class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString; // using ANSI to keep backward compatibility
begin
  // create signature ('Z' * n + 'TDECCLASSNAME')
  Signature := StringOfChar(AnsiChar(#$5A), 256 - Length(Classname)) +
               AnsiString(UpperCase(ClassName));
  // calc crc for signature
  Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;
Gruß,
Assertor

himitsu 11. Mai 2010 16:30

Re: [done] DEC class xy not found
 
Mir ist nix bekannt, warum 'Z' nicht gehn sollte. :gruebel:


Das müßte auch gehn,
Delphi-Quellcode:
uses ... {$if CompilerVersion >= 20.0}, AnsiStrings{$IFEND};

class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString; // using ANSI to keep backward compatibility
begin
  // create signature ('Z' * n + 'TDECCLASSNAME')
  Signature := StringOfChar('Z', 256 - Length(Classname))
    + UpperCase(AnsiString(ClassName));
  // calc crc for signature
  Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;
wobei es so wohl korrekter wäre
Delphi-Quellcode:
uses ... {$IF CompilerVersion >= 20.0}, AnsiStrings{$IFEND};

class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString; // using ANSI to keep backward compatibility
begin
  // create signature ('Z' * n + 'TDECCLASSNAME')
  Signature := StringOfChar('Z', 256 - Length(Classname))
    {$IF CompilerVersion >= 20.0}
      + UpperCase(UTF8Encode(ClassName));
    {$ELSE}
      + UpperCase(ClassName);
    {$IFEND}
  // calc crc for signature
  Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;
PS: AnsiStrings muß natürlich die letze Unit sein, bzw. zumindestens nach SysUtils stehen.

Warum Emba aber auch soein krankes Spiel mit den AnsiVersionen und mit den Namen der UnicodeVersionen spielen mußte.

function AnsiUpperCase(const S: string): string; ist doch wohl das Krankeste.



Und ich weiß grade nicht, ob im DEC eine *.INC für die CompilerVersionen enthalten ist.

Assertor 11. Mai 2010 16:38

Re: [done] DEC class xy not found
 
Hallo himitsu,

Zitat:

Zitat von himitsu
Mir ist nix bekannt, warum 'Z' nicht gehn sollte. :gruebel:

Das müßte auch gehn,
Delphi-Quellcode:
uses ... {$if CompilerVersion >= 20.0}, AnsiStrings{$IFEND};

class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString; // using ANSI to keep backward compatibility
begin
  // create signature ('Z' * n + 'TDECCLASSNAME')
  Signature := StringOfChar('Z', 256 - Length(Classname))
    + UpperCase(AnsiString(ClassName));
  // calc crc for signature
  Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;

Richtig, ist aber faktisch kein Unterschied und man spart nur ein AnsiChar() - dafür muß man aber IFDEFen und eine weitere Unit einbinden.

Zitat:

Zitat von himitsu
wobei es so wohl korrekter wäre
Delphi-Quellcode:
uses ... {$IF CompilerVersion >= 20.0}, AnsiStrings{$IFEND};

class function TDECObject.Identity: LongWord;
var
  Signature: AnsiString; // using ANSI to keep backward compatibility
begin
  // create signature ('Z' * n + 'TDECCLASSNAME')
  Signature := StringOfChar('Z', 256 - Length(Classname))
    {$IF CompilerVersion >= 20.0}
      + UpperCase(UTF8Encode(ClassName));
    {$ELSE}
      + UpperCase(ClassName);
    {$IFEND}
  // calc crc for signature
  Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;
PS: AnsiStrings muß natürlich die letze Unit sein, bzw. zumindestens nach SysUtils stehen.

Jein. UTF8Encode könnte ja theoretisch den Wert ändern - es geht ja gerade darum, diesen in allen Delphis absolut identisch zu haben. Wobei bei UTF8Encode der ASCII Bereich ja kein Problem darstellt...

Zitat:

Zitat von himitsu
Warum Emba aber auch soein krankes Spiel mit den AnsiVersionen und mit den Namen der UnicodeVersionen spielen mußte.

function AnsiUpperCase(const S: string): string; ist doch wohl das Krankeste.


Und ich weiß grade nicht, ob im DEC eine *.INC für die CompilerVersionen enthalten ist.

Jaja, die Unicode Umstellung war schon was tolles. Und die ganzen halbherzigen Komponenten Portierungen auch (wo nur String > AnsiString und Char > AnsiChar geändert wurde) :mrgreen:

Jup, im neuen DEC 5.3 kommt ein Include was automatisch für alte, jetzige und neue Versionen stimmt. Ist schon fertig.

Gruß,
Assertor


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

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