Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi String/Memo zeigt unterschiedlich an Android/Windows (https://www.delphipraxis.net/202977-string-memo-zeigt-unterschiedlich-android-windows.html)

zeras 31. Dez 2019 14:28


String/Memo zeigt unterschiedlich an Android/Windows
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe mit einem Programm eine SQLite Datenbank erzeugt.
Für die Auswertung der Daten hatte ich "Geräteübergreifendes Formular" verwendet. Alles gut.
Nun habe ich ein neues Programm für die Auswertung nur für Windows geschrieben und es wird immer nur das erste Zeichen einer Zeichenkette angezeigt.
Für das Ansprechen habe ich die gleichen Objekte genutzt, TFDQuery, TFDPhysSQLiteDriverLink und TDFConnection.
In allen Funktionen wurde "String" genutzt. Diesem kopiere ich dann in ein Memofeld.
Hat das irgendwie mit einem Zeichensatz zu tun?
Oder wie bekomme ich wieder den ganzen String angezeigt?

Zusatz: Die Felder ich der DB sind als BLOB hinterlegt.

TurboMagic 31. Dez 2019 14:56

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Wär's möglich etwas Code zu posten, damit wir genauer sehen was du getrieben hast?

zeras 31. Dez 2019 15:01

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Damit hole ich die Daten aus der DB:
Delphi-Quellcode:

Function Tfmain.GetAlarmFromDB(iAlarm: integer; var Alarm: tAlarm): Boolean;
begin
  Result := False;

  try

    SQLQuery.SQL.Text := Format('SELECT * FROM %s Where %s = %d', [MainTable, feldAlarmNummer, iAlarm]);
    SQLQuery.Open();

    if SQLQuery.RowsAffected = 0 then begin
      Exit; //Alarmnummer ist nicht vorhanden, dann Möglichkeit zum Neuanlegen geben
    end;

    Alarm.iAlarmNo := SQLQuery.FieldByName(feldAlarmNummer).AsInteger;
    Alarm.sAlarmUeberschrift := SQLQuery.FieldByName(feldAlarmUeberschrift).AsString;
    Alarm.sAlarmBeschreibung := SQLQuery.FieldByName(feldAlarmBeschreibung).AsString;
    Alarm.sAlarmHinweis := SQLQuery.FieldByName(feldAlarmHinweis).AsString;
    Alarm.sAlarmAktion := SQLQuery.FieldByName(feldAlarmAktion).AsString;
    Alarm.sEigeneHinweise := SQLQuery.FieldByName(feldAlarmEigeneHinweise).AsString;
    Alarm.iID := SQLQuery.FieldByName(feldID).AsInteger;
    Result := True;

  finally

  end;
end;
und damit schreibe ich diese dann in die Memos:

Delphi-Quellcode:
//Daten aus dem Alarm record in das Formular schreiben
Procedure Tfmain.Record2Form(Alarm: tAlarm);
begin
  LabAlarmNummer.Text := Format('A %.5d', [Alarm.iAlarmNo]);
  meUeberschrift.Text := Alarm.sAlarmUeberschrift;
  meBeschreibung.Text := Alarm.sAlarmBeschreibung;
  meHinweis.Lines.Text := Alarm.sAlarmHinweis;
  meAktion.Lines.Text := Alarm.sAlarmAktion;
  meEigeneHinweise.Text := Alarm.sEigeneHinweise;
  LabIDPlatzhalter.Text := Alarm.iID.ToString;
end;

Gausi 31. Dez 2019 15:45

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Das riecht ganz stark danach, als würde irgendwo ein 2-Byte-String (UnicodeString) zwischendurch als PAnsiChar interpretiert, und das "Null-Füllbyte" des ersten Zeichens entsprechend als Terminator, also Ende der Zeichenkette. Oder etwas in dieser Richtung ...

zeras 31. Dez 2019 16:00

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie im Bild gezeigt, stehen die Zeichen im Objekt "Alarm.sAlarmUeberschrift"
Nach der Zuweisung steht dann im Objekt "meUeberschrift.Text" nur noch das erste Zeichen.
Ein AnsiChar ist nicht mehr dazwischen. Jedenfalls sehe ich nichts.

Gausi 31. Dez 2019 16:11

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Ja, aber jedes zweite Byte dort ist 0, wie üblich in einem UnicodeString, in dem nur a-z (und ein paar weitere Zeichen) vorkommen. Und irgendwo in deinem Code (oder in dem der verwendeten Komponenten) wird die erste Null als Ende der Zeichenkette interpretiert, d.h. an irgendeiner Stelle geht die Info "Das ist ein UnicodeString" verloren ...

Funktioniert es, wenn du explizit mit UnicodeString (oder WideString) statt String arbeitest?

zeras 31. Dez 2019 16:24

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Zitat:

Zitat von Gausi (Beitrag 1454191)

Funktioniert es, wenn du explizit mit UnicodeString (oder WideString) statt String arbeitest?

Leider bringt die Deklaration "Alarm.sAlarmUeberschrift" sowohl als UnicodeString, als auch als Widestring keine Verbeserung.

Auch ein Test mit AdvMemo bringt keine Verbesserung.

zeras 31. Dez 2019 16:37

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Wenn ich nun

Delphi-Quellcode:
    Alarm.sAlarmUeberschrift := DataModul.SQLQuery.FieldByName(feldAlarmUeberschrift).AsString;
durch das

Delphi-Quellcode:
    Alarm.sAlarmUeberschrift := DataModul.SQLQuery.FieldByName(feldAlarmUeberschrift).WideAsString;
ersetze, geht das erst einmal. Warum das bei Geräteübergreifenden automatisch funktioniert, kann ich mir leider nicht erklären.

Danke und einen guten Rutsch ins neue Jahr.

Bernhard Geyer 31. Dez 2019 16:39

AW: String/Memo zeigt unterschiedlich an Android/Windows
 
Kann sein das in deiner DB-Verbindung noch eine Codierungseinstellung nötig ist.
Ich hätte zwar in 2019 erwartet das sowas immer automatisch läuft, aber bei SQLite sind meine versuche doch schon ein paar Jahre her (und auch noch mit D6)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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