Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Integer wert als Float interpretieren (https://www.delphipraxis.net/146693-integer-wert-als-float-interpretieren.html)

freepinguin 25. Jan 2010 15:11


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:
function LongToFreq(lParam : Integer):Float;
var
  fFloat : pointer;
begin
  fFloat:=@lParam;
  result:=float(fFloat^);
end;
und so sieht der Aufruf aus
Delphi-Quellcode:
procedure TDT30xRPM.do_Done(var MSG : TMessage);
begin
  fRPM:=LongToFreq(msg.LParam);
end;
nun erhalte ich in der Var fRPM den wert 0 obwohl result auf einem anderen Wert steht

was mache ich falsch

schöne grüße vom bodensee

alzaimar 25. Jan 2010 15:13

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;

sirius 25. Jan 2010 15:22

Re: Integer wert als Float interpretieren
 
Bei Messages geht es ganz einfach. Du definierst nur einen eigenen Record, der bspw. so aussieht:
Delphi-Quellcode:
type TSpecialMessage = packed record
       Msg: Cardinal;
       WParam:LongInt;
       Messwert:Single;
       Result:LongInt;
     end;
Und denn verwendest du in Do_Done.

alzaimar 25. Jan 2010 15:25

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.

helgew 25. Jan 2010 15:25

Re: Integer wert als Float interpretieren
 
ich biete mapping auf eine Longvariable.

Delphi-Quellcode:
procedure TDT30xRPM.do_Done(var MSG : TMessage);
var
  buf: longint;
  f: single absolute buf;
begin
  buf := msg.LParam;
  fRPM:= f;
end;
alternativ gibts eine Wurst von typecasts (durch den Umweg über Pointer streift man die Typisierung ab):

Delphi-Quellcode:
fRPM := Single(Pointer(Addr(msg.lParam))^);

blauweiss 25. Jan 2010 15:29

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:
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;
Hier aber Achtung auf Typsicherheit für künftige 64-Bit Compiler (Integer dann 64bittig...?!).

Gruß
blauweiss

freepinguin 25. Jan 2010 15:30

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

sirius 25. Jan 2010 15:37

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).

freepinguin 25. Jan 2010 15:39

Re: Integer wert als Float interpretieren
 
Hallo sirius

werde ich gleich mal reinschauen.

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 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