Seite 1 von 1

Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 16:28
von xivoo
Hallihallo,

ich evaluiere PureBasic gerade für ein Datenbankprojekt, an dem ich als Werkstudent bei In****on arbeite (und für mich selber :wink: ). Die ersten zwei Revisionen des Tools habe ich in Access zusammengehackt, jetzt will ich sozusagen an einer "Next Generation" Version arbeiten die Standalone und mit SQLite funktioniert. Mehr kann ich erstmal nicht dazu sagen (NDA).

Mein Problem ist nun: ich habe lange am Papier gesessen um ein möglichst intuitives UI zu konstruieren. Daran arbeite ich jetzt gerade mit der PB Demo. Das UI besteht praktisch nur aus Panels mit Unterpanels, etc. (in etwa wie eine mehrdimensionale Navigationsleiste einer Website). Funktioniert soweit ganz gut und war auch nicht schwer zu programmieren. Jetzt kommt aber der Knackpunkt: als kleine Hilfe soll der User auch im Fenstermenü z.B. auf Database und dann About klicken können und das Programm soll eben das gewünschte Panelelement aktivieren.
Das scheint aber nur mit den Hauptpanels zu funktionieren (also mit den Elementen, die per PanelGadget erstellt wurden). Wie kann ich denn die Reiter aktivieren, die mit AddGadgetItem erstellt worden sind?

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 16:40
von ts-soft

Code: Alles auswählen

SetGadgetState(#Panel, item)

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 16:47
von xivoo
ts-soft hat geschrieben:

Code: Alles auswählen

SetGadgetState(#Panel, item)
Danke, das habe ich schon versucht, aber Item muss eine Zahl sein (und SetGadgetItemState funktioniert nicht für Panel Schaltflächen). Die einzige Referenz die ich für die Schaltflächen habe ist aber der Bezeichner. Ein kurzer Codeausschnitt:

Code: Alles auswählen

;	Set up the panels that will contain all the information
  panelMain = PanelGadget (#PB_Any, 0, 0, 1024, 768)
  	;	Generate the "Welcome" panel
  	AddGadgetItem (panelMain, -1, "Welcome")
  	
  	;	Generate the "Account" panel
  	AddGadgetItem (panelMain, -1, "Account")
So, es wird das Panel panelMain erstellt, auf diesem dann die Schaltflächen "Welcome" und "Account". Standardmäßig wird ja "Welcome" angezeigt, jetzt will ich, dass der User du klicken eines Eintrags im Fenstermenü auf "Account" wechselt (hört sich hier lächerlich an, aber ich hab in dem Programm bis zu 3 Panellevels, also in etwa "Search" - "Chipdata" - "NAND" und will jetzt, dass der User - sollte er die "NAND" Schaltfläche nicht in den Panels finden - im Menü auf NANDSearch klicken kann und damit dann die NAND Schaltfläche öffnet).

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 16:56
von ts-soft
Ungetested, sollte aber gehen:

Code: Alles auswählen

Procedure FindGadgetItem(id, text.s)
  Protected count = CountGadgetItems(id)
  Protected i
  
  If count
    For i = 1 To count
      If LCase(GetGadgetItemText(id, i)) = LCase(text)
        ProcedureReturn i - 1
      EndIf
    Next
  EndIf
  
  ProcedureReturn -1 ; fehler
EndProcedure

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 17:07
von xivoo
Vielen Dank :allright:
Das hat zwar nicht 100% gestimmt, aber mit einer kleinen Anpassung (i zurückgeben statt i - 1) funktioniert es perfekt!

Code: Alles auswählen

Procedure FindGadgetItem(id, text.s)
  Protected count = CountGadgetItems(id)
  Protected i
  
  If count
    For i = 1 To count
      If LCase(GetGadgetItemText(id, i)) = LCase(text)
        ProcedureReturn i
      EndIf
    Next
  EndIf
  
  ProcedureReturn -1 ; fehler
EndProcedure
Da darf sich das PureBasic Team wohl bald über eine weitere verkaufte Lizenz freuen <)

Edit: ich hab dich als Autor der Funktion im Quellcode verewigt wenn's Recht ist :wink:

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 17:15
von ts-soft
xivoo hat geschrieben:Vielen Dank :allright:
Das hat zwar nicht 100% gestimmt...
Deine Korrektur ist aber auch falsch :wink:
Hab mir jetzt die Mühe gemacht und getested, hierfür wäre es immer nett, wenn Du ein
kleines Beispiel postest, das ausführbar ist und das Problem aufzeigt, hätte mir Arbeit gespart.
Hier der korrigierte Code:

Code: Alles auswählen

Procedure FindGadgetItem(id, text.s)
  Protected count = CountGadgetItems(id)
  Protected i
 
  If count
    For i = 0 To count - 1
      If LCase(GetGadgetItemText(id, i)) = LCase(text)
        ProcedureReturn i
      EndIf
    Next
  EndIf
 
  ProcedureReturn -1 ; fehler
EndProcedure 
Gruß
Thomas

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 17:21
von xivoo
Oh danke :praise:
Meine Korrektur hat bei mir funktioniert, aber ich habs natürlich auf die schnelle nicht mit allen Panels getestet. Das hätte mich später noch gewundert.

In Zukunft werde ich mich bemühen, kleine Codebeispiele zusammenzubasteln!

Edit: Ein kurzes Addendum habe ich noch, falls Jemand ein ähnliches Problem haben sollte. Mit der Funktion kann man sehr einfach Panels aktivieren, das geht dann so:

Code: Alles auswählen

SetGadgetState (Hauptpanel, FindGadgetItem(Hauptpanel,Schaltflächenname$))

Will man jetzt aber bei mehreren Subpanels sowas machen geht das nicht direkt, sondern so:

Code: Alles auswählen

SetGadgetState (Hauptpanel, FindGadgetItem(Hauptpanel,"Suche"))
            	SetGadgetState (Suchpanel, FindGadgetItem(Suchpanel,"DVD"))
            	SetGadgetState (DVDPanel, FindGadgetItem(DVDPanel,"Thriller"))
:D

Re: Panel Gadget - Schaltflächen aktivieren

Verfasst: 09.03.2010 17:54
von ts-soft
Alternativ könntest Du auch eine Map anlegen, mit den Itemtexten und dem Item als Wert.

Gruß
Thomas