Negative Gadgetstates bei Spingadgets

Anfängerfragen zum Programmieren mit PureBasic.
upgrader
Beiträge: 8
Registriert: 04.06.2008 15:35

Negative Gadgetstates bei Spingadgets

Beitrag von upgrader »

Ich will negative Gadgetstates bei Spingadgets haben. Beim Auslesen mit
s = getGadgetState (x) klappt das aber nur, wenn s eine WORD-Variable ist. Alle anderen Formate ergeben das Zweierkomplement. Also mit s long ergibt das s.l = 65535. Mit Bit Operationen kann man das zwar umrechnen, aber warum nur WORD-Variablen? In der Hilfe steht nix darüber.

Und warum ergibt

Code: Alles auswählen

x.b = 7
c.b =  (x = 7)
Debug c
immer 7?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

1)
von Windows aus selber ist der Wert nur ein Word. ist nunmal so.
das hat auch in der PB-Help nichts zu suchen, weil es eine OS-Eigenschaft ist.
solche Informationen findet man dann auf der MSDN.

verwundert mich etwas, dass es unsigned zurückgegeben wird und ohne Vorzeichen im Long landet,
aber das kannst du eben umgehen, indem du auch ein Word verwendest.


2)

Code: Alles auswählen

c.b =  (x = 7)
PureBasic unterstützt nativ keine Booleschen Ausdrücke.

wenn du unbedingt ein Bool-Ergebnis in c haben willst:

Code: Alles auswählen

If x=7
  c = #True
Else
  c = #False
EndIf
btw... wozu benutzt du dort Byte?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
upgrader
Beiträge: 8
Registriert: 04.06.2008 15:35

Beitrag von upgrader »

btw... wozu benutzt du dort Byte?
war nur vom Test übrig geblieben.

Also mit strings geht sowas: bool = (a$ = "Arsch") liefert korrekten Wert.
Eigentlich ist doch auch jeder Ausdruck in einem IF (Ausdruck) vom Wert Bool.
Das würde ich als Compiler-Fehler sehen, dass bei numerischen Werten offenbar statt die Prüfung auf Gleichheit eine Zuweisung gemacht wird:
a = (b = x) ist dann dasgleiche wie b = x : a = b.

Vom Compiler her würde ich sagen, dass es entweder ne Fehlermeldung gibt, oder es wird richtig gemacht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du brauchst mir nicht erklären, was Boole'sche Ausdrücke sind.
Sie werden in PureBasic nicht unterstützt.
Wenn es eindeutig heißt "wird nicht unterstützt",
dann ist das kein "Compilerfehler" sondern das ist einfach so.

es gibt ein inoffizielles Workaround:
du kannst einen Bool-Cast auf den ausdruck verwenden.

Code: Alles auswählen

a = 7
b = ((a=6) Or #False )
c = ((a=7) Or #False )
Debug a
Debug b
Debug c
aber das ist nur ein "dreckiges" workaround,
keine Garantie dass es mit allen PB-Versionen und in allen situationen korrekt funktioniert.

im endeffekt brauchst man solche Ausdrücke auch nicht wirklich,
PB ist so schnell, dass eine einfache If-Konstruktion oft zig mal schneller ist,
als ein Boole'sches Konstrukt in anderen Sprachen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Kaeru Gaman hat geschrieben:im endeffekt brauchst man solche Ausdrücke auch nicht wirklich,
PB ist so schnell, dass eine einfache If-Konstruktion oft zig mal schneller ist,
als ein Boole'sches Konstrukt in anderen Sprachen.
No comment. Aber die Tipparbeit würde man sich auch sparen.
Ich versteh auch nicht ganz *warum* es nicht funktioniert.
Bei meinem Compiler... ähmm

Wie wäre es das ganze in ein Macro zu verpacken?
Ist zwar auch mehr Tipparbeit, sieht IMO aber auch leserlich besser aus:

Code: Alles auswählen

Macro BOOL(x)
  ((x) or #False)
EndMacro

a=7
Debug BOOL(a=6)
Debug BOOL(2<0)
Debug BOOL(2>2)
Debug BOOL(3<>4)

b = BOOL(a=7)
Debug b
Hmm?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Danilo hat geschrieben:Ich versteh auch nicht ganz *warum* es nicht funktioniert.
ich habe es mittlerweile aufgegeben nachzufragen.
man bekommt halt keine Antwort.

klar kann man ein Macro draus machen, die Frage ist nur,
ob man immer exakt dieses Konstrukt haben will.

anyhow, ich hab mich drauf eingestellt, ohne Boole'sche Ausdrücke auszukommen,
dann bin ich auf der sicheren Seite, und muss mich auch nicht extrem umstellen,
wenn in der Hinsicht tatsächlich mal was getan wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Kaeru Gaman hat geschrieben:1)
von Windows aus selber ist der Wert nur ein Word. ist nunmal so.
das hat auch in der PB-Help nichts zu suchen, weil es eine OS-Eigenschaft ist.
solche Informationen findet man dann auf der MSDN.
Windows kann das sehr wohl, wenn auch erst ab IE 5.


Hier mal ein kleines Beispiel wie man das Spingadget mit Werten
groesser als Word nutzen kann :

Code: Alles auswählen

Structure PB_GadgetVT
  GadgetType.l
  SizeOf.l
  GadgetCallback.l
  FreeGadget.l
  GetGadgetState.l
  SetGadgetState.l
  GetGadgetText.l
  SetGadgetText.l
  AddGadgetItem2.l
  AddGadgetItem3.l
  RemoveGadgetItem.l
  ClearGadgetItemList.l
  ResizeGadget.l
  CountGadgetItems.l
  GetGadgetItemState.l
  SetGadgetItemState.l
  GetGadgetItemText.l
  SetGadgetItemText.l
  OpenGadgetList2.l
  GadgetX.l
  GadgetY.l
  GadgetWidth.l
  GadgetHeight.l
  HideGadget.l
  AddGadgetColumn.l
  RemoveGadgetColumn.l
  GetGadgetAttribute.l
  SetGadgetAttribute.l
  GetGadgetItemAttribute2.l
  SetGadgetItemAttribute2.l
  SetGadgetColor.l
  GetGadgetColor.l
  SetGadgetItemColor2.l
  GetGadgetItemColor2.l
  SetGadgetItemData.l
  GetGadgetItemData.l
EndStructure

Structure PB_Gadget
  Gadget.l
  *VT.PB_GadgetVT
  UserData.l
  OldCallback.l
  Daten.l[4]
EndStructure

#UDM_SETPOS32 = #WM_USER + 113
#UDM_GETPOS32 = #WM_USER + 114

Procedure Spin_GetGadgetState(*gadget.PB_Gadget)
  ProcedureReturn SendMessage_(*gadget\Daten[3], #UDM_GETPOS32, 0, 0)
EndProcedure

Procedure Spin_SetGadgetState(*gadget.PB_Gadget, State)
  SendMessage_(*gadget\Daten[3], #UDM_SETPOS32, 0, State)
EndProcedure

Procedure Spin_SetGadgetAttribute(*gadget.PB_Gadget, State, Val)
  Protected min.l
  Protected max.l
  
  SendMessage_(*gadget\Daten[3], #UDM_GETRANGE32, @min, @max)
  
  If state = #PB_Spin_Minimum
    SendMessage_(*gadget\Daten[3], #UDM_SETRANGE32, val, max)
  EndIf
  
  If state = #PB_Spin_Maximum
    SendMessage_(*gadget\Daten[3], #UDM_SETRANGE32, min, val)
  EndIf
  
EndProcedure

Procedure Spin_GetGadgetAttribute(*gadget.PB_Gadget, State)
  Protected min.l
  Protected max.l
  Protected res.l
  
  SendMessage_(*gadget\Daten[3], #UDM_GETRANGE32, @min, @max)
  
  If state = #PB_Spin_Minimum
    res = min
  EndIf
  
  If state = #PB_Spin_Maximum
    res = max
  EndIf
  
  ProcedureReturn res
EndProcedure

Procedure SpinGadgetEx(Gadget, x, y, cx, cy, min, max, Flags = 0)
  Protected res.l
  Protected id.l
  Protected *ga.PB_Gadget
  
  res = SpinGadget(Gadget, x, y, cx, cy, 0, 0, Flags)
  
  If Gadget = #PB_Any
    id = res
  Else
    id = Gadget
  EndIf
  
  *ga = IsGadget(id)
  
  If *ga
    *ga\VT\GetGadgetState = @Spin_GetGadgetState()
    *ga\VT\SetGadgetState = @Spin_SetGadgetState()
    *ga\VT\SetGadgetAttribute = @Spin_SetGadgetAttribute()
    *ga\VT\GetGadgetAttribute = @Spin_GetGadgetAttribute()
  EndIf
  
  SetGadgetAttribute(0, #PB_Spin_Minimum, min)
  SetGadgetAttribute(0, #PB_Spin_Maximum, max)
  
EndProcedure

Macro SpinGadget
  SpinGadgetEx
EndMacro

If OpenWindow(0, 0, 0, 140, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  SpinGadget(0, 20, 20, 100, 25, -111100, 1)
  SetGadgetState(0, -100000)
  SetGadgetText(0, "-100000")
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      If EventGadget() = 0
        Select EventType()
          Case #PB_EventType_Change
            SetGadgetState(0, Val(GetGadgetText(0)))
          Default
            SetGadgetText(0, Str(GetGadgetState(0)))
        EndSelect
        
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
upgrader
Beiträge: 8
Registriert: 04.06.2008 15:35

Beitrag von upgrader »

Gutes Beispiel, da kann man sich einige Anregungen holen.

Man muss sich schon mal genauer ausdrücken: PB unterstützt sehr wohl boolsche Ausdrücke aber keine boolschen Operationen. Kleiner Unterschied.

Im übrigen brauche ich das ja gerade bei einem Macro. Wenn nämlich an den Macro direkt zugewiesen wird, dann ist nix mit Abfragen im Macro.
Antworten