Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ANSISTRING unter Linux verfügbar ??? (https://www.delphipraxis.net/196723-ansistring-unter-linux-verfuegbar.html)

joachimd 15. Jun 2018 07:06

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von jaenicke (Beitrag 1404856)
Warum benutzt du denn nicht einfach überall TBytes? Wenn du von Datenaustausch sprichst, hört sich das so nach Missbrauch von AnsiString als Datencontainer an.

weil evtl die Bibliothek nicht für Linux geschaffen wurde und konsequent AnsiString einsetzt? Ich hab vor etlichen Monaten mal versucht, die ADS Komponenten für Linux anzupassen und hab dann schliesslich aufgegeben, weil es überall AnsiString gibt und zu dem Zeitpunkt ich keine Möglichkeit (wie oben genannt) gefunden habe.

jaenicke 15. Jun 2018 07:27

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von joachimd (Beitrag 1404892)
weil evtl die Bibliothek nicht für Linux geschaffen wurde und konsequent AnsiString einsetzt? Ich hab vor etlichen Monaten mal versucht, die ADS Komponenten für Linux anzupassen und hab dann schliesslich aufgegeben, weil es überall AnsiString gibt und zu dem Zeitpunkt ich keine Möglichkeit (wie oben genannt) gefunden habe.

Die Logik verstehe ich nicht. :? Dabei hilft es doch auch nicht mit verschiedenen Aliastypen auf den verschiedenen Systemen zu arbeiten. Wenn man TBytes auf einer Plattform benutzt, dann kann man das auch gleich überall nutzen, da man die Anpassung dafür ja ohnehin machen muss.

Warum sollte man dann auf einer Plattform sauber mit TBytes arbeiten und auf der anderen (vermutlich noch mit IFDEFs gewürzt) bei einem unpassenden AnsiString-Container bleiben?

joachimd 15. Jun 2018 07:34

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von jaenicke (Beitrag 1404893)
Warum sollte man dann auf einer Plattform sauber mit TBytes arbeiten und auf der anderen (vermutlich noch mit IFDEFs gewürzt) bei einem unpassenden AnsiString-Container bleiben?

Weil seit 15 Jahren gewachsen, immer noch Delphi 3 unterstützt, und nicht mit jeder neuen Version neu geschrieben wird. Ich wollte eine schnelle Umsetzung testen - und die ist mit einem Define an zentraler Stelle einfacher als in zig Units per Find&Repülace wild rumzuspielen ;)

Uwe Raabe 15. Jun 2018 08:01

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von p80286 (Beitrag 1404883)
Wobei die älteren Delphis TBytes leider nicht zur Verfügung stellen.

Die unterstützen in der Regel (bis auf eine Ausnahme :P) aber auch kein Linux.

p80286 15. Jun 2018 09:57

AW: ANSISTRING unter Linux verfügbar ???
 
Z.B. für Konvertierungsaufgaben wäre es ganz schön gewesen.
Aber wer die alten Delphis noch in Betrieb hat wird die Klippen wohl kennen.

Gruß
K-H

bernhard_LA 16. Jun 2018 09:56

AW: ANSISTRING unter Linux verfügbar ???
 
wenn ich Ansistring jetzt durch TBtyes für LINUX ersetzen lässt sich diese Zeile nicht mehr kompilieren


Delphi-Quellcode:
    if SaveString <> '' then
      FS.Write(Pointer(SaveString)^, Length(SaveString) * SizeOf(AnsiChar));

wie lautet hier die Lösung um unter beiden Plattformen mit einer CodeVariante auszukommen ?
Geht es ohne weitere
Delphi-Quellcode:
$Ifdef

jaenicke 16. Jun 2018 10:09

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von bernhard_LA (Beitrag 1404947)
wie lautet hier die Lösung um unter beiden Plattformen mit einer CodeVariante auszukommen ?
Geht es ohne weitere
Delphi-Quellcode:
$Ifdef

Gar kein ifdef, nur TBytes auf allen Plattformen.

Das ist ja was ich geschrieben hatte... es macht keinen Sinn mit IFDEF verschiedene Typen zu nutzen. Denn du musst den Code ohnehin für TBytes anpassen und hast dann sauberen Code. Da macht es doch keinen Sinn per IFDEF unter Windows wieder auf unsauberen Code umzuschalten...

Beides unter einen Hut bekommen funktioniert nicht, weil TBytes nullbasiert ist, AnsiStrings aber 1-basiert. Ansonsten könnte man die Adresse des ersten Elements benutzen statt auf Pointer zu casten.

KodeZwerg 16. Jun 2018 10:24

AW: ANSISTRING unter Linux verfügbar ???
 
Zitat:

Zitat von bernhard_LA (Beitrag 1404947)
Delphi-Quellcode:
    if SaveString <> '' then
      FS.Write(Pointer(SaveString)^, Length(SaveString) * SizeOf(AnsiChar));
wie lautet hier die Lösung um unter beiden Plattformen mit einer CodeVariante auszukommen ?

Delphi-Quellcode:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
  stream: TBytesStream;
begin
  stream := TBytesStream.Create(Data);
  try
    stream.SaveToFile(FileName);
  finally
    stream.Free;
  end;
end;
So vielleicht? In der Hoffnung es gibt mit Linux auch TBytesStream?

CHackbart 16. Jun 2018 10:36

AW: ANSISTRING unter Linux verfügbar ???
 
Als ich vor ein paar Jahren Synapse Android und iOS tauglich machen wollte, habe ich auch Rotz und Wasser geschwitzt. Da ist an allen Ecken und Enden mit Ansistring hantiert wurden und TMarshal.AsAnsi bzw. MarshaledAString schied für aus.
Vielleicht hilft dir ja meine damals verwendete Lösung: https://github.com/TetrisSQC/Synapse...e/synabyte.pas

Dabei fällt mir auf, dass ich teilweise noch "fehlerhafte" Fragmente wie:

Code:
 Stream.Write(MarshaledAString(TMarshal.AsAnsi(Value))^, Length(Value));
     {$ELSE}
  Stream.Write(PAnsiChar(Value)^, Length(Value));
drin habe. Das sollte ich mal bei Gelegenheit noch anpassen.

Christian

himitsu 16. Jun 2018 11:36

AW: ANSISTRING unter Linux verfügbar ???
 
Wie jaenicke es schon sagte, mach es so, wie es überall funktioniert und schmeiß alles Andere raus.

Zitat:

Zitat von bernhard_LA (Beitrag 1404947)
Delphi-Quellcode:
    if SaveString <> '' then
      FS.Write(Pointer(SaveString)^, Length(SaveString) * SizeOf(AnsiChar));

Aber grundsätzlich funktioniert auch dieser Code mit AnsiString und TBytes, wobei SizeOf(AnsiChar) überall passt, da ja überall ANSI drin ist,
und da es immer 1 ist, kann man es natürlich auch weglassen.
Delphi-Quellcode:
SizeOf(Byte)
ergibt das Selbe, ist aber nunmal sinnlos.

Und warum es beim IF mit dem Array nicht geht, sollte klar sein, was man auch über Length lösen könnte, oder man lässt es einfach weg und schreibt dann halt auch die 0 Bytes.


Nja, bezüglich TBytes würde ich dann natürlich auch die Überladung für TBytes verwenden, welches der TStream schon länger besitzt.


Und wie gesagt, es gibt alternativen wie TFile.WriteAll* und TStringStraem, mit denen man sich garnicht um die Straem-Behandlung kümmern muß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Seite 4 von 5   « Erste     234 5      

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