![]() |
Delphi-Version: 2010
Dword -> word ?
Hallo Profis,
ich habe ein Problem wo ich mir seit Tagen die Zähne aus beiße. Ich habe einen Wert vom Typ DWORD und möchte den in 2 WORD Variable zerlegen. Beispiel:
Delphi-Quellcode:
Inhalt von dw stimmt noch aber von d1 und d2 nicht. Da steht immer $FFFF drin, was mach ich da falsch? Ich erwarte eigentlich für d1 $1234 und d2 $5678 ?
var
dw: dword; w1: word; w2: word; begin dw := $12345678; w1 := HigWord(dw); w2 := LowWord(dw); ShowMessage(IntToStr(dw)); ShowMessage(IntToStr(w1)); ShowMessage(IntToStr(w2)); end; Gruß Frank |
AW: Dword -> word ?
Woher stammen denn die Funktionen? Mein Delphi kennt nur
Delphi-Quellcode:
und
HiWord
Delphi-Quellcode:
aus Winapi.Windows.
LoWord
Alternativ manuell:
Delphi-Quellcode:
w1 := (dw shr 16) and $FFFF;
w2 := dw and $FFFF; |
AW: Dword -> word ?
Ich glaub fast nicht, dass es diese Typen überhaupt standardmäßig im Delphi gibt, vor allem da "Hig" falsch geschrieben ist.
HiWord, LoWord, High und Low gibt es, wobei High(Word) natürlich $FFFF ist und Low(Word) ist 0. |
AW: Dword -> word ?
Danke für Eure Antworten, es war schon spät und ich hab das aus dem Kopf geschrieben ohne C&P aus Delphi deshalb die Fehler und auch die HEX Schreibweise weil ich die DEZ Werte nicht aus dem Kopf kannte.
Ich schick mal die GANZE Funktion, es geht darum die Lautstärke von einer Soundkarte zu ermitteln.
Delphi-Quellcode:
In wLVol und dRVol ist hier immer $FFFF (65535), setze ich einen Breakpoint in der Funktion dann sehe ich das in Volume aber tatsächlich $19999999 (4294967295) steht.
uses Classes, SysUtils, Windows, Dialogs, MmSystem;
function GetWaveVolume(uDeviceId:Cardinal; var wLVol: Word; var wRVol: Word): Boolean; var WaveOutCaps: TWaveOutCaps; Volume: dword; begin Result := False; if WaveOutGetDevCaps(uDeviceId, @WaveOutCaps, SizeOf(WaveOutCaps)) = MMSYSERR_NOERROR then if WaveOutCaps.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then begin Result := WaveOutGetVolume(uDeviceId, @Volume) = MMSYSERR_NOERROR; wLVol := HiWord(volume); wRVol := LoWord(volume); end; end; Es müste also einmal $1999 und einmal $9999 heraus kommen, tut es aber nicht. Hoffe das es nun komplett ist und ihr eine Lösung habt. ;-) |
AW: Dword -> word ?
|
AW: Dword -> word ?
wie wäre es hiermit:
Delphi-Quellcode:
Gruß
type
tmr = packed record w1 : word; w0 : word; end; var a : cardinal; b: integer; begin a:=$12345678 ; memo1.Lines.Add(inttohex(tmr(a).w1,4)); memo1.Lines.Add(inttohex(tmr(a).w0,4)); b:=$12345678; memo1.Lines.Add(inttohex(tmr(b).w1,4)); memo1.Lines.Add(inttohex(tmr(b).w0,4)); end; K-H Edith: das gleiche in Grün |
AW: Dword -> word ?
Delphi-Quellcode:
type
tmr = packed record w1 : word; w0 : word; end; var mr : Tmr; a : cardinal absolute mr; begin a:=$12345678 ; memo1.Lines.Add(inttohex(mr.w1,4)); memo1.Lines.Add(inttohex(mr.w0,4)); end; Dann aber so... :stupid: |
AW: Dword -> word ?
Das kennen doch nur die alten säcke:mrgreen:
Gruß K-H |
AW: Dword -> word ?
Zitat:
|
AW: Dword -> word ?
Zitat:
Anders herum, wenn Volume den Wert dezimal 4294967295 hätte dann wäre das $FFFFFFFF. Da (bei mir) im Debugger die dezimalen Werte angezeigt werden, vermute ich, dass Volume den Wert 4294967295 = $FFFFFFFF hat und du beim Umrechnen die am Ende stehende 5 vergessen hast. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 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