Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mausrad simulieren (https://www.delphipraxis.net/106768-mausrad-simulieren.html)

Gehstock 16. Jan 2008 12:19


Mausrad simulieren
 
nach oben klappt so wie es soll aber nach unten versuche ich mit
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_WHEEL,0,0,-120,0);
was aber zu
Zitat:

[DCC Fehler] Maus.pas(61): E1012 Konstantenausdruck verletzt untere Grenzen
führt. Hat jemand ne Idee dazu?

Klaus01 16. Jan 2008 12:29

Re: Mausrad simulieren
 
Mahlzeit,

schau Dir im msdn2 mal die dwFlags bzw. dwData an.

Laut der Beschreibung sind dort negaive Werte erlaubt.
Aber ob -120 erlaubt ist?

Grüße
Klaus

Gehstock 16. Jan 2008 12:34

Re: Mausrad simulieren
 
auch -1 führt zum selben ergebnis

taaktaak 16. Jan 2008 12:41

Re: Mausrad simulieren
 
Moin, Moin,
hatte das bei MSDn auch gelesen. Seltsam ist aber, dass dwData als DWord deklariert ist - das passt nun eigentlich gar nicht zu der Aussage, dass man hier auch negative Werte eingeben kann. Kann man vielleicht mit DWord(-129) arbeiten??
Gruß Ralph
// jooo, das wird übersetzt - funktioniert es dann auch???????????

Gehstock 16. Jan 2008 12:44

Re: Mausrad simulieren
 
So geht das Danke
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_WHEEL,0,0,DWord(-120),0);

taaktaak 16. Jan 2008 12:45

Re: Mausrad simulieren
 
Prima!!!

DeddyH 16. Jan 2008 12:46

Re: Mausrad simulieren
 
Da wär ich ehrlich gesagt nie drauf gekommen (ist aber auch ausgesprochen dämlich implementiert).

Dunkel 16. Jan 2008 17:33

Re: Mausrad simulieren
 
Zitat:

Zitat von Gehstock
So geht das Danke
Delphi-Quellcode:
mouse_event(MOUSEEVENTF_WHEEL,0,0,DWord(-120),0);

Öhh... ist DWORD nicht vorzeichenlos? :gruebel: Was passiert dann beim Casten eines Integers nach DWORD im obigen Fall? Wird doch eigentlich nur das Minus "abgeschnitten", oder? Wie scrollt man dann in die andere Richtung?

Aber wenn's so funktioniert... :?

taaktaak 16. Jan 2008 17:55

Re: Mausrad simulieren
 
Moin Dunkel,
das ist eine berechtigte Frage die ich mir auch schon gestellt habe: Wandle mal -120 in eine DWord-Variable und zeige das Ergebnis an. Bei mir bleibt es bei -120 !!??. Bestimmt gibt es hier im Forum einen Wissenden, der das erklären kann - das würde mich auch mal interessieren!!
Gruß Ralph

DeddyH 16. Jan 2008 18:01

Re: Mausrad simulieren
 
Bei mir bleibt das keineswegs auf -120, sondern wird durch Überlauf (eigentlich ja eher "Unterlauf") zu 4294967176.
Kleiner Test:
Delphi-Quellcode:
ShowMessage(inttostr(DWord(-120)) + #13#10 + inttostr(MAXDWORD - 119));

Klaus01 16. Jan 2008 18:07

Re: Mausrad simulieren
 
Nun, wenn ich das so wandele:

Delphi-Quellcode:
edit1.Text:= IntToStr(dword(-120));
kommt kein -120 heraus.

Heißt das Minus denn nicht, daß das highbit auf 1 ist.
Wenn man dann einen signed Wert hat wird das highbit als Minus
interpretiert und man hat eine negative Zahl.

Grüße
Klaus

DeddyH 16. Jan 2008 18:10

Re: Mausrad simulieren
 
Ja eben, binär sind beide vollkommen gleich, erst durch das Casten in signed/unsigned ändern sie ggf. ihren Wert.

taaktaak 16. Jan 2008 18:11

Re: Mausrad simulieren
 
Ja richtig!
Genau das hätte ich auch erwartet:

Aber mit folgenden Code bleibt es bei -120 ...

Delphi-Quellcode:
procedure TfoTest9.buWhatsThisClick(Sender:TObject);
var t : Dword;
begin
  t:=dword(-120);
  showmessage(inttostr(integer(t)));
end;
Hihihihi - die Information, dass es sich um eine negative Zahl handelt, bleibt also erhalten (muss ja auch, sonst würd's mit dem Mausrad ja nicht funktionieren

DeddyH 16. Jan 2008 18:15

Re: Mausrad simulieren
 
Zitat:

Zitat von taaktaak
Hihihihi - die Information, dass es sich um eine negative Zahl handelt, bleibt also erhalten (muss ja auch, sonst würd's mit dem Mausrad ja nicht funktionieren

Logisch, die Information steht ja in einem einzigen Bit ;)

Dunkel 16. Jan 2008 18:40

Re: Mausrad simulieren
 
Aha. Also gibt es so gesehen (im Speicher) keinen Unterschied zwischen (ganzzahligen) signed/unsigned Datentypen, bis auf dass bei signed-Datentypen das High-Bit interpretiert wird, bei unsigned-Datentypen dieses ignoriert wird? Interessant.

_frank_ 16. Jan 2008 18:48

Re: Mausrad simulieren
 
Zitat:

Zitat von DeddyH
Logisch, die Information steht ja in einem einzigen Bit ;)

imho liegt -1 (integer) als $FFFFFFFF im speicher, 1 dagegen als $00000001. -2 dann $FFFFFFFE, usw.

negative Zahlen werden also als $FFFFFFFF-abs(wert+1) dargestellt

folglich ist nicht 1 bit für die Kennzeichnung negativer Werte zuständig. Es wären eher die ersten 16 bit (bei 32bit-Integer-Werten), sind alle 0 ist die Zahl positiv.

//edit
kleines Codebeispiel zum Testen:
Delphi-Quellcode:
for i:=-10 to 10 do
begin
  memo1.lines.Add(format('%.2d: %.8x',[i,i]));
end;
Gruß Frank

DeddyH 16. Jan 2008 19:04

Re: Mausrad simulieren
 
Wenn bei 32-Bit-Werten die ersten 16 nur für das Vorzeichen verwendet würden, wäre das aber extrem ineffektiv.

_frank_ 16. Jan 2008 19:17

Re: Mausrad simulieren
 
Zitat:

Zitat von DeddyH
Wenn bei 32-Bit-Werten die ersten 16 nur für das Vorzeichen verwendet würden, wäre das aber extrem ineffektiv.

ich hab nicht gesagt/gemeint, dass die ersten ersten 16 bit *nur* für das Vorzeichen verwendet werden, sondern dass man ggf. die ersten 16 bit braucht, um erkennen zu können, ob es sich um eine negative zahl handelt.
Wobei es durchaus sein kann dass man das höchstwertige bit als indikator auslesen kann, da ab diesen Wert die Negativen werte losgehen müssten. ich hab das jetzt nicht bis zuende getestet ;) jedefalls ists nicht so, dass man nur das höchstwertige bit setzen muss, um aus einer positiven Zahl eine negative machen kann.

ich vermute mal das die zahlen in der reihenfolge so im speicher liegen:
0,1..2147483647,-2147483648..-1 ($0-$FFFFFFFF)

da fällt mir grade ein Fehler in meiner Delphi-hilfe (3) auf.
Integer -2147483648..2147483647 32 Bit einschließlich Vorzeichen
Cardinal 0..2147483647 32 Bit, besitzt kein Vorzeichen
eigentlich müsste der Wertebereich von cardinal doppelt so groß sein...ist ja bei 16bit auch so:
Smallint -32768..32767 16 Bit einschließlich Vorzeichen
Word 0..65535 16 Bit, besitzt kein Vorzeichen

Gruß Frank

Apollonius 16. Jan 2008 19:25

Re: Mausrad simulieren
 
Du brauchst nur das erste Bit zur Vorzeichenbestimmung. $80000000 ist negativ, $7FFFFFFF positiv, das ist die Grenze der Vorzeichen und da änderst sich auch der Wert des höchstwertigen Bits.
Diese Darstellung hat übrigens zur Folge, dass die Addition von signed und unsigned Werten genau gleich verläuft. Nur die Interpretation ist anders.

DeddyH 16. Jan 2008 19:33

Re: Mausrad simulieren
 
Versuch mal Folgendes:
Delphi-Quellcode:
var Zahl: integer;
begin
  Zahl := MAXINT; //011111111 11111111 11111111 11111111
  ShowMessage(inttostr(Zahl));
  Zahl := Zahl xor (1 shl 31); //11111111 11111111 11111111 11111111
  ShowMessage(inttostr(Zahl));
end;


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