![]() |
Integer wert als Float interpretieren
Hallo erst einmal
ich bin hier neu und hoffe im Richtigen Forum gelandet zu sein also mein Problem ist ich bekomme über eine Windows Nachricht aus einer Dll ein Ereignis mitgeteilt in diesem ist im parameter Msg.lParam (integer) ein messwert codiert der von der DLL als Float geschrieben wird. Wie lann ich nun diesen wert in delphi auch als Float behandeln ich habe mit eine Funktion geschrieben
Delphi-Quellcode:
und so sieht der Aufruf aus
function LongToFreq(lParam : Integer):Float;
var fFloat : pointer; begin fFloat:=@lParam; result:=float(fFloat^); end;
Delphi-Quellcode:
nun erhalte ich in der Var fRPM den wert 0 obwohl result auf einem anderen Wert steht
procedure TDT30xRPM.do_Done(var MSG : TMessage);
begin fRPM:=LongToFreq(msg.LParam); end; was mache ich falsch schöne grüße vom bodensee |
Re: Integer wert als Float interpretieren
Delphi beherrscht eine implizite Typumwandlung. Weise dem Floatwert einfach den Integerwert zu:
Delphi-Quellcode:
Var
DoubleNumber : Double; IntegerNumber : Integer; Begin Integernumber := 30; DoubleNumber := IntegerNumber; |
Re: Integer wert als Float interpretieren
Bei Messages geht es ganz einfach. Du definierst nur einen eigenen Record, der bspw. so aussieht:
Delphi-Quellcode:
Und denn verwendest du in Do_Done.
type TSpecialMessage = packed record
Msg: Cardinal; WParam:LongInt; Messwert:Single; Result:LongInt; end; |
Re: Integer wert als Float interpretieren
Ah... ich hatte den Beitrag gar nicht richtig gelesen. :oops:
Die Lösung von Sirius müsste die richtige sein. |
Re: Integer wert als Float interpretieren
ich biete mapping auf eine Longvariable.
Delphi-Quellcode:
alternativ gibts eine Wurst von typecasts (durch den Umweg über Pointer streift man die Typisierung ab):
procedure TDT30xRPM.do_Done(var MSG : TMessage);
var buf: longint; f: single absolute buf; begin buf := msg.LParam; fRPM:= f; end;
Delphi-Quellcode:
fRPM := Single(Pointer(Addr(msg.lParam))^);
|
Re: Integer wert als Float interpretieren
Hallo,
@alzaimar: die implizite Typumwandlung klappt hier nicht, da der Wert tatsächlich ja ein 32bit-Float ist und kein 32bit-Integer. Ich würde entweder a) mit dem Move-Befehl arbeiten oder b) mit einem Variant record:
Delphi-Quellcode:
Hier aber Achtung auf Typsicherheit für künftige 64-Bit Compiler (Integer dann 64bittig...?!).
type
TIntOrFloat = record case IsFloat: boolean of true: (FloatValue: Single); false: (IntValue: Integer); end; ... var MyIntOrFloat: TIntOrFloat; begin MyIntOrFloat.IntValue := lParam; MyFreq := MyIntOrFloat.FloatValue; end; Gruß blauweiss |
Re: Integer wert als Float interpretieren
Danke für die schnelle hilfe habe das mit der TSpecialMessage gemacht werde aber das mapping auch noch versuchen da es mir fexibler erscheint
|
Re: Integer wert als Float interpretieren
Die SpecialMessage-Variante ist der normale Weg, wie es die gesamte VCL macht (schau mal in die Unit Messages, was da so alles deklariert ist).
|
Re: Integer wert als Float interpretieren
Hallo sirius
werde ich gleich mal reinschauen. mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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-2025 by Thomas Breitkreuz