Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi format zur runtime mit versch.Typen (https://www.delphipraxis.net/100321-format-zur-runtime-mit-versch-typen.html)

HPW 26. Sep 2007 09:48


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?

HPW 26. Sep 2007 10:04

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;

HPW 29. Sep 2007 08:46

Re: format zur runtime mit versch.Typen
 
Habe aber noch ein Problem:

Vereinfachter Beispielcode Float:
Delphi-Quellcode:
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;
Error: Inkompatible Typen: 'Extended' und 'PExtended'

Vereinfachter Beispielcode String:
Delphi-Quellcode:
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;
Error: Format %s ungültig oder nicht kompatibel mit Argument


:wall:

semo 29. Sep 2007 09:21

Re: format zur runtime mit versch.Typen
 
unit system.pas:
Delphi-Quellcode:
  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;
dementsprechend:

Delphi-Quellcode:
var
  Test : array [0..0] of TVarRec;
begin
  Test[0].VExtended^   := StrToFloat(Edit1.text);
  Label1.Caption := format( Edit2.text , Test);

HPW 29. Sep 2007 09:27

Re: format zur runtime mit versch.Typen
 
Danke, aber damit wirft es nun eine Exception.

semo 29. Sep 2007 09:46

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.

HPW 29. Sep 2007 10:09

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:
var
  Test : array [0..0] of TVarRec;
  extendedVal: Extended;
begin
  extendedVal := StrToFloat(Edit1.text);
  Test[0].VExtended := @extendedVal;
  Label1.Caption    := Format('%8.2f', Test);
Error: Format %8.2f ungültig oder nicht kompatibel mit Argument


Bis jetzt geht nur integer:

Test[0].VInteger := StrToInt(Edit1.text);
Label1.Caption := format( 'Integer: 3d' , Test);

jbg 29. Sep 2007 10:10

Re: format zur runtime mit versch.Typen
 
Zitat:

Zitat von M. Hassmann
so klappte es bei mir.

Und warum gehst du dann noch den Weg über TVarRec, wenn du das auch gleich ohne eine Variable lösen kannst? Das ist sicherlich nicht das, was HPW wollte.


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:

Zitat von HPW
Danke, aber damit wirft es nun eine Exception.

Das ist ja auch kein Wunder, denn mit Test[0].VExtended^ dereferenzierst du einen nicht initialisierten Zeiger, was unweigerlich zu einer Schutzverletzung führt.

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;

HPW 29. Sep 2007 13:14

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:
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;
Error: Operator ist auf diesen Operandentyp nicht anwendbar
in Zeile: Test[0].VAnsiString^ := Edit5.text;

Mit Zeigern tue ich mich immer schwer.

HPW 29. Sep 2007 13:35

Re: format zur runtime mit versch.Typen
 
Dies scheint zu funktionieren:
Delphi-Quellcode:
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.
Richtig so?

Ncohmal Danke für alle Beiträge!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz