Lange Strings unter 'Delphi Berlin 10.1 Starter'

    Lange Strings unter 'Delphi Berlin 10.1 Starter'

    Bisher habe ich unter Delphi 6 Prof. lange Strings mit „notiz:array[0..1000] of Ansichar;“ gespeichert.

    Das ganze war in einem Record eingebettet:

    Type
    datum,dat1,dat2,dat3:string[10];
    plz:string[15];
    version:string[4];
    term_anz,vorl:integer;
    notiz:array[0..1000] of Ansichar;
    end;

    Gespeichert wurden die Daten mit:
    StrLCopy (@datei.notiz, PChar(Memo1.Lines.Text), SizeOf (datei.notiz));

    Das klappte alles sehr gut.
    Jetzt versuche ich das Programm unter Delphi „Berlin 10.1 Starter“ zu bearbeiten.

    Dort funktioniert aber „notiz:array[0..1000] of Ansichar“ nicht mehr.
    Ich könnte zwar „notiz:array[0..1000] of WideChar;“ nehmen, nur ist das nicht kompatibel mit den vorhandenen Daten.

    Daher meine Frage:
    Was gibt es für Möglichkeiten weiter mit langen Strings zu arbeiten, die kompatibel mit den vorhandenen Daten unter
    „Delphi Berlin 10.1 Starter“ sind?

    Wer kann mir hier helfen? ?(
    Gruß gringo
    Kleiner Test:

    Delphi-Code

    1. procedure TFormTest.ButtonTestClick(Sender: TObject);
    2. type
    3. TNotiz = array[0..1000] of AnsiChar;
    4. TDatei = record
    5. notiz: TNotiz;
    6. end;
    7. var
    8. Datei: TDatei;
    9. begin
    10. // Funktioniert nicht, da Vermischung von Ansi und Unicode
    11. StrLCopy (@datei.notiz, PChar(Memo1.Lines.Text), SizeOf (datei.notiz));
    12. // Funktioniert, alles explizit auf Ansi gecastet
    13. StrLCopy(@datei.notiz, PAnsiChar(AnsiString(Memo1.Lines.Text)), Length(datei.notiz) - 1);
    14. ShowMessage(string(datei.notiz));
    15. end;
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Hallo haentschman,

    das sagt das Programm, da vom ganzen Text nur 1 Zeichen gespeichert wird.
    In der Hilfe steht = type AnsiChar=#0..#255;
    Deshalb gehe ich davon aus, das nur 255
    Zeichen mit diesem Type gespeichert werden können.

    Gruß gringo



    Hallo Deddy H,
    danke für den Code.
    Ichbrauchte nur diese Zeile:
    StrLCopy (@datei.notiz, PChar(Memo1.Lines.Text), SizeOf (datei.notiz));
    gegen Deine zu ersetzen:
    StrLCopy(@datei.notiz,PAnsiChar(AnsiString(Memo1.Lines.Text)), Length(datei.notiz) - 1);
    und alles läuft Perfekt.

    Damit hat sich dieses Thema erledigt.

    Ich möchte mich ganz herzlich für
    Deine Mühe bedanken.

    Gruß gringo

    Gringo schrieb:

    In der Hilfe steht = type AnsiChar=#0..#255;
    Deshalb gehe ich davon aus, das nur 255
    Zeichen mit diesem Type gespeichert werden können.

    Ja, das stimmt. Aber das war schon immer so - die „alten“ Strings sind ein Ananeinanderhängen von Bytes, d.h. 256 verschiedene Zeichen sind möglich [1], mehr nicht. Die „neuen“ Strings haben die Größe eines Words, d.h. doppelt so viel und sind dementsprechnd natürlich nicht mehr kompatibel zu den alten Strings.

    [1]: Zeichen im Sinne von Char. Wenn man ein Encoding wie UTF-8 auf einen AnsiString wirft, kann man auf den viel umfangreicheren Unicode-Zeichensatz zurückgreifen. Genauso wie die Wahl von 16-Bit bei den UnicodeStrings auch der Wahl eines Encodings entspricht, eben UTF-16. Der Aspekt von Encodings, der hier relevant ist, ist der, dass durch Zusammenfassung verschiedener Char-Zeichen es möglich wird, auf Text-Zeichen aus einem erweiterten Zeichensatz zurückzugreifen. Wenn man so etwas macht, muss man aber aufpassen mit Routinen, die Strings evtl. auf Byte- oder Word-Ebene zerlegen und damit möglicherweise Zeichen „zerbrechen“. Das aber nur nebenbei, falls du dich mehr dafür interessierst, hat Christian mal einen Blog-Eintrag dazu geschreiben.
    Master of the EDH ;)