StringGadget-Eingabe einschränken, eventuelle Lösung!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

StringGadget-Eingabe einschränken, eventuelle Lösung!

Beitrag von Xaby »

>>>>>>>>>>>>>>>>>>>>>>>>>>>> Aktueller Code:

Erlaubt das setzen von genau einem Komma oder einem Punkt in einem StringGadget. Und verbietet die Zeichen $, %, #

Code: Alles auswählen

Enumeration
  #ListWin

  #ListWinStrID
  
  #ListWinFieldFrame
  #ListWinGroupFrame
  
EndEnumeration

#x=25
#c=-40
#v=10
#n=10
#m=-150

Procedure.s FormatString(String$,Repl$)
  Static i,l
  l=Len(Repl$)
  If l<>0
    For i=1 To l
      String$=ReplaceString(String$,Mid(Repl$,i,1),"") ; entfernen
    Next  
  EndIf  
  ProcedureReturn String$ 
EndProcedure

Procedure.s AreThereChars(String$,Find$,onetimeonly.l=1)
  Static i,l,A,k
  Static S.s,c.s
  S=""
  l=Len(Find$)
  If l<>0
    For i=1 To l
      
      c=Mid(Find$,i,1)
      A=CountString(String$,c)
      If A>0
        If onetimeonly
          A=1  
        EndIf
        For k=1 To A
          S=S+c
          Debug S
        Next
      EndIf
    Next
  EndIf 
  ProcedureReturn S
EndProcedure



Define SaveString$=""

If OpenWindow(#ListWin, 1145, 0, 445, 290, "Liste einstellen", #PB_Window_SystemMenu )
  CreateGadgetList(WindowID(#ListWin))
  
  Frame3DGadget(#ListWinGroupFrame,300+#m,#x+#c+15,290,260,"")
  
  Frame3DGadget(#ListWinFieldFrame,155+#m,#x+#c+15,140,260,"")
  StringGadget(#ListWinStrID,205+#m,#x+55+#c,80,20,"FeldID")
  GadgetToolTip(#ListWinStrID,"keine # $ %")
  
  Repeat
    Event = WaitWindowEvent()
    
    EventType=EventType()
    
    If Event=#PB_Event_Gadget
      GadgetNr=EventGadget()
      
      If GadgetNr=#ListWinStrID
        If EventType=#PB_EventType_Change
          If Len(AreThereChars(GetGadgetText(#ListWinStrID),"#%$"))<>0
            SetGadgetText(#ListWinStrID,FormatString(GetGadgetText(#ListWinStrID),"#%$")) 
          EndIf
          
          ; Nur ein Komma oder ein Punkt
          
          If Len(AreThereChars(GetGadgetText(#ListWinStrID),".,",0))=1
            SaveString$=GetGadgetText(#ListWinStrID) 
          EndIf
           
          If Len(AreThereChars(GetGadgetText(#ListWinStrID),".,",0))=2
            SetGadgetText(#ListWinStrID,SaveString$) 
          EndIf
           
        EndIf 
      EndIf
      
      
      
      
    ElseIf Event = #PB_Event_CloseWindow
      If EventWindow()=#ListWin
        Quit = 1
      EndIf  
    EndIf
    
  Until Quit = 1
  
EndIf

End

>>>>>>>>>>>>>>>>>>>>>>>>>>>> Alter Code: Problem:

Heho Freunde,
eine Möglichkeit wäre sicherlich

http://www.purebasic.fr/german/viewtopi ... ng+eingabe

Jeden zugelassenen Buchstaben neu zu programmieren.
Einschließlich der Pfeiltasten.
>> Aber ich will ja das Rad nicht neu erfinden.


Meine Idee:

Code: Alles auswählen


Enumeration
  #ListWin

  #ListWinStrID
  
  #ListWinFieldFrame
  #ListWinGroupFrame
  
EndEnumeration

#x=25
#c=-40
#v=10
#n=10
#m=-150

Procedure.s FormatString(String$)
  String$=ReplaceString(String$,"#","")
  String$=ReplaceString(String$,"$","")
  String$=UCase(String$)
  String$="#"+String$+"$"
  ProcedureReturn String$
EndProcedure


If OpenWindow(#ListWin, 1145, 0, 445, 290, "Liste einstellen", #PB_Window_SystemMenu )
  CreateGadgetList(WindowID(#ListWin))
  
  Frame3DGadget(#ListWinGroupFrame,300+#m,#x+#c+15,290,260,"")
  
  Frame3DGadget(#ListWinFieldFrame,155+#m,#x+#c+15,140,260,"")
  StringGadget(#ListWinStrID,205+#m,#x+55+#c,80,20,"FeldID")
  
  
  Repeat
    Event = WaitWindowEvent()
    
    EventType=EventType()
    
    If Event=#PB_Event_Gadget
      GadgetNr=EventGadget()
      
      If GadgetNr=#ListWinStrID
        If EventType=#PB_EventType_Change
          SetGadgetText(#ListWinStrID,FormatString(GetGadgetText(#ListWinStrID)))
        EndIf 
      EndIf
      
      
      
      
    ElseIf Event = #PB_Event_CloseWindow
      If EventWindow()=#ListWin
        Quit = 1
      EndIf  
    EndIf
    
  Until Quit = 1
  
EndIf

End
aber da springt der Couror immer wieder an den Anfang.

UpCase könnte man ja auch noch anders regeln.
Aber wie sieht es zum Beispiel mit Zifferneingabe aus, wo man genau ein Komma zulassen möchte?

Es sollte eine Methode sein, die keine Neuentwicklung des Gadgets benötigt.

Irgendwo hab ich hier schon mal was gelesen, aber ich find den Beitrag nicht mehr. Schön wäre auch, wenn es Plattform-übergreifend funktioniert.

Dank euch. :allright:
Zuletzt geändert von Xaby am 24.06.2007 18:00, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Im oberen Beispiel war ja das Problem, dass man bei jedem Buchstaben wieder an den Anfang gesetzt wird.

Wir könnten also folgendes machen:

Wir verzichten auf die Zeichen, die am Ende und am Anfang sein sollen.
Und lassen diese erstmal nicht zu.
Und später beim Auslesen hängen wir sie mit ran.

Code: Alles auswählen


Enumeration
  #ListWin

  #ListWinStrID
  
  #ListWinFieldFrame
  #ListWinGroupFrame
  
EndEnumeration

#x=25
#c=-40
#v=10
#n=10
#m=-150

Procedure.s FormatString(String$,Repl$)
  Static i,l
  l=Len(Repl$)
  If l<>0
    For i=1 To l
      String$=ReplaceString(String$,Mid(Repl$,i,1),"") ; entfernen
    Next  
  EndIf  
  ProcedureReturn String$ 
EndProcedure

Procedure.s AreThereChars(String$,Find$)
  Static i,l
  Static S.s,c.s
  S=""
  l=Len(Find$)
  If l<>0
    For i=1 To l
      c=Mid(Find$,i,1)
      If FindString(String$,c,1)
        S=S+c
      EndIf
    Next
  EndIf 
  ProcedureReturn S
EndProcedure


If OpenWindow(#ListWin, 1145, 0, 445, 290, "Liste einstellen", #PB_Window_SystemMenu )
  CreateGadgetList(WindowID(#ListWin))
  
  Frame3DGadget(#ListWinGroupFrame,300+#m,#x+#c+15,290,260,"")
  
  Frame3DGadget(#ListWinFieldFrame,155+#m,#x+#c+15,140,260,"")
  StringGadget(#ListWinStrID,205+#m,#x+55+#c,80,20,"FeldID")
  GadgetToolTip(#ListWinStrID,"keine # $ %")
  
  Repeat
    Event = WaitWindowEvent()
    
    EventType=EventType()
    
    If Event=#PB_Event_Gadget
      GadgetNr=EventGadget()
      
      If GadgetNr=#ListWinStrID
        If EventType=#PB_EventType_Change
          If Len(AreThereChars(GetGadgetText(#ListWinStrID),"#%$"))<>0
            SetGadgetText(#ListWinStrID,FormatString(GetGadgetText(#ListWinStrID),"#%$")) 
          EndIf
          
        EndIf 
      EndIf
      
      
      
      
    ElseIf Event = #PB_Event_CloseWindow
      If EventWindow()=#ListWin
        Quit = 1
      EndIf  
    EndIf
    
  Until Quit = 1
  
EndIf

End

If Len(AreThereChars(GetGadgetText(#ListWinStrID),"#%$"))<>0
SetGadgetText(#ListWinStrID,FormatString(GetGadgetText

Hier wäre es cool, wenn das zutrifft, dass
beim Setzen des GadgetTextes der Coursor nicht nach vorn springt.
Und der GadgetToolTip aufblinkt, und die falschen Zeichen anzeigt.


Nun bleibt die Frage, wie man einen "Numbers-Only-String"
um die Eingabe eines Kommas oder Punktes erweitert.
Aber nur so, dass genau eines der Zeichen genau einmal zugelassen wird.

Es spielt dann also keine Rolle, ob: 1000,56 oder 85.8787 oder 542
Komma und Punkt werden gleich behandelt.
Tausender Trennzeichen gibt es nicht.

Alternative wären zwei Stringeingabe Felder, beide nur Zahlen.

Genauso ist die Frage, wie man einen Datumsstring mit Formatierung ordentlich eingibt. So dass man eine Art 3 x Eingabemöglichkeit hat.

Eine Combobox, in die man was eingeben kann und in der man zuletzt eingegebene Daten (Datumse) auswählen kann und daneben oder bei Doppelklick auf das "String-Datums"-Gadget ... erscheint ein kleines KalenderGadget.

Die Eingabe eines Datums kann ja auf tausend Wegen erfolgen.
Man müsste also einen Parser basteln, der Unterscheide:

12.3
34|12|2002
5-7-08

Klug ergänzen und überprüfen, ob das Datum zugelassen ist.

Und wenn man zum Beispiel %heute
eingibt, erscheint gleich das Datum von heute.

Aber beim Datum ist wahrscheinlich ein CalenderGadget() die einfachste Methode. Da können keine Fehler bei der Eingabe passieren.

Aber bereits ausgewählte Daten, sollte man schon irgendwie in eine Combobox mit aufnehmen.


Die Frage ist ja auch, wie kann man ein Datum "hinein" kopieren?
In zum Beispiel eine Eingabe?

Da wird man wohl um eine fette Analyse des eigentlichen Textes nicht herum kommen. Oder man sagt: Wenn Datum nicht im Format TT:MM:JJJJ
dann CalenderGadget()

:roll:

Aber jemand eine Idee, wie man Zahlen mit Kommas ordentlich eingibt?
Das wäre auch für ein StringGadget( #PB_Calender_String)
sinnvoll.

Nur |, ., : zulassen.
Und als GadgetToolTip immer anzeigen lassen, was man gerade eingegeben hat.

20070504

Autoverfolständigung ist natürlich dann wieder luxus.

/:->
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

>> Man kann das Ganze auch als Feature verkaufen:
Folker hat geschrieben:Damit Sie merken, wenn Sie eine ungültige Eingabe gemacht haben, werden Sie nicht wie gewohnt von einem nervigen Signalton darauf hingewiesen, sondern das Programm ist so eingestellt, dass es als Hinweis auf die Fehleingabe Ihren Cursor an den Anfang der Eingabe setzt.
:allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Führst Du Selbstgespräche? /:->
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kiffi hat geschrieben:Führst Du Selbstgespräche? /:->
Bild
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Das Problem ist doch, wenn man 3 x Code in einen Beitrag schiebt, sieht man nachher den Unterschied doch gar nicht.

Und wie ihr aus dem Mülleimer wisst:

Ihr seid doch nur neidisch, dass ihr die Stimmen nicht hört /:->
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du könntest ja mal, wenn du erst kürzlich so ein erlebnis der vermülleimerung hinter dir hast,
dafür sorge tragen, dass deine postings/threads etwas allgemeinverträglicher sind.

dabei rede ich nicht vom unterdrücken deiner persönlichkeit, das mach ich ja schließlich auch nicht,
sondern lediglich von ein wenig anpassung.

ich bin auch ne alte schwatzbase, und hab seit jahren kein marathon-posting mehr geschrieben.....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten