![]() |
XE2: Probleme mit Umwandlung von Char zu Byte
Hallo,
ich kämpf gerade mit dem Portieren eines in Delphi7-geschriebenen Projektes in Delphi XE2. Darin beschreib ich ein LCD-Modul. Blöderweise kann ich Texte nicht 1:1 an das Modul senden, da einige Sonderzeichen einen anderen Hexwert haben. Dazu hab ich mir damals folgendes Konstrukt gebaut:
Delphi-Quellcode:
Unter Delphi7 hats bestens funktioniert. Unter XE2 leider nein, da die ersetzten Werte z. B. bei "ä" nicht mehr $84, sondern $0084 und damit hat das LCD-Modul Probleme.
procedure TMainForm.LCD_Text_senden(Text: String; Zeilenumbruch: Boolean = false;
leeren: Boolean = false; Schritt: Boolean = false; Verzoegerung: Word = 100); const Chars: array[1..10] of Char = ('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '²', '³', 'µ'); Bytes: array[1..10] of Byte = ($84, $94, $81, $8E, $99, $9A, $E1, $FD, $FE, $E6); var i : Integer; Pos_char : Integer; begin {...} //Sonderzeichen auslesen for i := 1 to length(Text) do begin //prüfen ob Char im Array "Chars" ist Pos_Char := Pos((Text[i]), Chars); //Sonderzeichen vorhanden? - dann durch Byte-Wert ersetzen If Pos_Char > 0 then Text[i] := Chr(Bytes[Pos_Char]); end; {...} end; Nun könnt ich aus
Delphi-Quellcode:
einfach
Text: String
Delphi-Quellcode:
machen.
Text: AnsiString
Aber wie müsst es denn mit String gemacht werden? (falls das überhaupt mit String geht) Dummerweise bekomm ich dann bei anderen Codezeilen (z. b. wo Insert verwendet wird) dann Warnungen (z. B. [DCC Warnung] Unit1.pas(208): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'AnsiString'). Ich würd halt gerne das Ganze auf
Delphi-Quellcode:
lassen.
Text: String
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Wenn du an dein LCD-Modul einen AnsiString schicken musst, kannst du logischerweise auch nicht mit String als Variablentyp arbeiten.
Für mich sieht das so aus, dass du schlicht statt Bytefummelei überall AnsiChar und statt string AnsiString nehmen muss. Natürlich kannst du auch eine lokale AnsiString Variable nehmen und da den übergebenen Wert reinlegen, damit du nach außen direkt UnicodeStrings akzeptieren kannst. Pos würde ich nicht benutzen, da du dann wieder bei Unicode wärst. Scheue dich doch nicht eine Schleife zu benutzen wo es sinnvoll ist. Hier macht Pos nicht wirklich Sinn. Und mit AnsiChar kannst du dir auch die ganzen Casts sparen.
Delphi-Quellcode:
So ist der Code kürzer, übersichtlicher und Warnungen sollte es auch nicht mehr geben.
procedure TMainForm.LCD_Text_senden(Text: String; Zeilenumbruch: Boolean = false;
leeren: Boolean = false; Schritt: Boolean = false; Verzoegerung: Word = 100); const Chars: array[1..10] of AnsiChar = ('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '²', '³', 'µ'); ReplacementChars: array[1..10] of AnsiChar = (#$84, #$94, #$81, #$8E, #$99, #$9A, #$E1, #$FD, #$FE, #$E6); var i, j: Integer; AnsiText: AnsiString; begin {...} AnsiText := AnsiString(Text); //Sonderzeichen auslesen for i := 1 to Length(Text) do for j := Low(Chars) to High(Chars) do if AnsiText[i] = Chars[j] then AnsiText[i] := ReplacementChars[j]; {...} end; Nebenbei: Deine Variablen solltest du besser ordentlich bezeichnen. Die Bezeichnung Text gibt es in Delphi z.B. schon... Besser sind eindeutige Bezeichner. |
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Die Idee das mit einer 2. Schleife zu machen, klingt ganz gut.
Einen normalen String zu schicken ist kein Problem - wird vom Modul sauber erkannt und angezeigt. Nur eben diese Sonderzeichen machen Probleme. Die Bezeichner bleiben so wie sie sind und haben auch ihren Sinn. Ich weiss das Text auch bei Delphi verwendet wird. Aber das hindert nicht daran dass man diese auch selbst verwenden kann/darf. Wenn es Sinn macht dann nutz ich diese. |
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Zitat:
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Als ich deine Bytewerte eben noch einmal angeschaut habe, ist mir aufgefallen, dass es noch sehr viel einfacher geht...
Delphi-Quellcode:
// EDIT:
procedure TMainForm.LCD_Text_senden(Text: String; Zeilenumbruch: Boolean = false;
leeren: Boolean = false; Schritt: Boolean = false; Verzoegerung: Word = 100); var AnsiText: AnsiString; begin {...} SetLength(AnsiText, Length(Text)); if not CharToOem(PChar(Text), PAnsiChar(AnsiText)) then AnsiText := AnsiString(Text); {...} Zitat:
Aber das ist ja deine Sache. Wenn du das erste Mal damit auf die Nase gefallen bist, siehst du es vielleicht anders. ;-) |
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Zitat:
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Zitat:
Z. B. wird "³" (hochgestellte 3) nicht richtig dargestellt) Zitat:
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
OK bei text mag es noch gehen. Bei Caption wird es aber schon kritisch, da auch ein Formular diese Eigenschaft hat. Und wenn du jetzt eine lokale Variable Caption nennst, weiß ich nicht,ob Delphi weiß, was gemeint ist. Und auch wenn es Delphi wissen sollte, würde es eher verwirren.
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Zitat:
Aber wie sieht es mit den diversen anderen Sonderzeichen aus? Vielleicht würden diese mit CharToOem ansonsten alle schon funktionieren. Zitat:
Anderes Problem: Refactoring
Delphi-Quellcode:
Extrahiere einfach mal die Zeile in der Methode. Was kommt heraus? Richtig, das falsche...
procedure TForm185.Test(Text: string);
begin ShowMessage(Text); end;
Delphi-Quellcode:
Der extrahierte Code kompiliert aber leider aufgrund der Benennung...
procedure TForm185.Test(Text: string);
begin ExtractedMethod; end; procedure TForm185.ExtractedMethod; begin ShowMessage(Text); end; Und nun bemerke den Fehler bei einem etwas komplexeren Code sofort... // EDIT: Zitat:
|
AW: Xe2: Probleme mit Umwandlung von Char zu Byte
Zitat:
Ich hab aber jetzt kein Problem damit das mit der Arraylösung zu machen Wo schaust du bezüglich der Codepage nach? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 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