Zitat von
bcvs:
Wieso überhaupt das ganze rumgezerre mit Array of AnsiChar und Shortstring. Wieso nimmst du nicht einfach einen String und fertig.
Oder was ist das für eine Datei, in der du die Commands ablegen willst? Nimmt die keine normalen Strings?
Weil ich dem Irrtum unterlegen war, dass ich dann einfacher die Daten in eine Datei schreiben könne. Nun aber habe ich den hier bekannt gewordenen Mehraufwand.
Habe meinen Code jetzt so umgestellt:
Delphi-Quellcode:
var
nMenu: String;
nPath: String;
nProg: String;
nConf: String;
nOpts: String;
sMenu: ShortString;
sPath: ShortString;
sProg: ShortString;
sConf: ShortString;
sOpts: ShortString;
C: AnsiChar; // ist ein Byte groß, wie ich das für Shortstring brauche
FCmd := TRegisteredCommand.Create;
FInifile := TIniFile.Create('editor.ini');
nMenu := FIniFile.ReadString('Command','Menuname','');
nPath := FIniFile.ReadString('Command','Directory','');
nProg := FIniFile.ReadString('Command','Exename','');
nConf := FIniFile.ReadString('Command','CfgFile','');
nOpts := FIniFile.ReadString('Command','Options','');
StringToShortString(nMenu, sMenu);
StringToShortString(nPath, sPath);
StringToShortString(nProg, sProg); //Hier sollte doch dann eine korrekte Anpassung dank TEncoding erfolgen?
StringToShortString(nConf, sConf);
StringToShortString(nOpts, sOPts);
FCmd.MenuName := sMenu;
FCmd.DirName := sPath;
FCmd.ProgName := sProg;
FCmd.CfgFile := sConf;
FCmd.Options := sOpts;
FIniFile.Free;
ShowMessage('Menüname = ' + FCmd.MenuName);
Aber FCmd.MenuName ist nach wie vor leer.
Die Umwandlungsroutine sieht so aus, von der Emba Webseite hier:
http://docwiki.embarcadero.com/CodeE...String_(Delphi)
Delphi-Quellcode:
procedure StringToShortString(const S: String; var RetVal);
var
L: Integer;
I: Byte;
C: Char;
P: PByte;
B: TBytes;
begin
L := Length(S);
if L > 255 then
raise EShortStringConvertError.Create('Strings longer than 255 characters cannot be converted');
SetLength(B, L);
P := @RetVal;
P^ := L;
Inc(P);
B := TEncoding.Ansi.GetBytes(S);
Move(B[0], P^, L);
end;