Zitat von
Helmi:
Caption := IntToStr(Msg.WParam + Msg.LParam);
Du kannst die Werte aber nicht so einfach addieren - das geht schief. Wird dort wahrscheinlich zu einem Integerüberlauf kommen und die von Dir beobachteten "negativen" Zahlen treten auf. Das lustige ist, Du hast die richtige Lösung auskommentiert:
Progressbar1.Position := (Int64(Msg.LParam) shl 32) + Msg.WParam;
Entsprechend sollte folgendes das gewünschte Ergebnis liefern:
Caption := IntToStr((Int64(Msg.LParam) shl 32) + Msg.WParam);
Du scheinst auch nicht wirklich verstanden zu haben, was der Code genau macht. Von daher versuch ich es Dir mal zu erklären. Vereinfacht gesagt besteht ein INT64 aus 2 normalen Integern. Ein Integer ist 4 Byte groß, ein INT64 entsprechend 8 Byte. Wie stellst Du jetzt auf einem 32 Bit System einen 64 Bit Wert da. Naja, mit Hilfe von 2 32 Bit Werten. Der erste Integer (in unserem Falle LParam) nimmt die ersten 32 Bit des 64 Bit Wertes auf und der zweite Integer die letzten 32 Bit des 64 Bit Integer Wertes. Angenommen wir haben jetzt folgenden Int64 Wert:
Dieser würde dargestellt werden durch:
Code:
LPARAM = 0x11111111
WPARAM = 0x22222222
Quizfrage:
Was passiert jetzt, wenn ich LPARAM mit WPARAM addiere?
Code:
0x11111111
0x22222222
----------
0x33333333
Das ist aber nicht, was wir eigentlich wollten. Was wir eigentlich wollten ist folgende Addition:
Code:
0x1111111100000000
0x0000000022222222
------------------
0x1111111122222222
Wir müssen also die Bytes von LPARAM nach Links verschieben. Dazu gibt es den Befehl shl (shift left = "Verschiebe nach Links"). Der Befehl "shl 32" bewirkt also, daß der Wert um 32 Bits (oder 4 Bytes) nach links verschoben wird. Nur wenn Du den Wert shiftest, macht die Addition auch das, was Du wirklich erreichen willst.
Ich hoffe mal es ist Dir jetzt klar geworden wo der Fehler war und wieso Du den Wert shiften musst
.