AGB  ·  Datenschutz  ·  Impressum  







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

[done] DEC class xy not found

Ein Thema von heri · begonnen am 2. Nov 2009 · letzter Beitrag vom 14. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#1

[done] DEC class xy not found

  Alt 2. Nov 2009, 09:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: [done] DEC class xy not found

  Alt 2. Nov 2009, 09:44
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?
Code:
Result := CRC32(IdentityBase, Signature[1], Length(Signature) * [color=#ff0000]SizeOf(Signature[1])[/color]);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: [done] DEC class xy not found

  Alt 2. Nov 2009, 10:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: [done] DEC class xy not found

  Alt 2. Nov 2009, 11:03
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



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.
Signature: AnsiString; sollte da vermutlich also schon ausreichen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: [done] DEC class xy not found

  Alt 2. Nov 2009, 12:45
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: [done] DEC class xy not found

  Alt 11. Mai 2010, 15:46
Hallo heri,

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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: [done] DEC class xy not found

  Alt 11. Mai 2010, 16:03
Warum eigentlich #$5A und nicht einfach 'Z' ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: [done] DEC class xy not found

  Alt 11. Mai 2010, 16:07
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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: [done] DEC class xy not found

  Alt 11. Mai 2010, 16:30
Mir ist nix bekannt, warum 'Z' nicht gehn sollte.


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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#10

Re: [done] DEC class xy not found

  Alt 11. Mai 2010, 16:38
Hallo himitsu,

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

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 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 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)

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

Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:07 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