Inhalte von ComboBoxen vergleichen
Inhalte von ComboBoxen vergleichen
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.
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.

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


- Kai
- Beiträge: 264
- Registriert: 29.09.2005 20:58
- Computerausstattung: iMac 2019
- Wohnort: Hannover
- Kontaktdaten:
Oder So
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
Kai, deine Idee geht auch noch ein bisschen optimierter:
Na, schon entdeckt? 
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

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- Kai
- Beiträge: 264
- Registriert: 29.09.2005 20:58
- Computerausstattung: iMac 2019
- Wohnort: Hannover
- Kontaktdaten:
AND51 hat geschrieben:Kai, deine Idee geht auch noch ein bisschen optimierter:Na, schon entdeckt?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
Code: Alles auswählen
If IsWindowVisible_(AND51)
ShowWindow_(KAI, #SW_HIDE)
EndIf
Ne Scherz beiseite, da haste ja echt ne derbe Optimierung eingebaut.

Ich hoffe, du meinst das nicht ironisch.Kai hat geschrieben:da haste ja echt ne derbe Optimierung eingebaut.


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.

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End