Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dword -> word ? (https://www.delphipraxis.net/192077-dword-word.html)

Schucki 17. Mär 2017 23:01

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:
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;
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 ?

Gruß Frank

Zacherl 17. Mär 2017 23:41

AW: Dword -> word ?
 
Woher stammen denn die Funktionen? Mein Delphi kennt nur
Delphi-Quellcode:
HiWord
und
Delphi-Quellcode:
LoWord
aus Winapi.Windows.

Alternativ manuell:
Delphi-Quellcode:
  w1 := (dw shr 16) and $FFFF;
  w2 := dw and $FFFF;

himitsu 18. Mär 2017 01:12

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.

Schucki 18. Mär 2017 09:49

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:
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;
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.

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

Mavarik 18. Mär 2017 09:54

AW: Dword -> word ?
 
http://www.delphipraxis.net/622763-post7.html

p80286 18. Mär 2017 10:04

AW: Dword -> word ?
 
wie wäre es hiermit:
Delphi-Quellcode:
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;
Gruß
K-H

Edith:
das gleiche in Grün

Mavarik 18. Mär 2017 10:13

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:

p80286 18. Mär 2017 10:19

AW: Dword -> word ?
 
Das kennen doch nur die alten säcke:mrgreen:

Gruß
K-H

Mavarik 18. Mär 2017 10:33

AW: Dword -> word ?
 
Zitat:

Zitat von p80286 (Beitrag 1364635)
Das kennen doch nur die alten säcke:mrgreen:

Und die müssen dafür sorgen, dass die Kiddys das nicht vergessen...:twisted:

Amateurprofi 18. Mär 2017 10:37

AW: Dword -> word ?
 
Zitat:

Zitat von Schucki (Beitrag 1364630)
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.

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

Wenn Volume den Wert $19999999 hätte, dann wäre das dezimal 429496729 (nicht 4294967295)
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 19:37 Uhr.
Seite 1 von 2  1 2      

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