AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi XE2: Probleme mit Umwandlung von Char zu Byte
Thema durchsuchen
Ansicht
Themen-Optionen

XE2: Probleme mit Umwandlung von Char zu Byte

Ein Thema von Helmi · begonnen am 22. Jan 2012 · letzter Beitrag vom 23. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#1

XE2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 20:30
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:
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;
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.

Nun könnt ich aus Text: String einfach Text: AnsiString machen.

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 Text: String lassen.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (22. Jan 2012 um 21:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.589 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 20:45
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:
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;
So ist der Code kürzer, übersichtlicher und Warnungen sollte es auch nicht mehr geben.

Nebenbei:
Deine Variablen solltest du besser ordentlich bezeichnen. Die Bezeichnung Text gibt es in Delphi z.B. schon... Besser sind eindeutige Bezeichner.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 20:51
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.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:01
Aber wie müsst es denn mit String gemacht werden? (falls das überhaupt mit String geht)
Kann den dein LCD-Modul Zeichen anderer Codepages darstellen? Evtl. kannst du deinem LCD-Modul ja in einen "Unicode"-Modus umstellen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.589 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:04
Als ich deine Bytewerte eben noch einmal angeschaut habe, ist mir aufgefallen, dass es noch sehr viel einfacher geht...
Delphi-Quellcode:
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);

  {...}
// EDIT:
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.
Da hast du Recht: Man kann und darf. Man sollte nur nicht.
Aber das ist ja deine Sache. Wenn du das erste Mal damit auf die Nase gefallen bist, siehst du es vielleicht anders.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (22. Jan 2012 um 21:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:05
Aber wie müsst es denn mit String gemacht werden? (falls das überhaupt mit String geht)
Kann den dein LCD-Modul Zeichen anderer Codepages darstellen? Evtl. kannst du deinem LCD-Modul ja in einen "Unicode"-Modus umstellen.
Leider nein - das wär zu einfach gewesen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:18
Delphi-Quellcode:
SetLength(AnsiText, Length(Text));
  if not CharToOem(PChar(Text), PAnsiChar(AnsiText)) then
    AnsiText := AnsiString(Text);
Das wär zu schön um wahr zu sein - sehr schön kurz und so - nur leider passt es nicht ganz!
Z. B. wird "³" (hochgestellte 3) nicht richtig dargestellt)


Da hast du Recht: Man kann und darf. Man sollte nur nicht.
Aber das ist ja deine Sache. Wenn du das erste Mal damit auf die Nase gefallen bist, siehst du es vielleicht anders.
Also wo man mit solche Bezeichner auf die Schnauze fallen könnte (und ich auch schon bin) war in Verbindung mit "with".
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:47
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.589 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:48
Das wär zu schön um wahr zu sein - sehr schön kurz und so - nur leider passt es nicht ganz!
Z. B. wird "³" (hochgestellte 3) nicht richtig dargestellt)
Hmm, das ist auch das einzige Zeichen. Alles andere passt in die Codepage 850. Die hochgestellte 3 steht aber in keiner Codepage an der Stelle. Wenn alles andere korrekt dargestellt wird, könntest du dafür eine Ausnahme machen. Oder du bleibst bei der Arraylösung.
Aber wie sieht es mit den diversen anderen Sonderzeichen aus? Vielleicht würden diese mit CharToOem ansonsten alle schon funktionieren.

Also wo man mit solche Bezeichner auf die Schnauze fallen könnte (und ich auch schon bin) war in Verbindung mit "with".
Benenne den Parameter Text einfach mal um. Normalerweise würdest du dann Kompilierfehler an den Verwendungsstellen bekommen. Da Text aber eine Eigenschaft des Formulars ist, funktioniert es einfach nur nicht mehr...

Anderes Problem: Refactoring
Delphi-Quellcode:
procedure TForm185.Test(Text: string);
begin
  ShowMessage(Text);
end;
Extrahiere einfach mal die Zeile in der Methode. Was kommt heraus? Richtig, das falsche...
Delphi-Quellcode:
procedure TForm185.Test(Text: string);
begin
  ExtractedMethod;
end;

procedure TForm185.ExtractedMethod;
begin
  ShowMessage(Text);
end;
Der extrahierte Code kompiliert aber leider aufgrund der Benennung...
Und nun bemerke den Fehler bei einem etwas komplexeren Code sofort...

// EDIT:
OK bei text mag es noch gehen. Bei Caption wird es aber schon kritisch, da auch ein Formular diese Eigenschaft hat.
Ein Formular hat auch die Eigenschaft Text.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Xe2: Probleme mit Umwandlung von Char zu Byte

  Alt 22. Jan 2012, 21:56
Hmm, das ist auch das einzige Zeichen. Alles andere passt in die Codepage 850. Die hochgestellte 3 steht aber in keiner Codepage an der Stelle. Wenn alles andere korrekt dargestellt wird, könntest du dafür eine Ausnahme machen. Oder du bleibst bei der Arraylösung.
Aber wie sieht es mit den diversen anderen Sonderzeichen aus? Vielleicht würden diese mit CharToOem ansonsten alle schon funktionieren.
Also alle anderen Zeichen schauen gut aus - bis eben das eine.
Ich hab aber jetzt kein Problem damit das mit der Arraylösung zu machen

Wo schaust du bezüglich der Codepage nach?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  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 17:05 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