Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi VCL Unicode, AnsiString übergeben! (https://www.delphipraxis.net/163862-vcl-unicode-ansistring-uebergeben.html)

Mavarik 19. Okt 2011 14:23

VCL Unicode, AnsiString übergeben!
 
Hallo Zusammen...

Nachdem ich jetzt meine Software auf XE2 umgestellt habe, habe ich an vielen Stellen chinesische Schriftzeichen....

Das Problem liegt warscheinlich hier:

Delphi-Quellcode:
procedure TCustomMaskEditOwn.SetEditText(const Value: Ansistring);
begin
  if GetEditText <> Value then
  begin
    SetTextBuf(PChar(Value)); // <---
    CheckCursor;
  end;
end;
Wie unterdrücke ich beim Typcasten eine interpreation der Zeichen im String?
SetTextBuff erwartet nunmal eine PChar!

Mavarik :coder:

Bernhard Geyer 19. Okt 2011 14:25

AW: VCL Unicode, AnsiString übergeben!
 
Ändere deine Methodensignatur auf String.

DeddyH 19. Okt 2011 14:26

AW: VCL Unicode, AnsiString übergeben!
 
PChar = PAnsiChar bei Delphi < 2009, danach PWideChar. Wenn Du also einen AnsiString verwendest muss es dann wohl explizit PAnsiChar sein.

[edit] Oder besser so wie Bernhard sagt, auf jeden Fall nicht die Typen mischen. [/edit]

Mavarik 19. Okt 2011 14:30

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131277)
Ändere deine Methodensignatur auf String.

Damit verlagere ich das Problem doch nur eine Stufe nach außen, oder?

Ich habe intern doch "nur" AnsiString.. Nur wenn ich mit der VCL "reden" will muss ich die ja an irgend einer Stelle mal von AnsiString an WideString zuweisen!

Mavarik

himitsu 19. Okt 2011 14:30

AW: VCL Unicode, AnsiString übergeben!
 
Oder den String in eine temporäre Variable vom Type String, bzw. bei Übergabe doppelt casten.
Delphi-Quellcode:
SetTextBuf(PChar(String(Value)));
.


Oder du stellst deinen Code auf Unicode um. :stupid:



Wenn du außerhalb einen AnsiString oder einen PAnsiChar an eine String/UnicodeString-Variable, bzw. an soeinen Parameter übergibst, dann konvertiert Delphi das automatisch.


Zitat:

habe ich an vielen Stellen chinesische Schriftzeichen....
Vermutlich?
Delphi sollte dir genau sagen, daß es dort ein Problem gibt. (es müßte eine Compiler-Warnung vorhanden sein)

Bernhard Geyer 19. Okt 2011 14:32

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Mavarik (Beitrag 1131281)
Damit verlagere ich das Problem doch nur eine Stufe nach außen, oder?

Ich habe intern doch "nur" AnsiString.. Nur wenn ich mit der VCL "reden" will muss ich die ja an irgend einer Stelle mal von AnsiString an WideString zuweisen!

Nicht ganz (Abgesehen davon das du "intern" auf Strings (=UnicodeString) umstellen solltest.
Einen AnsiString->Unicodestring "bestraft" dich der Compiler nur mit einer Compilerwarnung (Evtl. Datenverlust), aber Wandlung macht er korrekt. Bei P(Wide/Ansi)Char's kann er das nicht. Da müsstest du selbst mit Hilfsvariablen + 1-2 Codezeilen umschiffen.

Mavarik 19. Okt 2011 14:39

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von himitsu (Beitrag 1131282)
Oder den String in eine temporäre Variable vom Type String, bzw. bei Übergabe doppelt casten.
Delphi-Quellcode:
SetTextBuf(PChar(String(Value)));
.


Oder du stellst deinen Code auf Unicode um. :stupid:



Wenn du außerhalb einen AnsiString oder einen PAnsiChar an eine String/UnicodeString-Variable, bzw. an soeinen Parameter übergibst, dann konvertiert Delphi das automatisch.


Zitat:

habe ich an vielen Stellen chinesische Schriftzeichen....
Vermutlich?
Delphi sollte dir genau sagen, daß es dort ein Problem gibt. (es müßte eine Compiler-Warnung vorhanden sein)

Ups... Der Text ist erst nach dem Quoten da.. Cool... Fehler in der DP?!

Warnings... ja :oops: noch 17900! Ich denke ich gebe es mal auf....

Mavarik

mquadrat 19. Okt 2011 14:41

AW: VCL Unicode, AnsiString übergeben!
 
17.900???? :shock:

Ach herrje.. Alles von der Unicode-Umstellung? Jeden Tag 1000, dann biste in knapp drei Wochen durch :D

himitsu 19. Okt 2011 14:46

AW: VCL Unicode, AnsiString übergeben!
 
War ich wohl schneller mit Editieren, als du mit dem Lesen :mrgreen:

Joar, bei uns in der Software gibt es auch noch gefühlte 2 Milliarden Warnungen, angefangen von nichtinitialisierten Variablen und Results, bis hin zu ein paar dieser Unicodewarnungen (bin auch schon fleißig am entfernen ... im FinalBuilder muß man manchmal ganz schön suchen, bis man den Fehler zwischen den unzähligen Warungen und Hinweisen findet ... das nervt etwas :? )

Mavarik 19. Okt 2011 14:47

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von mquadrat (Beitrag 1131286)
17.900???? :shock:

Ach herrje.. Alles von der Unicode-Umstellung? Jeden Tag 1000, dann biste in knapp drei Wochen durch :D

Das Problem ist die Verschachtelung...

Das beseitigen einer Warnung zieht eine "Rattenschwanz" von Änderungen von Proc zu Proc nach sich...

Ach ja 64Bit kann ich überhaupt nicht compilieren... Da hagelt es nur Interne-Fehlermeldungen vom Compiler... Aber das ist eine andere Geschichte... *heul* 4 Wochen Arbeit... Ergebinss: Besser lassen!

Delphi 6 ist doch sehr schön...

Mavarik

himitsu 19. Okt 2011 14:49

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Mavarik (Beitrag 1131291)
Delphi 6 ist doch sehr schön...

Deswegen gibt es ja auch, beim Kauf von XE/XE2, ein D2007 gratis dazu :mrgreen:

Bernhard Geyer 19. Okt 2011 14:49

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von mquadrat (Beitrag 1131286)
17.900???? :shock:

Ach herrje.. Alles von der Unicode-Umstellung? Jeden Tag 1000, dann biste in knapp drei Wochen durch :D

Erst mal die Warnungen bezüglich String->AnsiString abschalten und dann auf die relevanten konzentrieren.
Den Datenverlust String->AnsiString haben viel bis D2009 mehr oder minder schon immer gehabt solange man auf NT-Systemen gearbeitet hat.

Mavarik 19. Okt 2011 14:54

AW: VCL Unicode, AnsiString übergeben!
 
@himitsu also das doppelte casten funktioniert...

Obgleich ich den Sinn nicht verstehe... Bzw. warum es dann funktioniert!

Vielleicht sollte ich nochmal den original Source nehmen und nicht alle Strings nach AnsiString konvertieren...

Das Problem ist, unsere Software geht davon aus, dass GLOBAL {$H-} gesetzt ist... Da es das ja nicht mehr gibt, habe ich innerhalb von {$H-} Blöcken aus jedem String einen Shortstring gemacht und außerhalb halt zu AnsiString.

Char's hab ich per Hand konvertiert weil zu viele VCL-Override proceduren von eine automatischen Char-AnsiChar Konvertierung betroffen waren.

War vielleicht der falsche Ansatz...

Mavarik

Bernhard Geyer 19. Okt 2011 15:02

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Mavarik (Beitrag 1131295)
@himitsu also das doppelte casten funktioniert...

Obgleich ich den Sinn nicht verstehe... Bzw. warum es dann funktioniert!

Ist ja auch nicht wirklich ein "einfaches" Casten. Hier springt etwas die Compilermagic an und erzeugt kurzfristig einen richtigen (Unicode)String den du dann als PChar verwenden kannst.

Zitat:

Zitat von Mavarik (Beitrag 1131295)
Vielleicht sollte ich nochmal den original Source nehmen und nicht alle Strings nach AnsiString konvertieren...

Wäre vieleicht gut.

Zitat:

Zitat von Mavarik (Beitrag 1131295)
Das Problem ist, unsere Software geht davon aus, dass GLOBAL {$H-} gesetzt ist...

Autsch. Dann liegen dein Problem eher daran das man bei der 16->32-Portierung sich Zeit sparen wollte... Na ja. Irgendwann rächt sich sowas.

Mavarik 19. Okt 2011 15:09

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131298)
Autsch. Dann liegen dein Problem eher daran das man bei der 16->32-Portierung sich Zeit sparen wollte... Na ja. Irgendwann rächt sich sowas.

Nein ich denke das liegt an der 8 Bit-> 32 Bit Portierung! :roll:

Der Sourceode kommt in vielen Teilen noch von Turbo-Pascal!

Mavarik

Bernhard Geyer 19. Okt 2011 15:16

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Mavarik (Beitrag 1131300)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131298)
Autsch. Dann liegen dein Problem eher daran das man bei der 16->32-Portierung sich Zeit sparen wollte... Na ja. Irgendwann rächt sich sowas.

Nein ich denke das liegt an der 8 Bit-> 32 Bit Portierung! :roll:

Der Sourceode kommt in vielen Teilen noch von Turbo-Pascal!

Lange Strings kann Delphi erst mit der 32-Bit Version Delphi2. Unter Delphi1 gab es nur kurze Strings.
Musste damas auch etwas umstellen als ich für die Serielle Kommunikation Strings mißbraucht hatte.
Als ich dann das nach D1 rückportieren musste, hatte ich hier Umstellungsaufwand.

Mavarik 20. Okt 2011 09:16

AW: VCL Unicode, AnsiString übergeben!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131304)
Als ich dann das nach D1 rückportieren musste, hatte ich hier Umstellungsaufwand.

D1 haben wir ausgelassen..

Und denn an den Stellen wo wir es brauchen, explizit {H+} Blöcke eingefügt!

derMischka 10. Jun 2013 13:46

AW: VCL Unicode, AnsiString übergeben!
 
Hallo Maverik,

wenn Du auch noch mit Delphi Versionen <= 7 arbeitest:

http://www.delphipraxis.net/175267-d...ig-machen.html

hab es bis jetzt nur mit Delphi 7 getestet.

der Mischka


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