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? :wink:

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? :wink:

Code: Alles auswählen

If IsWindowVisible_(AND51)
 ShowWindow_(KAI, #SW_HIDE)
EndIf


Ne Scherz beiseite, da haste ja echt ne derbe Optimierung eingebaut. :lol:

Verfasst: 24.11.2008 19:44
von AND51
Kai hat geschrieben:da haste ja echt ne derbe Optimierung eingebaut. :lol:
Ich hoffe, du meinst das nicht ironisch. /:-> Denn das fänd ich nicht komisch. :twisted:

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. :allright: