![]() |
Strin an ShortString zuweisen, wie?
Hallo,
ich habe Variablen vom Typ Shortstring, an die ich nun Variableninhalte vom Typ String zuweisen will. Nun hat ja wohl ein String ein anderes Format (Größe eines Zeichens in Byte), als der ShortString. Wie kann ich da möglichst unkompliziert einen String an eine Shortstring-Variable zuweisen. Ich brauche hierfür hauptsächlich nur das englische Alphabet, mur für MenuName könnte ich die Deutschen Umlaute noch zusätzlich gebrauchen.
Delphi-Quellcode:
Wegen säterer Absicht, die Commands in einer Datei abzulegen, habe ich hier Shortstring gewählt. Wenn ich die Kommandos aber nun in einer Ini Datei ablegen will, tritt beim Wieder einlesen das Problem auf, dass ja Inifile.ReadString() einen String, nicht ShortString zurück gibt. Wie kann ich diesen String nun an ShortString zuweisen?
type
**TMenuNameStr = array[0..31] of Ansichar; **TProgNameStr = array[0..255] of AnsiChar; **TDirNameStr = array[0..255] of AnsiChar; **TCfgNameStr = array[0..29] of Ansichar; **TOptionsStr = array[0..127] of Ansichar; **TRegisteredCommand = class(TObject) **private ****FMenuName: TMenuNameStr; ****FProgName: TProgNameStr; ****FDirName: TDirNameStr; ****FOptions: TOptionsStr; ****FCfgFile: TCfgNameStr; ****function GetCfgFile: ShortString; ****function GetDirName: ShortString; ****function GetMenuName: ShortString; ****function GetOptions: ShortString; ****function GetProgName: ShortString; ****procedure SetCfgFile(const Value: ShortString); ****procedure SetDirName(const Value: ShortString); ****procedure SetMenuName(const Value: ShortString); ****procedure SetOptions(const Value: ShortString); ****procedure SetProgName(const Value: ShortString); **public ***{ * * constructor Create; * * destructor Destroy; override; ** } ****constructor Create; ****property MenuName: ShortString read GetMenuName write SetMenuName; ****property ProgName: ShortString read GetProgName write SetProgName; ****property DirName: ShortString read GetDirName write SetDirName; ****property Options: ShortString read GetOptions write SetOptions; ****property CfgFile: ShortString read GetCfgFile write SetCfgFile; **end; **TCommandsList = class(TObjectList) ****property Command: TRegisteredCommand read GetCommand write SetCommand; **end;
Delphi-Quellcode:
var nMenu,nPath,nProg,nConf,nOpts: String; 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',''); move(nMenu[1],FCommand.MenuName[1], Length(nMenu)); //??? funzt wahrscheinlich nicht. Müsste genaues Stringformat dazu kennen. FCommand.MenuName := FIniFile.ReadString('Command','Menuname',''); //So geht es wohl leider nicht, weil FCommand.Menuname -> ShortString! FCommand.DirName := FIniFile.ReadString('Command','Directory',''); FCommand.ProgName := FIniFile.ReadString('Command','Exename',''); //Das funktioniert nicht so einfach, aber wie dann? FCommand.CfgFile := FIniFile.ReadString('Command','CfgFile',''); FCommand.Options := FIniFile.ReadString('Command','Options',''); Wenn ich eine direkte Zuweisung ReadString an ShortString vornehme wird das hier nicht richtig ausgeführt:
Delphi-Quellcode:
Der Dialog wird nicht zugewiesen, also wird wohl der String fehlerhaft sein.
if FCommand.MenuName = 'Mein Tool'
then FCommand.OptionsDialog := TCommandOptOptDlg.Create(self) |
AW: Strin an ShortString zuweisen, wie?
Du unterliegst einem Irrtum: Ein
Delphi-Quellcode:
ist kein ShortString! Einen vergleichbaren ShortString würde man mit
array[0..31] of Ansichar
Delphi-Quellcode:
deklarieren.
string[31]
![]() |
AW: Strin an ShortString zuweisen, wie?
Wieso verwendest Du Shortstring?
Wenn es um den Speicherplatz geht, hast Du hoffentlich dies beachtet: Zitat:
Zitat:
Delphi-Quellcode:
Dies müsste vom Prinzip m.E. eigentlich funktionieren, zumindest solange der der zugewiesene String nicht zu lange ist.
procedure TForm1.Button1Click(Sender: TObject);
var S : String; ShortS : ShortString; begin S := 'String'; ShortS := S; Label1.Caption := ShortS; ShortS := 'ShortString'; S := ShortS; Label2.Caption := S; end;
Delphi-Quellcode:
FCommand.ProgName := FIniFile.ReadString('Command','Exename',''); //Das funktioniert nicht so einfach, aber wie dann?
|
AW: Strin an ShortString zuweisen, wie?
Zitat:
|
AW: Strin an ShortString zuweisen, wie?
Warum aber funktioniert dann die Abfrage
Delphi-Quellcode:
nicht?
if FCommand.MenuName = 'Mein Tool'
******then FCommand.OptionsDialog := TCommandOptOptDlg.Create(self) Zitat:
Ist eventuell das hier die Ursache: FMenuname ist immerhin ein AnsiString Array.
Delphi-Quellcode:
[OT]
procedure TRegisteredCommand.SetMenuName(const Value: ShortString);
var i: Integer; s: ShortString; begin for i := 1 to Length(Value) do FMenuName[i-1] := Value[i]; end; function TRegisteredCommand.GetMenuName: ShortString; var i: Integer; s: ShortString; begin s := ''; i := 0; while (FMenuName[i] >= ' ') do begin s := s + FMenuName[i]; inc(i); end; Result := s; end; Sorry für den Doppelaccount, bin schöni, kann mich aber schon lange nicht mehr als Schöni einloggen. Wollte das gestern ändern und zukünftig wieder als schöni hier aktiv sein statt DualCoreCpu, dabei gibt mir die DP auf "Kennwort vergessen" aber den Usernamen cpux86. Da kann ich auch bei DualCoreCpu bleiben oder eben dem jetzigen Usernamen. [/OT] |
AW: Strin an ShortString zuweisen, wie?
Delphi-Quellcode:
if FCommand.MenuName[index] = 'Mein Tool' then
|
AW: Strin an ShortString zuweisen, wie?
Hi,
"if ShortString = String then" sollte gehen, notfalls hart casten also "if (String(FCommand.MenuName) = 'Mein Tool') then", aber
Delphi-Quellcode:
ist mir etwas zu gefährlich ... dann lieber:
function TRegisteredCommand.GetMenuName: ShortString;
var i: Integer; s: ShortString; begin s := ''; i := 0; while (FMenuName[i] >= ' ') do begin s := s + FMenuName[i]; inc(i); end; Result := s; end;
Delphi-Quellcode:
Die zusätzliche Variable "s" hab ich auch mal rausgenommen.
function TRegisteredCommand.GetMenuName: ShortString;
var i: Integer; begin Result := ''; for i := Low(FMenuName= to High(FMenuName) do begin if (FMenuName[i] < ' ') then Break; Result := Result + FMenuName[i]; end; end; Aber mir geht es eigendlich darum, dass das Array evtl. nicht initialisiert ist, und dementsprechend er lustig über den Tellerrand laufen könnte ... glaube ich ... theoretisch ... unter Umständen ... Aber vielleicht ist das schon das ganze Problem. LG Incocnito |
AW: Strin an ShortString zuweisen, wie?
Zitat:
Zitat:
Eher ist es was in dieser Richtung:
Delphi-Quellcode:
Ich habe das TEncoding.Ansi.GetString() nicht drin.
//von der Embarcadero Webseite (Doku zu Strings):
function ShortStringToString(Value: array of Byte): String; var B: TBytes; L: Byte; begin Result := ''; L := Value[0]; SetLength(B, L); Move(Value[1], B[0], L); Result := TEncoding.Ansi.GetString(B); end; Mein Array FMenuName ist AnsiChar. Von da will ich auf ShortString zuweisen. |
AW: Strin an ShortString zuweisen, wie?
Zitat:
Oder was ist das für eine Datei, in der du die Commands ablegen willst? Nimmt die keine normalen Strings? |
AW: Strin an ShortString zuweisen, wie?
Zitat:
Habe meinen Code jetzt so umgestellt:
Delphi-Quellcode:
Aber FCmd.MenuName ist nach wie vor leer.
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); Die Umwandlungsroutine sieht so aus, von der Emba Webseite hier: ![]()
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz