Panel Tab Index über Name ermitteln

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Panel Tab Index über Name ermitteln

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

'GetGadgetItemText()' ändert sich aber pro Schleifendurchlauf und 'Tabname'
nicht. Deswegen muss 'UCase()' bei ersterem immer und bei letzterem nur
einmal verwendet werden.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Wer lesen kann ist klar im Vorteil! Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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
Gesperrt