Inhalte von ComboBoxen vergleichen

Anfängerfragen zum Programmieren mit PureBasic.
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Inhalte von ComboBoxen vergleichen

Beitrag 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.
Bild
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag 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
Bild Bild
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Oder So

Beitrag 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
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Beitrag von ThoPie »

Danke schön
Bild
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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:
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten