Seite 1 von 2

Panel Tab Index über Name ermitteln

Verfasst: 01.05.2008 20:02
von FGK
Hab das bei einem Projekt als ganz nützlich empfunden und
wollts teilen. (obwohls nix außergewöhnliches ist)

Folgende Procedure ermittelt über den Namen des
Tabs seinen Index sodaß man mit SetGadgetState dieses
gefundene Tab auswählen kann ohne seinen Index zu kennen.
Ist nützlich wenn Paneltabs programmgesteuert hinzugefügt oder
entfernt werden. Ähnlich der VB Property Item das nen Index
ebenso wie nen Key zur Auswahl akzeptiert.

Code: Alles auswählen

Procedure.l GetPanelTabIndexByName(Gadget.l,TabName.s)
  Protected I.l
  Protected result.l = -1
  If IsGadget(Gadget) And GadgetType(Gadget)=#PB_GadgetType_Panel
    TabName = UCase(TabName)
    For I = 0 To CountGadgetItems(Gadget)
     If UCase(GetGadgetItemText(Gadget,I))=TabName
      result = I
      Break
     EndIf
    Next 
  EndIf
  ProcedureReturn result
EndProcedure
Wers brauchen kann - viel Spaß damit

Gruß FGK

Verfasst: 01.05.2008 21:09
von Fluid Byte
Mag sein das ich ein wenig pedantisch bin aber Ordnung muss sein. Bild

Code: Alles auswählen

Procedure GetPanelTabIndexByName(Gadget,TabName.s)
	Protected i, Result = -1
	
	If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Panel
		For i = 0 To CountGadgetItems(Gadget) - 1
			If UCase(GetGadgetItemText(Gadget,i)) = UCase(TabName)
				Result = i : Break
			EndIf
		Next
	EndIf
	
	ProcedureReturn Result
EndProcedure

Verfasst: 02.05.2008 08:00
von FGK
@Fluid Byte
Mag sein das ich ein wenig pedantisch bin aber Ordnung muss sein.
Da wiederspreche ich dir mal nicht /:->

Aber du hast natürlich völlig recht das -1 in der Schleife ist
wichtig. Danke für den Hinweis. :allright:
Das ständige UCASE beim Vergleich des übergebenen
Tabnames gegenüber meiner einmaligen Anpassung laß ich jetzt einfach
mal so stehen.

Gruß FGK

Verfasst: 02.05.2008 12:34
von Fluid Byte
FGK hat geschrieben:Das ständige UCASE beim Vergleich des übergebenen
Tabnames gegenüber meiner einmaligen Anpassung laß ich jetzt einfach
mal so stehen.
Naja, du hattest das voher nur bei 'Tabnames' gemacht aber trotzdem bei GetGadgetItemText() benutzt. War also jack in die Hose. Entweder beides UCase() oder voher zwischenspeichern.

Verfasst: 03.05.2008 15:29
von NicTheQuick
'GetGadgetItemText()' ändert sich aber pro Schleifendurchlauf und 'Tabname'
nicht. Deswegen muss 'UCase()' bei ersterem immer und bei letzterem nur
einmal verwendet werden.

Verfasst: 03.05.2008 19:12
von Fluid Byte
Wer lesen kann ist klar im Vorteil! Bild

Verfasst: 03.05.2008 19:17
von DarkDragon
Fluid Byte hat geschrieben:Mag sein das ich ein wenig pedantisch bin aber Ordnung muss sein. Bild

Code: Alles auswählen

Procedure GetPanelTabIndexByName(Gadget,TabName.s)
	Protected i, Result = -1
	
	If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Panel
		For i = 0 To CountGadgetItems(Gadget) - 1
			If UCase(GetGadgetItemText(Gadget,i)) = UCase(TabName)
				Result = i : Break
			EndIf
		Next
	EndIf
	
	ProcedureReturn Result
EndProcedure
[Pedanterie]"Mag sein, dass ich ein wenig pedantisch bin aber Ordnung muss sein. "[/Pedanterie]
:mrgreen:

Verfasst: 03.05.2008 20:12
von FGK
@Fluid Byte

Ich hoffe daß das
Wer lesen kann ist klar im Vorteil!
sich auf das
Das ständige UCASE beim Vergleich des übergebenen
Tabnames gegenüber meiner einmaligen Anpassung laß ich jetzt einfach
mal so stehen.
bezieht! Ich habs einfach von dir so im Raum stehen lassen um nicht als rechthaberischer, nicht kritikfähiger
Korinthenka..er dargestellt zu werden. :mrgreen: Danke an Nick der dich auf diese Tatsache hingewiesen hat. :allright:

Gruß FGK

Verfasst: 03.05.2008 20:22
von ts-soft
Das mit dem UCase "sollte" der PBCompiler optimieren, aber ob dem so ist,
möchte ich mal nach meinen Erfahrungen, bezweifeln.

Code: Alles auswählen

If UCase(GetGadgetItemText(Gadget,i)) = UCase(TabName) 
Hinter Gadget, fehlt ein Space vorm i
Ist zwar nicht wichtig und erforderlich, aber es liest sich besser :mrgreen:
Ich finde es eben schöner, wenn hinter einem Komma ein Space folgt, dem
Compiler ist das aber egal :mrgreen:

Verfasst: 03.05.2008 23:58
von Leonhard
Dann machen wir es doch gleich mal, bevor wir auf etwas anderes vertrauen (Ach ja, ich hab die Result-Variable weg-gekürzt. Ob das Optimeirt ist, weiß ich nicht genau.):

Code: Alles auswählen

Procedure GetPanelTabIndexByName(Gadget,TabName.s)
   Protected i
   
   If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Panel
      TabName = UCase(TabName)
      For i = 0 To CountGadgetItems(Gadget) - 1
         If UCase(GetGadgetItemText(Gadget,i)) = TabName
            ProcedureReturn i
         EndIf
      Next
   EndIf
   
   ProcedureReturn -1
EndProcedure