Zeichensatz in VirtualStringTree
Zeichensatz in VirtualStringTree
Hallo,
ich habe folgendes Problem. Ich portiere derzeit eine Anwendung von Delpi 5 nach Lazarus. Dabei wird über UIB auf eine Firebird 2.5 Datenbank zugegriffen, die Daten dann in ein KBMMemtable geladen und in einem Virtualstringtree angezeigt. Leider schaffe ich es nicht, dass Umlaute richtig dargestellt werden.
Erfasse ich in dem VT neuen Text mit Umlauten, so kommen diese beim Speichern auch nicht sauber in der Datenbank an, werden nach dem Editieren im VT aber korrekt angezeigt. Die Datenbank wird mit CharacterSet ISO8859_1 connected. VT.Font.CharacterSet ist default_charset.
Kann jemand helfen?
Viele Grüße, Andreas
ich habe folgendes Problem. Ich portiere derzeit eine Anwendung von Delpi 5 nach Lazarus. Dabei wird über UIB auf eine Firebird 2.5 Datenbank zugegriffen, die Daten dann in ein KBMMemtable geladen und in einem Virtualstringtree angezeigt. Leider schaffe ich es nicht, dass Umlaute richtig dargestellt werden.
Erfasse ich in dem VT neuen Text mit Umlauten, so kommen diese beim Speichern auch nicht sauber in der Datenbank an, werden nach dem Editieren im VT aber korrekt angezeigt. Die Datenbank wird mit CharacterSet ISO8859_1 connected. VT.Font.CharacterSet ist default_charset.
Kann jemand helfen?
Viele Grüße, Andreas
Re: Zeichensatz in VirtualStringTree
Falls nicht auch noch KBMMemTable etwas an der Zeichenkodierung verändert, würde ich alle Strings nach dem Auslesen aus der Firebird-Datenbank mit ISO_8859_1ToUTF8() (in der Unit lconvencoding) nach UTF8 umwandeln, was von Lazarus intern verwendet wird. Umgekehrt beim Speichern: vorher per UTF8ToISO_8859_1() zurückkonvertieren.
P.S. Läuft denn KVMMemTable unter Lazarus? Falls nicht, könntest du TBufDataset oder TMemDataset verwenden.
Code: Alles auswählen
var
s: String;
// lesen
s := ISO_8859_1ToUTF8(FirebirdTable.FieldByName('TextFeld').AsString);
// schreiben
FirebirdTable.FieldByname('TextFeld').AsString := UTF8ToISO_8859_1(s);
Re: Zeichensatz in VirtualStringTree
Hallo,
danke für Deine Antwort. Genau das würde ich gerne vermeiden. Gibt es keinen anderen Weg?
Ja, das KBMMemtable läuft in der aktuelleren Versionen unter Lazarus. TMemDataset und TBufDataset bieten leider viel weniger.
Viele Grüße, Andreas
danke für Deine Antwort. Genau das würde ich gerne vermeiden. Gibt es keinen anderen Weg?
Ja, das KBMMemtable läuft in der aktuelleren Versionen unter Lazarus. TMemDataset und TBufDataset bieten leider viel weniger.
Viele Grüße, Andreas
Re: Zeichensatz in VirtualStringTree
Hallo,
ich schiebe Beitrag nochmal nach oben. Gibt es wirklich keinen Weg, eine Lazarusanwendung an zentraler Stelle in die Lage zu versetzen, mit ANSI-Strings umzugehen? Ich habe etwas zu Compilerdirektiven $LONGSTRINGS und $H+ gefunden, verstehe aber nicht ganz, wie das funktioniert.
Viele Grüße, Andreas
ich schiebe Beitrag nochmal nach oben. Gibt es wirklich keinen Weg, eine Lazarusanwendung an zentraler Stelle in die Lage zu versetzen, mit ANSI-Strings umzugehen? Ich habe etwas zu Compilerdirektiven $LONGSTRINGS und $H+ gefunden, verstehe aber nicht ganz, wie das funktioniert.
Viele Grüße, Andreas
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: Zeichensatz in VirtualStringTree
Mit $H+ oder $H- gibst du in der ersten Zeile des Quellcodes in geschwungenen Klammer '{$H+}' oder '{$H-}' an ob der Datentyp 'String' als ShortString ({$H-}) oder AnsiString behandelt werden soll.
http://wiki.freepascal.org/String/de
Wenn du in der ersten Zeile des Code das '+' durch ein '-' austauschst, wirst du sehen, das die Länge des Strings unterschiedlich ist.
Ich weiß jetzt nicht ob ich das Thema getroffen habe, aber deklariere doch die Strings als Ansi-Strings.
http://wiki.freepascal.org/String/de
Wenn du in der ersten Zeile des Code das '+' durch ein '-' austauschst, wirst du sehen, das die Länge des Strings unterschiedlich ist.
Code: Alles auswählen
{H+}
program Test;
USES
CRT;
VAR
TestString:String;
I: Integer;
BEGIN
For I := 1 to 3000 do
TestString := TestString + 'X';
writeln(TestString);
Writeln('Der Test-String hat eine Länge von ', Length(TestString), ' Zeichen.');
Repeat
Until KeyPressed
END.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Re: Zeichensatz in VirtualStringTree
Doch, das geht. Siehe http://wiki.freepascal.org/Lazarus_with ... UTF-8_mode. Intern werden dann alle Strings entsprechend der Windows Codepage behandelt. Allerdings arbeitet die LCL intern mit UTF8, sodaß eine Konvertierung bei der Ein- und Ausgabe von Strings notwendig werden. MMn ist dieser Switch nur ein Vorteil, wenn man ohne die LCL arbeitet.andikad hat geschrieben:Gibt es wirklich keinen Weg, eine Lazarusanwendung an zentraler Stelle in die Lage zu versetzen, mit ANSI-Strings umzugehen?
Einfach unter Projekt -> Projekteinstellungen -> Compilereinstellungen -> Hinzufügen und Beeinflussen -> Button "Systemkodierung verwenden" (-dDisableUTF8RTL) klicken und fertig ist der Salat.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Zeichensatz in VirtualStringTree
Hallo, Danke für Eure Hinweise. Esgibt also keine Möglichkeit, der LCL an zentraler Stelle zu sagen, die Controls Strings als ANSI behandeln sollen. Dann biete der Schalterzumindes für meine Aufgabe wirklich keine Vorteile.
Danke Euch trotzdem!
Viele Grüße, Andreas
Danke Euch trotzdem!
Viele Grüße, Andreas