Zeichensatz in VirtualStringTree

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
andikad
Beiträge: 20
Registriert: So 11. Mai 2014, 03:41

Zeichensatz in VirtualStringTree

Beitrag von andikad »

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

wp_xyz
Beiträge: 3213
Registriert: Fr 8. Apr 2011, 09:01

Re: Zeichensatz in VirtualStringTree

Beitrag von wp_xyz »

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.

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);

P.S. Läuft denn KVMMemTable unter Lazarus? Falls nicht, könntest du TBufDataset oder TMemDataset verwenden.

andikad
Beiträge: 20
Registriert: So 11. Mai 2014, 03:41

Re: Zeichensatz in VirtualStringTree

Beitrag von andikad »

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

andikad
Beiträge: 20
Registriert: So 11. Mai 2014, 03:41

Re: Zeichensatz in VirtualStringTree

Beitrag von andikad »

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

Nixsager
Beiträge: 159
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

Beitrag von Nixsager »

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.

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.
 


Ich weiß jetzt nicht ob ich das Thema getroffen habe, aber deklariere doch die Strings als Ansi-Strings.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Michl
Beiträge: 2335
Registriert: Di 19. Jun 2012, 12:54

Re: Zeichensatz in VirtualStringTree

Beitrag von Michl »

andikad hat geschrieben:Gibt es wirklich keinen Weg, eine Lazarusanwendung an zentraler Stelle in die Lage zu versetzen, mit ANSI-Strings umzugehen?
Doch, das geht. Siehe http://wiki.freepascal.org/Lazarus_with_FPC3.0_without_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.

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; 

andikad
Beiträge: 20
Registriert: So 11. Mai 2014, 03:41

Re: Zeichensatz in VirtualStringTree

Beitrag von andikad »

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

Antworten