Seite 1 von 1
Inhalte von ComboBoxen vergleichen
Verfasst: 23.11.2008 19:22
von ThoPie
Hallo,
ich habe in einem Fenster 7 ComboBoxen mit gleichen Auswahlmöglichkeiten. Beim Abspeichern müssen alle ComboBoxen eine unterschiedliche Auswahl haben. Ich könnte jetzt mit GetGadgetState jede Box mit jeder vergleichen. Hat jemand eine Idee, wie ich das einfacher gestalten kann?
Vielen Dank.
Verfasst: 23.11.2008 20:20
von sibru
basiert auch auf GetGadgetState(), jedoch nur 7mal (in deinem Beispiel)
Code: Alles auswählen
#PB_Vers = "PB4.20"
;liefert 0, wenn ein GadgetState mehrfach vorkommt,
;ansonsten 1
Procedure StateChek(GadNr1, GadNr9) ;von #GadNr ... bis #GadNr
Protected StateQueue$ ;Status-Collector
Protected ErrFlag = 99999
While GadNr1< = GadNr9 ;alle Gadget´s durchgehen !!! müßen nacheinander angelegt werden !!!
State$ = " " + GetGadgetState(GadNr1) + " "
If FindString(StateQueue$, State$, 1) = 0 ;status noch nicht im Collector
StateQueue$ + State$
GadNr1 + 1
Else ;status bereits vorhanden:
GadNr1 = ErrFlag ;abbruch-flag setzen
EndIf
Wend
; If GadNr1 = ErrFlag ;für PB < 4.0 (boolscher AusdruckParser defekt)
; ProcedureReturn 0
; Else
; ProcedureReturn 1
; EndIf
ProcedureReturn Not(GadNr1 = ErrFlag) ;für PB >= 4.0
EndProcedure
Oder So
Verfasst: 23.11.2008 23:51
von Kai
Code: Alles auswählen
Procedure Check()
For c1 = 0 To 6
For c2 = 0 To 6
If c1 <> c2 And GetGadgetState(c1) = GetGadgetState(c2)
MessageRequester("Check", "Gadget " + Str(c1) + " hat die Gleiche Auswahl wie Gadget " + Str(c2))
ProcedureReturn 1
EndIf
Next
Next
MessageRequester("Check", "Keine identischen Auswahlen")
EndProcedure
OpenWindow(0, 0, 0, 250, 220, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
For g = 0 To 6
ComboBoxGadget(g, 5, 5 + 25 * g, 180, 20)
For f = 0 To 10 : AddGadgetItem(g, -1, Str(f)) : Next
SetGadgetState(g, g)
Next
ButtonGadget(7, 5, WindowHeight(0) - 29, 80, 24, "Check")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 7
Check()
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
Verfasst: 24.11.2008 14:12
von AND51
Kai, deine Idee geht auch noch ein bisschen optimierter:
Code: Alles auswählen
Procedure Check()
For c1 = 0 To 6
For c2 = c1+1 To 6
If GetGadgetState(c1) = GetGadgetState(c2)
MessageRequester("Check", "Gadget " + Str(c1) + " hat die Gleiche Auswahl wie Gadget " + Str(c2))
ProcedureReturn 1
EndIf
Next
Next
MessageRequester("Check", "Keine identischen Auswahlen")
EndProcedure
OpenWindow(0, 0, 0, 250, 220, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
For g = 0 To 6
ComboBoxGadget(g, 5, 5 + 25 * g, 180, 20)
For f = 0 To 10 : AddGadgetItem(g, -1, Str(f)) : Next
SetGadgetState(g, g)
Next
ButtonGadget(7, 5, WindowHeight(0) - 29, 80, 24, "Check")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 7
Check()
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
Na, schon entdeckt?

Verfasst: 24.11.2008 14:20
von ThoPie
Danke schön
Verfasst: 24.11.2008 18:33
von Kai
AND51 hat geschrieben:Kai, deine Idee geht auch noch ein bisschen optimierter:
Code: Alles auswählen
Procedure Check()
For c1 = 0 To 6
For c2 = c1+1 To 6
If GetGadgetState(c1) = GetGadgetState(c2)
MessageRequester("Check", "Gadget " + Str(c1) + " hat die Gleiche Auswahl wie Gadget " + Str(c2))
ProcedureReturn 1
EndIf
Next
Next
MessageRequester("Check", "Keine identischen Auswahlen")
EndProcedure
OpenWindow(0, 0, 0, 250, 220, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
For g = 0 To 6
ComboBoxGadget(g, 5, 5 + 25 * g, 180, 20)
For f = 0 To 10 : AddGadgetItem(g, -1, Str(f)) : Next
SetGadgetState(g, g)
Next
ButtonGadget(7, 5, WindowHeight(0) - 29, 80, 24, "Check")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 7
Check()
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
Na, schon entdeckt?

Code: Alles auswählen
If IsWindowVisible_(AND51)
ShowWindow_(KAI, #SW_HIDE)
EndIf
Ne Scherz beiseite, da haste ja echt ne derbe Optimierung eingebaut.

Verfasst: 24.11.2008 19:44
von AND51
Kai hat geschrieben:da haste ja echt ne derbe Optimierung eingebaut.

Ich hoffe, du meinst das
nicht ironisch.

Denn das fänd ich nicht komisch.
Dein Code braucht 49 Durchläufe, meiner nur 21. Gerade bei ähnlichen Situationen wenn es zum Beispiel um Dateivergleiche oder Stringvergleiche geht ist das ein enormer Vorteil, möglichst wenig Schleifendurchläufe zu haben!
Wie ich bereits mehrfach in diesem Forum erwähnt habe, reicht es, jedes Element nur mit allen
nachfolgenden Elementen zu vergleichen; das ist der optimalste Weg. Diesen Rat wollte ich dir (und anderen) auf diesem Wege nur gegeben haben.
