![]() |
String in BDS 2006 = AnsiString in RAD 2009?
Hallo,
ist vielleicht eine blöde Frage, aber ist String in BDS 2006 gleich AnsiString in Rad 2009? Oder, gibt es da einen Unterschied? Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Jein, in Delphi vor D2009 ist String ein "virtueller" Typ der je nach Inhalt/Einstellung entweder ein klassischer Pascalstring ( ShortString) oder ein AnsiString ist. In d2009 ist String mit UnicodeString gleichzusetzen und die beiden anderen Typen müssen explizit deklariert werden.
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo mkinzler,
ich frage, wegen den EndString und StartString im AdPacket von AsyncPro die scheinen nicht mehr richtig erkannt zu werden. Normaler weise gebe ich dort immer #2 ein für STX und #3 für ETX ein, aber diese werden nicht mehr erkannt und deshalb wird kein OnStringPacket-Event mehr ausgelöst. Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
D2007-string = D2007-AnsiString = D2009-AnsiString <> D2009-string = D2009-UnicodeString Wobei man mit AnsiString unter Delphi 2009 aufpassen muss. So gibt es z.B. zwar die Pos-Funktion auch für diese, nur nutzt der Compiler lieber die Unicode-Version. Der Compiler wandelt also den AnsiString zuerst in einen UnicodeString um, sucht nach dem Sub-String und liefert die Unicode-Position zurück, die sich von der Ansi-Postition unterscheiden kann. Da können schöne Zugriffsverletzungen entstehen. Also besser den Code nicht "ansifizieren" sondern lieber auf Unicode umstellen, da das einiges an Kopfschmerzen verhindert und man nebenbei all die Schlampereien und den Missbrauch von AnsiStrings als Byte-Array bereinigt. |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Wobei man allerdings darauf verzichten sollte, in Delphi 2009 generell alle Strings nach AnsiStrings umzuändern. Einen AnsiString sollte man nur dort verwenden, wo man auch in D1-D2007 einen AnsiString hätte verwenden sollen.
AsyncPro ist ein typischer Fall wo AnsiStrings benötigt werden, da die Protokolle meist auf ANSI-Daten aufbauen. Es kann gut sein, daß ich in meiner Delphi 2009 Konvertierung von AsyncPro noch ein paar Dinge übersehen habe. Da steckt insgesamt schon viel Arbeit dahinter, weil bei TurboPower häufig AnsiString für Dinge verwendet worden sind, die eigentlich ein normaler String hätten sein sollen, und umgekehrt. |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo,
@jbg: nein, den Compiler-Schalter setze ich nicht ein, es geht um eine ältere Komponente(AsynPro). Wo ein string in einem AnsiString geändert worden ist, die Komponente aber sich nicht gleich wie mit einem alten String verhält. Aber die Informationen sind schon sehr interessant. @Lasse2002: Du hast die Konvertierung auf D 2009 vorgenommen? Sind die Komponenten getestet, oder sind die String und Char mit Suchen und Ersetzen in AnsiString und AnsiChar geändert worden? Ein Fehler hatte ich schon gefunden und zwar können sie nicht compiliert und installiert werden, weil in der Unit: AdFaxCvt in der USES – Anweisung: Windowsm steht. Das m muss durch ein Komma ersetzt werden. Zitat:
Wenn ich den Fehler finde und in beseitige, bis Du an dem Ergebnis interessiert? Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
Zitat:
Zitat:
![]() |
Re: String in BDS 2006 = AnsiString in RAD 2009?
@jbg
Zitat: Spielst du hier auf {$H+/-} an? Ja, es gibt (hirnamputierte) Leute, die den tatsächlich einsetzen. Ansonsten ist string[255] Zitat Ende Könntest du bitte auch erläutern was es mit dem Compilerschalter auf sich hat? Und mir wurde eingetrichtert, das ich solche Deklarationen (String[zahl]) im Hinblick auf die Sicherheit tunlichst unterlassen sollte!? Trotz NoExecute, NX und DEP dürfte sich doch daran nichts geändert haben, oder doch? |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo richard_boderich,
Zitat:
Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo mkinzler,
ich hätte gerne einen Compiler-Schalter, wo man selber bestimmen kann was man will. Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Da hat sich CG aber dagegen entschieden
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Und das aus guten Gründen. Es mag auf den ersten Blick recht einfach aussehen, einfach die Strings hin- und herzuschalten. Aber auf einen zweiten Blick nimmt das grässliche Ausmaße an. Was ist, wenn Unit A eine Klasse mit einer virtuellen Methode definiert, die einen "string=UnicodeString" Parameter hat. Unit B wird dann mit "string=AnsiString" kompiliert, leitet von der Klasse ab und überschreibt die virtuelle Methode. Der Compiler würde nun eine Typeninkompatiblität anprangern. Gut, denkt man, dann ändere ich die Ableitung einfach in "UnicodeString" ab. Das funktioniert aber nur solange, bis jemand auf die Idee kommt, Unit A mit "string=AnsiString" zu kompilieren. Bei zwei Units mag das sogar noch machbar sein, aber wenn man dann mehrere hundert Units hat, die voneinander abhängen, will ich ganz bestimmt nicht der Entwickler sein, der die Schreiben und Warten muss. Ganz zu schweigen, von der Unleserlichkeit des Codes. Was bedeutet "string" nun in dieser Unit, in diesem Abschnitt, in dieser Zeile.
Das nächste Problem besteht darin, dass die RTL und VCL Unicode sind. Man müsste also um ständiges Konvertieren, was zu String-Zeichen-Index Problemen führt, zu vermeiden, eine RTL und VCL für AnsiString bereitstellen. Am besten noch gemischt. CodeGear wäre da zwar ein wenig beschäftigt und vor allem der (Telefon/Email-)Support würde in der Flut an Anfragen (warum geht dies und das nicht, was ist jetzt wieder los) untergehen. Aber selbst das würde man sicherlich irgendwie in den Griff bekommen. Bleiben also nur noch die ganzen Drittanbieter von Komponenten. Die wären dadurch nämlich auch dazu verdonnert, ihre Package für RTL/VCL Unicode, RTL-Unicode/VCL-AnsiString, RTL-AnsiString/VCL-Unicode, RTL/VCL AnsiString zu kompilieren. Und ich bin mir ganz sicher, dass die dabei entweder drauf gehen, oder sich auf eine Variante "spezialisieren". Auch betroffen wären die Events die in der DFM verknüpft sind. Der Event-Typ wurde mit "string=UnicodeString" definiert und die Formular-Unit mit "string=AnsiString". Ich wünsche dann viel Spaß beim Suchen nach der Zugriffsverletzung, da die Events zur Laufzeit ohne Typenprüfung zugewiesen werden. Es gibt da noch ein paar weiter Gründe, die kann man sich aber aus Allen Bauers Blog-Eintrag selbst erlesen. |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo jbg,
natürlich gibt es gute Gründe von CG keinen Compiler-Schalter anzubieten für die String-Verwaltung, nur meine Situation stellt sich wie folgt dar. Ich setze folgende Komponenten ein 1. AsynPro das durch Freiwillige wie Lasse 2002 umgestellt wird auf die neuen String-Funktionen. 2. FibPlus für diese Komponente liegt noch keine Version für 2009 vor. Das Bedeutet jetzt für mich, dass ich bei Datenbanken nach wie vor mit der BDS 2006 arbeite und bei der Datenübertragung mit einer RS 232 Schnittstelle feststellen muss das einige Funktionen nicht oder nicht in der gewünschten Form funktionieren. Mir steht zwar von beiden Komponenten der Quellcode zur Verfügung, aber ich habe erbliche Schwierigkeiten einen Quellcode zu ändern den ich nicht selber geschrieben habe. Wenn es einen Compiler-Schalter geben würde, dann könnte man so vorgehen, dass man die Strings an einer zentralen Stelle ändert und wenn die Komponenten Delphi 2009 fähig sind einfach rausnimmt und gut ist. Man ist ja nicht gezwungen den Schalter zu verwenden, aber gerade in der Übergangszeit hätte er doch geholfen. Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Dann macht man einfach diesen Compilerswitch an den Anfang der Unit und schon isse D2009 fähig - war ja einfach :stupid:
Dann geht das Gemecker los, sobald man (in der nächsten Version) den Compilerswitch entfernt. Ist also im Grunde nur eine Verlagerung. Der Witz ist doch Gerade, dass unter D2009 jetzt alles Unicode ist, und du nicht im Code nachdenken musst "Hmm, wenn der Entwickler den Switch einmsetzt muss ich das machen sonst das, also schnell ein IFDEF ..." Und wenn du jetzt sagt von wegen "sanfterer Übergang": Das in Unicode ein Buchstabe nicht immer 1 Byte hat, war vorher klar. Dass D2009 Unicode-enabled sein wird, auch. Dass Codestellen, die auf ersters vertrauen, auf zweiterm nicht laufen, war also nur logisch. Zugegeben, es fehlt noch die rote Unterstreichung im Code ;) Ich kann deinen Ärger aber natürlich nachvollziehen. Aber guck dir mal die WinAPI an, die durften nie so einen Schnitt machen ==> *wuppdi* machen wir einfach von jeder Funktion eine A und eine W Variante :mrgreen: (Ich hab werder Delphi, noch muss ich mich damit rumschlagen, das sind nur meinee 2 cents :P ) Edit: P.S.: Freu dich schonmal, wenn Integer auch mal 64 bit haben kann ;) Du kannst ja schonmal durchgehen und alle Codestellen markeiren, die annehmen dass sizeof(Integer)=4 oder auf die absurde Idee kommen, man könnte einen Integer nach TColor casten ;) Btw.: Für diese Fällte sollte dann ein LogInt/LongWord genommen werden, der sollte immer 32 bit sein und bleiben ;) |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo jfheins,
also ich erfand die Umstellung von 16 Bit nach 32 Bit nicht so schlimm wie jetzt die Umstellung auf UniCode, aber vielleicht bin ich auch mittlerweile einfach zu alt. Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
Was Probleme machen wird ist die Annahme SizeOf(Integer) = SizeOf(Pointer). Wer also einen Pointer in einen Integer Typecastet und dann etwas Pointer-Arithmetik betreibt wird leichte Probleme beim größeren Adressraum bekommen. Dafür hat Microsoft die Typen DWORD_PTR, INT_PTR, LONG_PTR usw. eingeführt. Aber man kann ab Delphi 2009 hierfür ja auch (endlich) PByte benutzen, oder man macht es eben mit PAnsiChar. |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
wäre das dann nicht der Todesstoß? Ab diesen Zeitpunkt wäre dann der int <> integer, also eine einfache Portierung oder Verwendung von C/C++ Schnittstellen wäre nicht mehr möglich. Das Coole an dem Integer oder int ist doch, dass er
Bislang überlebte der int jedenfalls die Schritte von B8 --> B16 --> B32. Sollte er jetzt wirklich an B64 den Tod sterben? Die möglichen Portierungsprobleme, wären wohl der Tod von Delphi. Aber es ist müßsam darüber zu spekulieren, da das Orakel gerde in der Sommerfrische verweilt. Schöne Grüße Oreaden |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
Zitat:
![]() |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
![]() ![]() Für Delphi hätte man hoffen können, dass Cardinal (als einziger bereits existierender Typ, der ansatzweise in Frage kommt) auf 64-bit vergrößert wird, damit der Portierungsaufwand nicht so hoch wird... allerdings sieht es nicht danach aus und jeder Komponentenhersteler wird sich für ältere Delphi-Versionen seinen eigenen Ptr(U)Int definieren dürfen. Spätestens bei der Portierung auf 64-Bit wird den Delphi-Entwicklern die bisherige THandle-Definition und -verwendung auf die Füße fallen (Handles sind Pointer, kein Ordinaltyp). Es ist also davon auszugehen, dass bisheriger Delphi-Quellcode relativ oft aufwändig portiert oder neu entwickelt werden muss... |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Hallo,
ihr macht mir ja Freude. Sollte man bei neuen Projekten dazu übergehen eine Unit mit eigenen Typen anzulegen, damit man sie später einfacher konvertieren kann? Bis bald Chemiker |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
NativeInt/NativeUInt ist seit Delphi 2009 (offiziell) dabei. |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
an Deiner Stelle würde ich mir keine allzugroßen Gedanken darüber machen. Der Prozessor und die Architekturen werden bislang noch nicht von Microsoft definiert. Sollte dies jedoch der Fall sein, wird es Zeit auf ein Betriebssystem zu wechseln, welche die aktuellen Anforderungen erfüllen kann. Wünsche noch einen schönen sorgenfreien Abend Oreaden |
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
Zitat:
|
Re: String in BDS 2006 = AnsiString in RAD 2009?
Zitat:
Zitat:
Und bei "normalen" Programmen wird sich die Integerarithmetik nur in sehr geringen maße auf die Performance auswirken (Normal = Kein Number-Crunsher-Aufgaben oder Bildbearbeitung) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr. |
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