Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Codierungsproblem bei AsyncPro Daten empfangen


ibh_compucat - Di 03.06.14 13:33
Titel: Codierungsproblem bei AsyncPro Daten empfangen
Win8.1, XE5, 32 Bit

Hallo,

bei der Inbetriebnahme von AsyncPro gibt es Probleme, Senden läuft einwandfrei, der Empfänger antwortet auch korrekt, aber der aus den zurückgelieferten Bytes zusammengesetzte (Wide)String liefert mir unleserliches Zeug (unicode oder so etwas?). Hier die Abfrage mit:


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ApdDataPacket1StringPacket(Sender: TObject; Data: string);
begin
  Form1.edit1.text := Data;
end;


Das Ganze sieht dann so aus:

ㄼㄱ†㤲㌳㠹〰ㄱ‱㈠㌹㤳〸㸰

Lege ich aber ein ADTerminal mit auf die Form, zeigt das mir die korrekten Zeichenfolge an, also ein Kodierungsproblem.
Was kann ich tun, um zu meinem "richtigen" String (<111 23551 ...... >) zu kommen??
Kann mir da jemand bitte einen Tipp geben?

ibh_compucat

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


WasWeißDennIch - Di 03.06.14 13:39

Data scheint kein String (=UnicodeString ab Delphi 2009), sondern ein AnsiString zu sein. Kannst Du den Parametertyp ändern?


ibh_compucat - Di 03.06.14 13:43

wo kann ich den ändern?
In der Definition der procedure ist Data doch als String deklariert.

ibh_compucat


WasWeißDennIch - Di 03.06.14 13:44

Deshalb ja meine Frage. Ich kenne AsyncPro leider nur dem Namen nach, aber bist Du sicher, dass Du auch die zu Deinem Delphi passende Version installiert hast?


ibh_compucat - Di 03.06.14 13:47

ja, ist 5.00. Ist laut Hersteller für XE5 geeignet.
Die andere Komponente (AdTerminal) funktioniert ja einwandfrei. Ist vom gleichen Hersteller.

ibh_compucat


WasWeißDennIch - Di 03.06.14 14:29

Ein einfacher Typecast wird nichts bringen, da das höherwertige Byte dabei auf der Strecke bleibt. Ich habe daher mal eine Möglichkeit ausprobiert, das Ergebnis scheint stimmig zu sein. Evtl. gibt es auch schon eine fertige Routine dafür, aber die konnte ich auf die Schnelle nicht finden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
const
  ORIGINAL: UnicodeString = 'ㄼㄱ†㤲㌳㠹〰ㄱ‱㈠㌹㤳〸㸰';
var
  s: AnsiString;
begin
  SetLength(s, Length(ORIGINAL) * 2);
  CopyMemory(@s[1], PWideChar(ORIGINAL), Length(s));
  ShowMessage(s);
end;


ibh_compucat - Di 03.06.14 14:54

Das ist die Lösung, läuft super.

Vielen, vielen Dank!

ibh_compucat