Hach, an was man sich so alles gewöhnen könnte.
http://docwiki.embarcadero.com/RADSt...Dynamic_Arrays
Delphi-Quellcode:
Temp: TArray<AnsiString>;
for S in FileList do
begin
Temp := Temp + [AnsiString(S)];
FParameters := FParameters + [PAnsiChar(Temp[High(Temp)])];
...
SetLength(FParameters, FileList.Count); // die 6 Zusätzlichen jetzt noch nicht dazu
// Und am Ende gibt sich Temp von selber frei.
bzw.
Delphi-Quellcode:
Temp := ['-sOutputFile=' + FileName];
FParameters := [
'',
'-dNOPAUSE',
'-dBATCH',
'-dPDFSETTINGS=/ebook',
'-sDEVICE=pdfwrite',
PAnsiChar(Temp[0])];
for S in FileList do begin
Temp := Temp + [S]; // implizit ein + [AnsiString(S)];
FParameters := FParameters + [PAnsiChar(Temp[High(Temp)])];
end;
Aber wie gesagt, ich würde FGsApiInitWithArgs einfach ein TArray<AnsiString> geben, anstatt einem TArray<PAnsiChar>,
und mir den ganzen PChar-Quatsch einfach schenken.
Delphi-Quellcode:
FParameters := [
'',
'-dNOPAUSE',
'-dBATCH',
'-dPDFSETTINGS=/ebook',
'-sDEVICE=pdfwrite',
'-sOutputFile=' + FileName];
for S in FileList do
FParameters := FParameters + [S];
// wäre beides String gewesen, dann ginge sogar sowas
FParameters := ['', '-dNOPAUSE', '-dBATCH', '-dPDFSETTINGS=/ebook',
'-sDEVICE=pdfwrite', '-sOutputFile=' + FileName] + FileList.ToStringArray;
Rein "technisch" bestünde sogar die Möglichkeit in einen "String" einen "AnsiString" reinzumachen,
da die LongStrings in Delphi sowohl CodePage als auch CharSize im String speichern.
Also in einer TStringList die Codierung der "Strings" auf
ANSI umzuschreiben.
(ich weiß aber nicht, in wie weit die anfangs mit Delphi2009 eingeführten Casts noch aktiv sind, weil die waren arschlangsam, wenn "überall" bei jeder Stringzuweisung/Auslesen die Kodierung geprüft wird)
Ist aber nur was für echt Hartgesottene:
Delphi-Quellcode:
// CP_ACP: TStringList -> intern schonmal die CodePage ändern -> TArray<String> -> TArray<AnsiString>
// CP_UTF8: TStringList -> intern schonmal die CodePage ändern -> TArray<String> -> TArray<UTF8String>
type
TStringListAccess =
class(TStrings)
FList: TStringItemList;
end;
var
SL: TStringList;
AA: TArray<AnsiString>;
begin
SL := TStringList.Create;
SL.Add('
123');
SL.Add('
äöü');
{for var i := SL.Count-1 downto 0 do begin
var S := SL[i];
SetCodePage(RawByteString(Pointer(S)), CP_UTF8, True); // CP_ACP für ANSI
SL[i] := S;
end;}
for var i := SL.Count-1
downto 0
do
SetCodePage(RawByteString(Pointer(TStringListAccess(SL).FList[i].FString)), CP_UTF8, True);
// CP_ACP für ANSI
AA := TArray<AnsiString>(SL.ToStringArray);