; Diese Procedure filtert aus einer Eingabe vorgegebene Zeichen aus ; geschrieben: Jens (sharkpeter) Haipeter / Juli 2005 ; aus der Not heraus, Komma/Punkt und Vorzeichen in einem numerischen ; String nicht eingeben zu können. ; Der Code ist nicht optimiert, funktioniert jedoch. ; beim Start wird eine Beispiel ausgeführt, für weitere Verwendungen ; nur die Procedure kopieren. Ich habe diese bewußt an das Ende gesetzt. ; Chemnitz, den 16.07.2005 ; Nummerierungen Enumeration #Window EndEnumeration Enumeration #String_0 #Spin_0 #Spin_1 #Spin_2 #Text_0 #Text_1 #Text_2 #Text_3 #Button_0 EndEnumeration ; globale Variable Global _stoptit.s Global _infomsg.s Global _MessageID.l ; globale zuweisen _stoptit ="ABBRUCHINFORMATION" _infomsg ="no message" _MessageID= 0 ; oldstring ist der übergebene Text ; nks ist die Anzahl der übergebenen darzustellenden Nachkommastellen ; maximum ist der Größtwert den die Zahl annehmen darf ; minimum ist der Kleinstwert den die Zahl annehmen darf Declare.s ZahlenStrings(oldstring.s,nks.l,maximum.l,minimum.l) ; RequesterStop ist ein Standard aus einer *.pbi ; mache ich immer so, brauche dann nur die Texte übergeben Procedure MessageBoxS() MessageRequester(_stoptit,_infomsg,#MB_IconStop) _stoptit ="ABBRUCHINFORMATION" _infomsg ="no message" _MessageID = 1 EndProcedure ; Fenster und Gadget If OpenWindow(#Window, 0, 0,600,180,#PB_Window_Titlebar|#PB_Window_Invisible|#PB_Window_ScreenCentered,"Filtern von Zeichen aus einem String - Beispiel") If CreateGadgetList(WindowID()) ButtonGadget(#Button_0, 10,144,580, 26,"Beenden") SpinGadget (#Spin_0 , 10, 10, 40, 20, 1, 10) TextGadget (#Text_0 , 60, 14,120, 14,"Nachkommastellen") TextGadget (#Text_1 , 10, 80,580, 60,"Nachkommastellen auswählen, minimum/maximum (-9999 bis 9999) auswählen, Zahl eingeben, kann auch Leerzeichen, Buchstaben und so weiter enthalten, dann mit bestätigen, das Ergebnis ist nur noch eine Zahl mit Vorzeichen. Da dies nur ein Beispiel ist, die Begrenzung auf -9999/+9999 über Spingadget. Ebenso habe ich nicht die gegenseitige Anpassung bei Überschneidungen beachtet.") TextGadget (#Text_2 ,260, 14,100, 14,"Wert Minimum") TextGadget (#Text_3 ,430, 14,100, 14,"Wert Maximum") SpinGadget (#Spin_1 ,200, 10, 50, 20,-9999,9999) SpinGadget (#Spin_2 ,370, 10, 50, 20,-9999,9999) StringGadget(#String_0, 10, 50,580, 20,"0.0",#PB_String_MultiLine) SetGadgetState(#Spin_0,1) SetGadgetText (#Spin_0,Str(GetGadgetState(#Spin_0))) SetGadgetState(#Spin_1,0) SetGadgetText (#Spin_1,Str(GetGadgetState(#Spin_1))) SetGadgetState(#Spin_2,500) SetGadgetText (#Spin_2,Str(GetGadgetState(#Spin_2))) Else End EndIf Else End EndIf HideWindow(#Window,0) Quit=#False minimum=0 maximum=500 ; Schleife Repeat Select WaitWindowEvent() Case #PB_Event_Gadget Select EventGadgetID() Case #Button_0; beenden Quit=#True Case #Spin_0 ; Nachkommastellen SetGadgetText (#Spin_0,Str(GetGadgetState(#Spin_0))) nks=GetGadgetState(#Spin_0) Case #Spin_1; Text If GetGadgetState(#Spin_1)>30000 SetGadgetText (#Spin_1,Str(GetGadgetState(#Spin_1)-65536)) minimum=GetGadgetState(#Spin_1)-65536 Else SetGadgetText (#Spin_1,Str(GetGadgetState(#Spin_1))) minimum=GetGadgetState(#Spin_1) EndIf Case #Spin_2; Maxium If GetGadgetState(#Spin_2)>30000 SetGadgetText (#Spin_2,Str(GetGadgetState(#Spin_2)-65536)) maximum=GetGadgetState(#Spin_2)-65536 Else SetGadgetText (#Spin_2,Str(GetGadgetState(#Spin_2))) maximum=GetGadgetState(#Spin_2) EndIf Case #String_0; Text Select EventType() Case #PB_EventType_ReturnKey SetGadgetText(#String_0,ZahlenStrings(GetGadgetText(#String_0),nks,maximum,minimum)) EndSelect EndSelect EndSelect Until Quit CloseWindow(#Window); mache ich immer, weil sonst kann es sein, das es in der Taskleiste stehen bleibt End Procedure.s ZahlenStrings(oldstring.s,nks.l,maximum.l,minimum.l) ; oldstring ist der übergebene Text ; nks ist die Anzahl der übergebenen darzustellenden Nachkommastellen ; maximum ist der Größtwert den die Zahl annehmen darf ; minimum ist der Kleinstwert den die Zahl annehmen darf ; ; wenn die Übergabe leer ist If oldstring="": oldstring="0.": EndIf ;Debug oldstring ; Minimum/Maximum Nachkommastellen If nks<1: nks=1: EndIf If nks>4: nks=4: EndIf ; Leerzeichen entfernen oldstring=RemoveString(oldstring," ") ; Komma durch Punkt ersetzen If FindString(oldstring,",",1) oldstring=ReplaceString(oldstring,",",".",1,1) EndIf ; erstes Dezimaltrennzeichen finden, alle anderen entfernen dtz=FindString(oldstring,".",1) If dtz oldstring=RemoveString (oldstring,".") oldstring=Left(oldstring,dtz-1)+"."+Mid(oldstring,dtz,20) Else oldstring=oldstring+"." EndIf ;Debug oldstring ; führende Null vor Komma setzen bzw. führende Nullen entfernen If FindString(oldstring,".",1)=1 oldstring="0"+oldstring Else Quit=#False Repeat If FindString(oldstring,"0",1)=1 If FindString(oldstring,".",1)<>2 oldstring=Right(oldstring,Len(oldstring)-1) Else Quit=#True EndIf Else Quit=#True EndIf Until Quit EndIf ;Debug oldstring ; nur zugelassene Zeichen, alles andere ausblenden For a=0 To 255 If a=0 Or a=13 Or (a>42 And a<47) Or (a>47 And a<58) Else If FindString(oldstring,Chr(a),1) oldstring=RemoveString(oldstring,Chr(a)) EndIf EndIf Next a ; Pluszeichen entfernen oldstring=RemoveString(oldstring,"+") ; Minuszeichen prüfen, mehrfache entfernen) If FindString(oldstring,"-",1)=1 oldstring="-"+RemoveString(oldstring,"-") Else oldstring=RemoveString(oldstring,"-") EndIf ; Minus bei Null entfernen If ValF(oldstring)=0 oldstring=RemoveString(oldstring,"-") EndIf ; Minimum/Maximum prüfen If ValF(oldstring)>maximum oldstring="Error, Wert "+oldstring+" zu groß" ElseIf ValF(oldstring)