![]() |
format zur runtime mit versch.Typen
Ich möchte zur Laufzeit format(.. , .. ) mit einem Array mit unterschiedlichen Typen aufrufen:
Delphi-Quellcode:
format( Edit1.text , [StrToInt(Edit2.text),StrToInt(Edit3.text),StrToInt(Edit4.text)])
format( Edit1.text , [StrToFloat(Edit2.text),StrToFloat(Edit3.text),StrToFloat(Edit4.text)]) format( Edit1.text , [Edit2.text,Edit3.text,Edit4.text]) {Aber auch mixed} format( Edit1.text , [variable1,variable2,variable3]) Also wie bilde ich ein array of const mit verschiedenen Typen oder definiere Variablen mit unterschiedlichen Typen? |
Re: format zur runtime mit versch.Typen
Mit der Forum-Suche doch noch was gefunden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Test : array [0..2] of TVarRec; begin Test[0].VInteger := StrToInt(Edit2.text); Test[1].VExtended := StrToFloat(Edit3.text); Test[2].VAnsiString := Edit4.text; Label1.Caption := format( Edit5.text , Test); end; |
Re: format zur runtime mit versch.Typen
Habe aber noch ein Problem:
Vereinfachter Beispielcode Float:
Delphi-Quellcode:
Error: Inkompatible Typen: 'Extended' und 'PExtended'
procedure TForm1.Button7Click(Sender: TObject);
var Test : array [0..0] of TVarRec; begin Test[0].VExtended := StrToFloat(Edit5.text); Label5.Caption := format( Edit4.text , Test); end; Vereinfachter Beispielcode String:
Delphi-Quellcode:
Error: Format %s ungültig oder nicht kompatibel mit Argument
procedure TForm1.Button7Click(Sender: TObject);
var Test : array [0..0] of TVarRec; begin Test[0].VAnsiString := PChar(Edit5.text); Label5.Caption := format( Edit4.text , Test); end; :wall: |
Re: format zur runtime mit versch.Typen
unit system.pas:
Delphi-Quellcode:
dementsprechend:
PVarRec = ^TVarRec;
TVarRec = record { do not pack this record; it is compiler-generated } case Byte of vtInteger: (VInteger: Integer; VType: Byte); vtBoolean: (VBoolean: Boolean); vtChar: (VChar: Char); vtExtended: (VExtended: PExtended); vtString: (VString: PShortString); vtPointer: (VPointer: Pointer); vtPChar: (VPChar: PChar); vtObject: (VObject: TObject); vtClass: (VClass: TClass); vtWideChar: (VWideChar: WideChar); vtPWideChar: (VPWideChar: PWideChar); vtAnsiString: (VAnsiString: Pointer); vtCurrency: (VCurrency: PCurrency); vtVariant: (VVariant: PVariant); vtInterface: (VInterface: Pointer); vtWideString: (VWideString: Pointer); vtInt64: (VInt64: PInt64); end;
Delphi-Quellcode:
var
Test : array [0..0] of TVarRec; begin Test[0].VExtended^ := StrToFloat(Edit1.text); Label1.Caption := format( Edit2.text , Test); |
Re: format zur runtime mit versch.Typen
Danke, aber damit wirft es nun eine Exception.
|
Re: format zur runtime mit versch.Typen
Delphi-Quellcode:
var
Test : array [0..0] of TVarRec; extendedVal: Extended; begin extendedVal := StrToFloat(Edit1.text); Test[0].VExtended := @extendedVal; Label1.Caption := Format('%8.2f', [extended(Test[0].VExtended^)]); so klappte es bei mir. schau dir aber sicherheitshalber noch einmal die dokumentation zu tvarrec an. wenn du was neues weist poste mal bitte. interessiert mich auch das ganze. |
Re: format zur runtime mit versch.Typen
So klappt es bei mir ja auch.
Aber ich möchte ja das ganze Array als parameter der format funktion übergeben:
Delphi-Quellcode:
Error: Format %8.2f ungültig oder nicht kompatibel mit Argument
var
Test : array [0..0] of TVarRec; extendedVal: Extended; begin extendedVal := StrToFloat(Edit1.text); Test[0].VExtended := @extendedVal; Label1.Caption := Format('%8.2f', Test); Bis jetzt geht nur integer: Test[0].VInteger := StrToInt(Edit1.text); Label1.Caption := format( 'Integer: 3d' , Test); |
Re: format zur runtime mit versch.Typen
Zitat:
Im übrigen braucht TVarRec immer das "VType: Byte" Feld. Wenn dieses nicht gesetzt ist, kann Format nicht erkennen, wie es den TVarRec zu interpretieren hat. Zitat:
So würde es gehen, ob das Vorgehen schön ist, ist eine andere Sache.
Delphi-Quellcode:
var
V: array[0..0] of TVarRec; begin V[0].VType := vtExtended; New(V[0].VExtended); // Speicher reservieren try V[0].VExtended^ := StrToFloat(edtZahl.Text); ShowMessage( Format('%f', V) ); finally Dispose(V[0].VExtended); // Speicher wieder freigeben end; end; |
Re: format zur runtime mit versch.Typen
Danke, für den Typ Float funktioniert das gut.
Kann man das nun auch auf Strings übertragen?
Delphi-Quellcode:
Error: Operator ist auf diesen Operandentyp nicht anwendbar
var
Test : array [0..0] of TVarRec; begin Test[0].VType := vtAnsiString; New(Test[0].VAnsiString); // Speicher reservieren try Test[0].VAnsiString^ := Edit5.text; Label5.Caption := format( Edit4.text , Test); finally Dispose(Test[0].VAnsiString); // Speicher wieder freigeben end; end; in Zeile: Test[0].VAnsiString^ := Edit5.text; Mit Zeigern tue ich mich immer schwer. |
Re: format zur runtime mit versch.Typen
Dies scheint zu funktionieren:
Delphi-Quellcode:
Richtig so?
var
Test : array [0..0] of TVarRec; Teststr : PChar; begin Teststr := PChar(Edit5.text); Test[0].VType := vtAnsiString; Test[0].VAnsiString := Teststr; Label5.Caption := format( Edit4.text , Test); end; end. Ncohmal Danke für alle Beiträge! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 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