ComboBoxGadget mit dynamischem Inhalt

Anfängerfragen zum Programmieren mit PureBasic.
mart
Beiträge: 7
Registriert: 29.06.2010 13:23

ComboBoxGadget mit dynamischem Inhalt

Beitrag von mart »

Hi Leute,
ich hab hier n Problem, dass mich schon seit ein paar Stunden ärgert. Ich hab ne Applikation geschrieben, mit der man unter anderem verschiedenen Einstellungen für eine serielle Verbindung einstellen kann. Über ein ComboBoxGadget kann man die verschiedenen verfügbaren COM-Schnittstellen auswählen. Jedes mal wenn dieses Gadget aktiviert wird, soll der Inhalt neu generiert werden, um bei COM-Schnittstellenveränderungen nur noch die aktuellen COM-Ports anzuzeigen. Ist im Prinzip ja nicht sehr schwer, aber jedes mal wenn das ComboBoxGadget aktiviert wird und man eine Schnittstelle ausgewählt hat, bleibt dieser Eintrag blau hinterlegt. Das ComboBoxGadget besitzt also noch den aktiven Focus. Wenn ich jetzt eine Schnittstelle verbinden will, muss ich mit dem Cursor erst eine beliebige Stelle auf dem Bildschirm betätigen, damit das ComboBoxGadget nicht mehr blau hinterlegt ist und der aktuelle Eintrag übernommen werden kann. Ansonsten denkt der Event_Manager, dass noch kein Eintrag im ComboBoxGadget ausgewählt wurde. Kann mir einer von euch helfen? Vielleicht hab ich auch einfach nen Denkfehler! Danke schonmal!

MfG Martin
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von TomS »

Kann ich nicht nachvollziehen. Kannst du mal Code posten?

Sobald ich einen Eintrag auswähle wird dieser übernommen.

Code: Alles auswählen

OpenWindow(0,0,0,200,100,"Combobox")

	ComboBoxGadget(0,0,0,150,20)
		AddGadgetItem(0,-1,"A")
		AddGadgetItem(0,-1,"B")
		AddGadgetItem(0,-1,"C")
		
		SetGadgetState(0,0)
Repeat
			
	Select WaitWindowEvent(20)
		Case #PB_Event_CloseWindow
			End
		Case #PB_Event_Gadget
			If EventGadget()=0
				Debug GetGadgetText(0)
			EndIf 
			
	EndSelect 
	
ForEver 
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von jojo1541 »

Wie ermittelst du denn, ob bereits ein Eintrag ausgewählt wurde?
Code wäre ganz Praktisch. <)
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
mart
Beiträge: 7
Registriert: 29.06.2010 13:23

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von mart »

Hi, hier mal ein Stück Code! Um diesen Code zu testen müsst ihr allerdings eine COM-Schnittstelle am Rechner haben. Sonst wäre die ComboBox leer. Wenn ihr ohne etwas zu verändern auf "Verbinden" drückt, dann wird ein neues Panalgadget "Missionsdaten" erzeugt (also verbunden). Wenn ihr dann aber auf die ComboBox "COM" drückt und eine COM-Schnittstelle auswählt, dann wird diese blau hinterlegt. Drückt ihr dann wieder auf "Verbinden", dann wird dummerweise der Inhalt der ComboBox gelöscht und es kann keine Verbindung aufgebaut werden. Das liegt daran, dass ich den Button "Verbinden" und die ComboBox "COM" toggle und jedes mal ein Flag setze oder lösche. Der Debugger zeigt an, dass beim ersten Klick auf die ComboBox "COM" das connect_flag = 0 ist. Beim auswählen eines Eintrages in der ComboBox wird dieses nochmal ausgegeben. Bleibt der Eintrag blau hinterlegt und man drückt nun "Verbinden", dann ist die ComboBox "COM" immer noch aktiv und gibt generiert nochmal connect_flag = 0. Das ist der Fehler! Nerv!!!

Code: Alles auswählen

;Window
Enumeration
#ID_Window_Main
#ID_Window_CMD
#ID_Window_Info
EndEnumeration 

#Window_Width_Main = 200
#Window_Height_Main = 320
;Timer
#ID_Window_Timer = 0

;Menue
Enumeration  
  #ID_Menue
  #ID_MenueItem_Close 
EndEnumeration 

;Gadget
Enumeration  
  #ID_PanelGadget
  #ID_TextGadget_COM
  #ID_ComboBoxGadget_COM
  #ID_TextGadget_Baud
  #ID_ComboBoxGadget_Baud
  #ID_TextGadget_Data
  #ID_ComboBoxGadget_Data
  #ID_TextGadget_Parity
  #ID_ComboBoxGadget_Parity
  #ID_TextGadget_Stop
  #ID_ComboBoxGadget_Stop 
  #ID_TextGadget_Handshake
  #ID_ComboBoxGadget_Handshake   
  #ID_ButtonGadget_Connect
EndEnumeration 

;COM Port Settings
#ID_COM = 0 
#Baud = 115200
#Data = 8
#Stop = 1
#BufferInput = 1024
#BufferOutput = 1024

If OpenWindow(#ID_Window_Main,0,0,#Window_Width_Main,#Window_Height_Main,"Projekt",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  PanelGadget(#ID_PanelGadget,0,0,#Window_Width_Main, #Window_Height_Main)
    AddGadgetItem (#ID_PanelGadget,-1,"Kommunikation")  
    TextGadget(#ID_TextGadget_Baud,19,62,50,20,"Baudrate:") 
    ComboBoxGadget(#ID_ComboBoxGadget_Baud,85,60,80,20)
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"1200")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"2400")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"4800")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"9600")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"19200")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"38400")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"57600")
    AddGadgetItem(#ID_ComboBoxGadget_Baud,-1,"115200")
    SetGadgetState(#ID_ComboBoxGadget_Baud,7)
    TextGadget(#ID_TextGadget_Data,19,90,50,20,"Datenbits:") 
    ComboBoxGadget(#ID_ComboBoxGadget_Data,85,89,80,20)
    AddGadgetItem(#ID_ComboBoxGadget_Data,-1,"5")
    AddGadgetItem(#ID_ComboBoxGadget_Data,-1,"6") 
    AddGadgetItem(#ID_ComboBoxGadget_Data,-1,"7")
    AddGadgetItem(#ID_ComboBoxGadget_Data,-1,"8") 
    SetGadgetState(#ID_ComboBoxGadget_Data,3)
    TextGadget(#ID_TextGadget_Parity,19,118,50,20,"Parität:") 
    ComboBoxGadget(#ID_ComboBoxGadget_Parity,85,116,80,20)
    AddGadgetItem(#ID_ComboBoxGadget_Parity,-1,"keine")
    AddGadgetItem(#ID_ComboBoxGadget_Parity,-1,"gerade")
    AddGadgetItem(#ID_ComboBoxGadget_Parity,-1,"ungerade")
    SetGadgetState(#ID_ComboBoxGadget_Parity,0)
    TextGadget(#ID_TextGadget_Stop,19,145,50,20,"Stoppbits:") 
    ComboBoxGadget(#ID_ComboBoxGadget_Stop,85,143,80,20)
    AddGadgetItem(#ID_ComboBoxGadget_Stop,-1,"1")
    AddGadgetItem(#ID_ComboBoxGadget_Stop,-1,"1.5")
    AddGadgetItem(#ID_ComboBoxGadget_Stop,-1,"2")
    SetGadgetState(#ID_ComboBoxGadget_Stop,0)
    TextGadget(#ID_TextGadget_Handshake,19,172,60,20,"Handshake:") 
    ComboBoxGadget(#ID_ComboBoxGadget_Handshake,85,170,80,20)
    AddGadgetItem(#ID_ComboBoxGadget_Handshake,-1,"kein")
    AddGadgetItem(#ID_ComboBoxGadget_Handshake,-1,"RTS/CTS")
    AddGadgetItem(#ID_ComboBoxGadget_Handshake,-1,"Xon/Xoff")
    SetGadgetState(#ID_ComboBoxGadget_Handshake,0)
    TextGadget(#ID_TextGadget_COM,19,35,50,20,"COM:") 
    ComboBoxGadget(#ID_ComboBoxGadget_COM,85,33,80,20)
    For i=1 To 15
      If OpenSerialPort(#ID_COM,"COM"+Str(i),Val(GetGadgetText(#ID_ComboBoxGadget_Baud)),Parity,Val(GetGadgetText(#ID_ComboBoxGadget_Data)),Val(GetGadgetText(#ID_ComboBoxGadget_Stop)),Handshake,#BufferInput,#BufferOutput)
        AddGadgetItem(#ID_ComboBoxGadget_COM,-1,"COM"+Str(i))
        CloseSerialPort(#ID_COM)  
      EndIf  
    Next
    SetGadgetState(#ID_ComboBoxGadget_COM,0)
    ButtonGadget(#ID_ButtonGadget_Connect,85,210,80,20,"Verbinden")   
  Repeat     
    Select WaitWindowEvent()           
      Case #PB_Event_Gadget
        Select EventGadget() 
          Case #ID_ComboBoxGadget_COM  
            If Connect = 1
              Debug "Connect = 1"
              Result = MessageRequester("Info",GetGadgetText(#ID_ComboBoxGadget_COM)+" ist noch geöffnet! Soll die Verbindung getrennt werden?",#PB_MessageRequester_YesNo)
              If Result = #PB_MessageRequester_Yes
                CloseSerialPort(#ID_COM)
                SetGadgetText(#ID_ButtonGadget_Connect,"Verbinden")
                OpenGadgetList(#ID_PanelGadget)
                RemoveGadgetItem(#ID_PanelGadget,1)
                CloseGadgetList()
                Connect = 0
              EndIf  
            ElseIf Connect = 0 
              Debug "Connect = 0"
              If ComboBox_COM = 0
                ClearGadgetItems(#ID_ComboBoxGadget_COM)
                For i=1 To 15
                  If OpenSerialPort(#ID_COM,"COM"+Str(i),Val(GetGadgetText(#ID_ComboBoxGadget_Baud)),Parity,Val(GetGadgetText(#ID_ComboBoxGadget_Data)),Val(GetGadgetText(#ID_ComboBoxGadget_Stop)),Handshake,#BufferInput,#BufferOutput)
                    AddGadgetItem(#ID_ComboBoxGadget_COM,-1,"COM"+Str(i))
                    CloseSerialPort(#ID_COM)  
                  EndIf  
                Next  
                ComboBox_COM = 1
              ElseIf ComboBox_COM = 1
                ComboBox_COM = 0
              EndIf       
            EndIf  
          Case #ID_ButtonGadget_Connect
            If Connect = 0
              Select GetGadgetText(#ID_ComboBoxGadget_Parity)
                Case "keine"
                  Parity = #PB_SerialPort_NoParity
                Case "gerade"
                  Parity = #PB_SerialPort_EvenParity
                Case "ungerade"
                  Parity = #PB_SerialPort_OddParity                
              EndSelect 
              Select GetGadgetText(#ID_ComboBoxGadget_Handshake)
                Case "kein"
                  Handshake = #PB_SerialPort_NoHandshake
                Case "RTS/CTS"
                  Handshake = #PB_SerialPort_RtsCtsHandshake
                Case "Xon/Xoff"
                  Handshake = #PB_SerialPort_XonXoffHandshake                
              EndSelect 
              If GetGadgetText(#ID_ComboBoxGadget_COM) <> ""
                If OpenSerialPort(#ID_COM,GetGadgetText(#ID_ComboBoxGadget_COM),Val(GetGadgetText(#ID_ComboBoxGadget_Baud)),Parity,Val(GetGadgetText(#ID_ComboBoxGadget_Data)),Val(GetGadgetText(#ID_ComboBoxGadget_Stop)),Handshake,#BufferInput,#BufferOutput)
                  SetGadgetText(#ID_ButtonGadget_Connect,"Trennen")
                  Connect = 1
                  OpenGadgetList(#ID_PanelGadget)
                  AddGadgetItem (#ID_PanelGadget,-1,"Missionsdaten")
                  CloseGadgetList()
                Else 
                  MessageRequester("Info",GetGadgetText(#ID_ComboBoxGadget_COM)+" kann nicht geöffnet werden!")
                EndIf 
              Else
                MessageRequester("Info","Es wurde noch keine COM-Schnittstelle ausgewählt!")
              EndIf 
            ElseIf Connect = 1   
              CloseSerialPort(#ID_COM)
              SetGadgetText(#ID_ButtonGadget_Connect,"Verbinden")
              Connect = 0
              OpenGadgetList(#ID_PanelGadget)
              RemoveGadgetItem(#ID_PanelGadget,1)
              CloseGadgetList()
            EndIf    
          EndSelect  
      Case #PB_Event_CloseWindow
        End   
    EndSelect  
    
  ForEver       
        
EndIf 
End
Edit by NicTheQuick: Code-Tags gesetzt
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von Kiffi »

beim Drücken Deines 'Verbinden'-Buttons feuert die Combobox noch ein Event
(ich würde annehmen: LostFocus, oder so). Dadurch springst Du wieder in den
"Case #ID_ComboBoxGadget_COM"-Zweig und löscht den Combobox-Inhalt.

Meine Empfehlung: EventType() zusätzlich abfragen.

Code: Alles auswählen

Select WaitWindowEvent() 
  Case #PB_Event_Gadget
    Select EventGadget() 
      Case #ID_ComboBoxGadget_COM 
        If EventType()=#PB_EventType_LeftClick ; <-- z.B
          If Connect = 1
            Debug "Connect = 1"
            [...]
Grüße ... Kiffi

P.S.: Beim nächsten Mal bitte Code-Tags verwenden.
a²+b²=mc²
mart
Beiträge: 7
Registriert: 29.06.2010 13:23

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von mart »

Hi Kiffi,
an EventType() --> Left_Klick hatte ich auch schon gedacht, dass Problem ist nur, dass ComboBox_Gadgets keine EventType() unterstützen!

Die folgenden Gadgets unterstützen EventType():

- ExplorerListGadget()
- ExplorerTreeGadget()
- ImageGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- SpinGadget()
- StringGadget()
- WebGadget() - Das WebGadget hat ein spezielles Set von Ereignis-Typen.

Also so leicht gehts dann leider doch nicht :(

PS: Code-Tag werd ich mir merken ;)

Gruß Martin
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von Kiffi »

mart hat geschrieben:Also so leicht gehts dann leider doch nicht :(
nicht so schnell den Kopf hängen lassen:

Code: Alles auswählen

Case #ID_ComboBoxGadget_COM 
  Select EventType()
    Case #CBN_SELCHANGE
      Debug "Tadaa! :-)"
  EndSelect
Grüße ... Kiffi
a²+b²=mc²
mart
Beiträge: 7
Registriert: 29.06.2010 13:23

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von mart »

PurBasic sagt dazu:
Konstante nicht gefunden: #CBN_SELCHANGE

Was soll das den für ein EventType() sein? PB-EventType()-Konstanten sehen doch immer so aus ...#PB_EventType_<Event>!

Gruß Martin
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von Kiffi »

mart hat geschrieben:PurBasic sagt dazu:
Konstante nicht gefunden: #CBN_SELCHANGE

Code: Alles auswählen

#CBN_SELCHANGE = 1
welche PB-Version hast Du denn? In meiner 4.5 RC2 ist das vordefiniert.
mart hat geschrieben:Was soll das den für ein EventType() sein?
das steht für SELectionCHANGE
mart hat geschrieben:PB-EventType()-Konstanten sehen doch immer so aus ...#PB_EventType_<Event>!
nicht zwangsläufig, es gibt noch wesentlich mehr Event-Typen, die allerdings
noch nicht vom PB-Team in das PB_EventType_*-Schema übernommen wurden.

Grüße ... Kiffi
a²+b²=mc²
mart
Beiträge: 7
Registriert: 29.06.2010 13:23

Re: ComboBoxGadget mit dynamischem Inhalt

Beitrag von mart »

Ich hab die Demoversion von PB --> v4.50(Windows - x86) Revision: 1253
Vielleicht liegts ja daran?

Danke nochmal für deine schnelle Hilfe!

Gruß Martin
Antworten