Delphi-PRAXiS

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.

Schucki 18. Mär 2017 10:52

AW: Dword -> word ?
 
Zitat:

Zitat von Amateurprofi (Beitrag 1364637)
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.

Der Debugger schmeißt 4294967295 heraus. Jetzt ist mir aber auch aufgefallen das ich FALSCH in HEXA hab umrechnen lassen. Und zwar wurde der Wert dort als SIGNED betrachtet. was Quatsch ist.

4294967295 = $FFFFFFFF
damit stimmt die Umwandlung von DWORD zu WORD wohl, das Problem ist das die Funktion

WaveOutGetVolume(uDeviceId, @Volume) = MMSYSERR_NOERROR;

Meint es wäre alles richtig in Volume übertragen aber das stimmt anscheinend nicht denn die Lautstärken sind alle auf 50%. Warum ich den Umweg über ein Array gehen soll wenn es dafür Funktionen gibt bleibt mir ein Rätsel.

Grüße Frank

Schucki 18. Mär 2017 11:00

AW: Dword -> word ?
 
---

Luckie 18. Mär 2017 11:15

AW: Dword -> word ?
 
Also ist das eigentliche Problem jetzt gelöst? Für das andere Problem mach bitte einen neuen Thread auf.

p80286 18. Mär 2017 15:51

AW: Dword -> word ?
 
Zitat:

Zitat von Schucki (Beitrag 1364638)
Warum ich den Umweg über ein Array gehen soll wenn es dafür Funktionen gibt bleibt mir ein Rätsel.

Weil das, was Mavarik und ich Dir vorgeschlagen haben, eine andere Sichtweise auf das selbe Datum ist. Da ist kein weiterer Code für nötig. Bei mehreren tausend Aufrufen macht sich das schon bemerkbar. Aber das ist bei Dir ja nicht der Fall.

Gruß
K-H

Schucki 18. Mär 2017 23:29

AW: Dword -> word ?
 
Zitat:

Zitat von p80286 (Beitrag 1364655)
Weil das, was Mavarik und ich Dir vorgeschlagen haben, eine andere Sichtweise auf das selbe Datum ist. Da ist kein weiterer Code für nötig. Bei mehreren tausend Aufrufen macht sich das schon bemerkbar. Aber das ist bei Dir ja nicht der Fall.

OK an Tausende Aufrufe habe ich in dem Fall echt nicht gedacht aber wenn es mal zum tragen kommt dann kann ich mich hoffentlich daran erinnern! :-D

Dann danke für die Erklärung!

Gruß Frank


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