Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Umstig von BDS-2006 -> BDS-2010 (https://www.delphipraxis.net/161827-umstig-von-bds-2006-bds-2010-a.html)

Schucki 22. Jul 2011 17:10

Delphi-Version: 2010

Umstig von BDS-2006 -> BDS-2010
 
Hallo,

ich habe heute versucht meine ersten Schritte mit dem Delphi 2010 zu machen und ich habe so richtig Probleme damit. :(

Ich habe mir unter BDS-2006 eine Unit geschrieben die mir einen Zugriff auf ein COM Port erlaubt. Das Problem ist nun das die alle Sachen als UNICODE behandelt und meine Daten kein UNICODE sind.

Gibt es irgendwo ein Todo wie man erfolgreich auf UNICODE umsteigt? Oder gibt es vlt. sogar einen Schalter wo man sagen kann das bestimmte Sachen eben nicht im UNICODE behandelt werden sollen???



Beste Grüße, Frank.

RWarnecke 22. Jul 2011 17:20

AW: Umstig von BDS-2006 -> BDS-2010
 
Einen Schalter gibt es nicht, dass man UNICODE abschalten kann. Wo genau hackt es denn ? Mein größtes Problem war String, AnsiString und WideString. Ich habe viele meiner alten Units auf AnsiString umgestellt und danach funktionierten diese. Bein WinAPI-Befehlen musst Du nochmals genau nachschauen, da die WinAPI-Befehle in den Units von Delphi immer auf die Unicode-Variante verweisen.

Bernhard Geyer 22. Jul 2011 17:26

AW: Umstig von BDS-2006 -> BDS-2010
 
Auf der Codegear/Emba...-Seite gibts/gabs AFAIK con Nick Hodges ein paar Tuts bezüglich Unicode-Umstiege bei D2009 und neuer.

FredlFesl 22. Jul 2011 17:31

AW: Umstig von BDS-2006 -> BDS-2010
 
Ich bin mit sturem Ersetzen "String"->"AnsiString" sehr weit gekommen. Läuft alles, nur wird vermutlich 188 Mio mal unnötigerweise hin und her konvertiert.

Schucki 22. Jul 2011 17:57

AW: Umstig von BDS-2006 -> BDS-2010
 
Zitat:

Zitat von RWarnecke (Beitrag 1113091)
Wo genau hackt es denn ?

Die Daten werden mit...

Delphi-Quellcode:
function WriteComm( var buf; ByteCount: integer ): DWORD;
begin
  FillChar( TXOverLap, SizeOf( TXOverLap ), 0 );
  WriteFile( hCom, Buf, ByteCount, Result, @TXOverLap );
end;
...über das ComPort ausgesendet. Nur wird immer ein #0 Byte eingefügt...

43 00 53 00 44 00

Nun gehe ich davon aus das es eindeutig an dieser UNICODE Geschichte liegt.


Gruß Frank

jaenicke 22. Jul 2011 18:02

AW: Umstig von BDS-2006 -> BDS-2010
 
Ja, richtig. Denn bei Ansizeichen ist das jeweils zweite Byte in einem Unicodestring immer Null.

Viel hin- und herzukonvertieren sollte da nicht sein. Solange du den String als Datencontainer nutzt, sollte es immer explizit ein AnsiString sein. Erst, wenn du damit etwas machst, muss einmal umgewandelt werden (und natürlich umgekehrt, wenn du Daten an den COM Port übergibst).

Wo da mehr konvertiert werden könnte, fällt mir gerade gar nicht ein.

Schucki 22. Jul 2011 18:15

AW: Umstig von BDS-2006 -> BDS-2010
 
Ja danke für die Antworten...

Und wie bekomme ich nun das Programm dazu alle Daten nicht als UNICODE auszusenden? :?

Gruß Frank

himitsu 22. Jul 2011 18:21

AW: Umstig von BDS-2006 -> BDS-2010
 
Indem du alles was als ANSI versendet werden soll auch als ANSI bereitstellst?

Und genau deswegen sollten Daten, die exportiert/versendet/gespeichert werden sollen
auch nur als statische Typen deklariert sein, damit sich dort niemals etwas verändern kann.

also kein Integer, Cardinal, Char, PChar, String, NativeInt, NativeUInt, Pointer usw.

hoika 22. Jul 2011 21:01

AW: Umstig von BDS-2006 -> BDS-2010
 
Hallo,

TXOverLap als AnsiString definieren.


Heiko

Schucki 25. Jul 2011 11:42

AW: Umstig von BDS-2006 -> BDS-2010
 
Hallo und Danke für Eure Antworten.
So wie ich es nun verstanden habe ist es wohl so das ich meinen gesamten Quelltext durchgehen kann und alle Typen vom Typ String auf AnsiString umstellen muss damit es wieder funktioniert wie es soll.

Zumindest alle Sachen wo ich 8bit Zeichen als Daten verarbeite.

EDIT:

Hmm irgendwie habe ich noch nicht verstanden wann ich nun auf den Typen String und wann auf den Typen AnsiString zu setzen ist. Ich habe gut 80 Hinweise das ich wild hin und her kopiere. :-(

[DCC Warnung] MyTools.pas(1149): W1057 Implizite String-Umwandlung von 'AnsiString' zu 'string'
[DCC Warnung] MyTools.pas(1149): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'AnsiString'

Delphi-Quellcode:
...
  Result:=Result+IntToHex(bytCrc,2)+']';
...

Wie muss das behandelt werden damit die verschwinden?

Gruß Frank

Schucki 29. Jul 2011 08:33

AW: Umstig von BDS-2006 -> BDS-2010
 
Zitat:

Zitat von himitsu (Beitrag 1113099)
Indem du alles was als ANSI versendet werden soll auch als ANSI bereitstellst?

Und genau deswegen sollten Daten, die exportiert/versendet/gespeichert werden sollen
auch nur als statische Typen deklariert sein, damit sich dort niemals etwas verändern kann.

also kein Integer, Cardinal, Char, PChar, String, NativeInt, NativeUInt, Pointer usw.

Ich muss das nochmal aufgreifen da ich allem Anschein nach noch Probleme habe ich kann zwar Sachen aussenden aber die Anwendung läuft nicht rund. Ich habe auch noch 312 Warnungen wegen ANSI<>UNICODE Wandlungen. Das wird der Grund sein :-(

Wie sieht eine Verwendung von statischen Variablen in Delphi aus? Kenne das bisher nur von C.

Bitte helft mir mal auf die Sprünge.
Gruß Frank

jaenicke 29. Jul 2011 08:50

AW: Umstig von BDS-2006 -> BDS-2010
 
Zitat:

Zitat von Schucki (Beitrag 1114068)
Wie sieht eine Verwendung von statischen Variablen in Delphi aus? Kenne das bisher nur von C.

Gemeint ist hier nicht das selbe.
Wenn du in Delphi den Typ PChar benutzt, kann das je nach Delphiversion PAnsiChar oder PWideChar sein. Und String kann AnsiString oder UnicodeString sein. Und auch solche Metatypen wie Integer sind nicht auf eine bestimmte Größe festgelegt.

Mit statisch war hier gemeint, dass du überall explizit PWideChar, LongInt usw. nutzen solltest, damit es keine Missverständnisse geben kann.

Was die Warnungen angeht, da sind vor allem welche wichtig, in denen steht bedenkliche Typumwandlung.

Schucki 29. Jul 2011 15:03

AW: Umstig von BDS-2006 -> BDS-2010
 
Hallo! :)

Ok dann muss ich mich nun darum kümmern das alle Sachen wo ein AnsiString mit Funktionen bearbeitet wird die einen String zurück geben auch wieder in AnsiString gewandelt werden?

Delphi-Quellcode:
...
var astrTmp:AnsiString;

astrTmp:=AnsiString(IntToString(123)));
...
Das wird eine Weile Dauern bis ich alles durch habe... :-(

Gruß Frank

himitsu 29. Jul 2011 15:13

AW: Umstig von BDS-2006 -> BDS-2010
 
Mann kann es auch automatisch umwandeln lassen,
Delphi-Quellcode:
var astrTmp: AnsiString;

astrTmp:=IntToString(123);
aber dann hat man überall die Compilerwarung, vonwegen bedenklicher Typumwandlung (aber sonst geht es).
Dann doch lieber noch das Ansistring() drumrum.

p80286 29. Jul 2011 15:18

AW: Umstig von BDS-2006 -> BDS-2010
 
Da er bisher mit ansistrings gearbeitet hat (hoffentlich!)
sollte ein einfaches ersetzen ": String;" -> "AnsiString" eigentlich reichen.
gleiches gilt auch bei "char" -> "Ansichar"

Gruß
K-H

himitsu 29. Jul 2011 17:13

AW: Umstig von BDS-2006 -> BDS-2010
 
Die Strings umzuwandeln wird halt nicht immer unbedingt ausreichen, da man beim Aufruf externer Funktionen schnell mal Stringumwandlungen drin hat.

IntToStr, Format und Co. snd standardmäßig ANSI und die TStringList gibt es nur als ANSI.
Unit AnsiStrings (ich hoff die hieß so, sollte man also mit eingebunden haben)

k.A. warum Emba die darin enthaltenen Funktionen nicht mit in die Units der jeweiligen Originale aufgenommen hat :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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