Einzelnen Beitrag anzeigen

cpux86

Registriert seit: 24. Jun 2008
7 Beiträge
 
#10

AW: Strin an ShortString zuweisen, wie?

  Alt 7. Nov 2019, 08:09
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;

Geändert von cpux86 ( 7. Nov 2019 um 08:12 Uhr)
  Mit Zitat antworten Zitat