Zeichensatz in VirtualStringTree

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

Zeichensatz in VirtualStringTree

Beitragvon andikad » 11. Okt 2016, 21:18 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
andikad
 
Beiträge: 20
Registriert: 11. Mai 2014, 02:41

Beitragvon wp_xyz » 11. Okt 2016, 21:47 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.

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.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon andikad » 12. Okt 2016, 10:15 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
andikad
 
Beiträge: 20
Registriert: 11. Mai 2014, 02:41

Beitragvon andikad » 2. Nov 2016, 00:07 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
andikad
 
Beiträge: 20
Registriert: 11. Mai 2014, 02:41

Beitragvon Nixsager » 2. Nov 2016, 01:17 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.
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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 2. Nov 2016, 11:57 Re: Zeichensatz in VirtualStringTree

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; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon andikad » 2. Nov 2016, 21:50 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
andikad
 
Beiträge: 20
Registriert: 11. Mai 2014, 02:41

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried