AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

format zur runtime mit versch.Typen

Ein Thema von HPW · begonnen am 26. Sep 2007 · letzter Beitrag vom 29. Sep 2007
Antwort Antwort
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#1

format zur runtime mit versch.Typen

  Alt 26. Sep 2007, 09:48
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?
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#2

Re: format zur runtime mit versch.Typen

  Alt 26. Sep 2007, 10:04
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;
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#3

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 08:46
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


Hans-Peter
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#4

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 09:21
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);
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#5

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 09:27
Danke, aber damit wirft es nun eine Exception.
Hans-Peter
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#6

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 09:46
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.
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#7

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 10:09
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);
Hans-Peter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 10:10
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 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;
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#9

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 13:14
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.
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#10

Re: format zur runtime mit versch.Typen

  Alt 29. Sep 2007, 13:35
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!
Hans-Peter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 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