Seite 1 von 5

StringGadget VS #PB_String_Numeric

Verfasst: 18.03.2006 15:56
von sharkpeter
Was bedeutet eigentlich numerisch, nur Ganzzahlen oder auch reale Zahlen, also
auch positive, negative und Fließkommazahlen.

Es ist nach wie vor ärgerlich, das man in ein StringGadget mit dem gesetzten Flag
#PB_String_Numeric KEINE solchen Werte eingeben kann.

@André

wenn du die Hilfe vielleicht daraufhin anpassen könntest? Es sollte schon da stehen
das es nur Ganzzahlen sind und keine Fließkommazahlen.

Gruß Jens

Verfasst: 18.03.2006 18:25
von ts-soft
>> Es sollte schon da stehen das es nur Ganzzahlen sind und keine Fließkommazahlen.
Nur positive Ganzzahlen!

Verfasst: 18.03.2006 19:08
von sharkpeter
@TS,

das kann für PB schon sein, aber es gibt eigentlich eine andere Erläuterung
dazu:

in der MS-SDK steht folgendes:

Numeric Literal Syntax
The following syntax is used for numeric literals in ODBC:
numeric-literal ::= signed-numeric-literal | unsigned-numeric-literal
signed-numeric-literal ::= [sign] unsigned-numeric-literal
unsigned-numeric-literal ::= exact-numeric-literal |
approximate-numeric-literal
exact-numeric-literal ::= unsigned-integer [period[unsigned-integer]] |
period unsigned-integer
sign ::= plus-sign | minus-sign
approximate-numeric-literal ::= mantissa E exponent
mantissa ::= exact-numeric-literal
exponent ::= signed-integer
signed-integer ::= [sign] unsigned-integer
unsigned-integer ::= digit...
plus-sign ::= +
minus-sign ::= -
digit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
period ::= .
© 1998-2004 Microsoft Corporation. All rights reserved.

Gruß Jens

Verfasst: 18.03.2006 19:15
von ts-soft
Bloß das das Ganze mit ODBC nichts zu tun hat, für Controls hat Billy es
anders implementiert (Ich nehme mal an, das es ein natives Feature ist, bin
aber zu Faul da nachzuforschen)

Verfasst: 18.03.2006 19:27
von sharkpeter
@TS,

das mag ja richtig sein, FALSCH ist jedoch, die anderen Zahlentypen von vornherein einfach
unter den Tisch zu kehren und dies nicht einmal zu kommentieren.

Außerdem sollte das nur der Verdeutlichung dienen, was denn NUMERISCH ist.

Gruß Jens

Verfasst: 18.03.2006 19:34
von ts-soft
Ich stimme Dir ja zu, aber:
Wikipedia hat geschrieben:Eine Nummer (Adj.: numerisch) ist die eine Ganzzahl, die vor allem zur Kennzeichnung von - meist geordneten - Objekten verwandt wird.

Verfasst: 18.03.2006 19:49
von edel
das mag ja richtig sein, FALSCH ist jedoch, die anderen Zahlentypen von vornherein einfach
unter den Tisch zu kehren und dies nicht einmal zu kommentieren.
Wozu auch , WinApi heisst nicht "Flag setzen und gut ist". 'Nen
bisschen programmieren muss man ueberall.

Verfasst: 18.03.2006 19:59
von sharkpeter
@TS,

klar, numerisch heíßt auch ordnen, soweit so gut.

@hallodri,

Flag setzten, und gut, davon redet ja gar keiner. Nur der Aufwand der
dafür notwendig ist, ist doch schon was mehr. Solange man nur
Spielstände in so einem Ding anzeigen oder ändern will, ist ja positive
Ganzzahl in Ordnung.

Nur für andere Zwecke muß man u.u. mehr haben und das geht nur mit
einem nicht gesetztem Flag, nur sind dann auch alle anderen Zeichen
erlaubt. Und das ist oft sehr störend.

Gruß Jens

Verfasst: 18.03.2006 20:26
von edel

Code: Alles auswählen

  EnableExplicit
  
  Procedure SetCallbackEx(hWnd.l,Proc.l) 
    Protected OldProc = SetWindowLong_(hWnd,#GWL_WNDPROC,Proc) 
    
    If OldProc
      SetWindowLong_(hWnd,#GWL_USERDATA,OldProc)
    EndIf 
    
    ProcedureReturn OldProc
  EndProcedure
  
  Procedure callback(hWnd,Msg,wParam,lParam)
    Protected OldProc = GetWindowLong_(hWnd,#GWL_USERDATA)
    Protected len.l , input.s
    Protected Buffer.s = Space(128)
    
    if #WM_KEYUP = Msg
      
      If wParam = #VK_DECIMAL Or wParam = $BC 
        len = SendMessage_(hwnd,#WM_GETTEXT,30,@Buffer) 
        If FindString(Buffer,".",0) = 0
            If len = 0 or Buffer = "-"
              input = "0."
            Else
              input = "."
            EndIf
            SendMessage_(hwnd,#EM_REPLACESEL,0,@input)
          EndIf 
      endif 
      
      If wParam = #VK_SUBTRACT Or wParam = $BD
        len = SendMessage_(hwnd,#WM_GETTEXT,128,@Buffer)   
        if left(Buffer,1) <> "-" 
          input = "-"
          SendMessage_(hwnd,#EM_SETSEL,0,0) 
          SendMessage_(hwnd,#EM_REPLACESEL,0,@input) 
          SendMessage_(hwnd,#EM_SETSEL,len+1,len+1)
        endif  
      endif 
      
    endif 
    
    ProcedureReturn CallWindowProc_(oldPROC,hWnd,Msg,wParam,lParam)
  EndProcedure
  
  
  Define   WindowTitle.s = "Test"
  Define   CX.l          = 120
  Define   CY.l          = 50
  Define  *hString.long
  Define  *hWindow.long
  Define   WindowEvent.l
  
  *hWindow = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,CX,CY,WindowTitle)
  
  CreateGadgetList(*hWindow\l)
  *hString = StringGadget(#pb_any,10,10,100,20,"0",#PB_String_Numeric|#PB_Text_Right)
  SetCallbackEx(*hString\l,@callback()) 
  
  Repeat
    WindowEvent = WaitWindowEvent()  
    
    if WindowEvent = #PB_Event_Gadget
      if EventGadget() = *hString
        
        define result.s = GetGadgetText(*hString)
        
        if FindString(result,".",1)
          debug vald(result)
        else
          debug val(result)
        endif 
        
      endif 
    endif 
    
  Until WindowEvent = #WM_CLOSE

Verfasst: 18.03.2006 20:37
von ts-soft
@hallodri
Und wie schaltet man jetzt den Ballontip, welcher bei aktivierem XP-Style
kommt, ab :mrgreen:

Ansonsten funktioniert es ja!