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

Beitrag von Fluid Byte »

@DD:

Das mal ein echter Millimeter******! Bild

@FCKW & nic:

Ihr verpeilt es immer noch. Bild

Das Argument von FCKW war das er den Tab-Namen vorher in die Variable 'Tabname' zwischenspeichert um nicht ständig UCase() aufrufen zu müssen. Es dann aber trotzdem in der FOR/NEXT Schleife kontinuierlich mit GetGadgetItemText() verwendet. Entweder beide zwischenspeichern oder nicht, sonst ist es (wie ich bereits sagte) jack in die Hose.

Wenn man sich aber schon groß auf Optimierung beruft müssten GetGadgetItemText() und CountGadgetItems() ebenfalls ausgelagert werden:

Code: Alles auswählen

Procedure GetPanelTabIndexByName(Gadget,TabName.s)
	Protected i, Result = -1, ItemsNum, ItemName
	
	If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Panel	
	 	ItemsNum = CountGadgetItems(Gadget) - 1 
		TabName = UCase(TabName)
		ItemName = UCase(GetGadgetItemText(Gadget,i))
		
		For i = 0 To ItemsNum     	
			If ItemName = TabName : Result = i : Break : EndIf
		Next
	EndIf
	
	ProcedureReturn Result
EndProcedure
Gelle? Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hae, hast du getrunken ? :freak:

GetGadgetItemText(Gadget,i) ausserhalb der Schleife bringt ueberhaupt nichts.

Schade das der Code zu gross fuer die Signatur ist :allright:
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Es um den Funktionsaufruf du Depp! Bild
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

So Freundchen... Jetzt mach mal nen Punkt!

Ein Depp ist hier wohl keiner außer vielleicht derjenige
der solche Kraftausdrücke braucht um zu argumentieren!

Und der einzige ders echt nicht verstanden hat bist du.
Es soll ja nicht jedes Ucase auf Teufel komm raus eingespart
werden sondern nur der sich wiederholende Funktionsaufruf
von UCase für Tabname.
Ich gehe mal davon aus daß du ja sonst recht fähige Codes
hier im Forum postest, du genau weist was wir meinen, aber
leider nur sehr schwer zugeben kannst daß du auch mal
was in den Sources verpeilst.

Wenn ich gewußt hätte daß das dieser lumpige Source
hier im Thread solche Wellen schlägt dann hätte ich es
lieber gelassen und Friede wäre im Forum geblieben!

Gruß FGK

PS: Die "Optimierung" von Leonhard gefällt mir - da spart man
sich ne unnötige Variable auf dem Stack. :allright:
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 »

So wäre es im Grunde nochmal besser optimiert:

Code: Alles auswählen

Procedure.l GetPanelTabIndexByName(Gadget.l, TabName.s)
  Protected i.l
  
  If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Panel
    TabName = UCase(TabName)
    i = CountGadgetItems(Gadget)
    While i
      i - 1
      If UCase(GetGadgetItemText(Gadget, i)) = TabName
        ProcedureReturn i
      EndIf
    Wend
  EndIf
  
  ProcedureReturn -1
EndProcedure
Ich habe die langsame For-Schleife durch eine While-Schleife ersetzt und
lasse 'CountGadgetItems()' nur einmal aufrufen anstatt jeden Durchlauf.
Außerdem habe ich die Variablen den Typ Long gegeben, damit die
Procedure auch 100%ig funktioniert, selbst wenn jemand 'Define.b' in
seinem Code nutzt. Allerdings wird aus diesem Grund der Index von
hinten nach vorne durchlaufen, was aber kein Problem darstellen sollte,
solange es keine doppelten Namen gibt.

Ich hoffe jetzt hat niemand mehr was zum meckern.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Jetzt bleibt mal ruhig.
Wenn ich gewußt hätte daß das dieser lumpige Source
hier im Thread solche Wellen schlägt dann hätte ich es
lieber gelassen und Friede wäre im Forum geblieben!
Naja, bei einem lumpigen Source(Welchen man in diesem Fall wirklich nicht braucht..) muss man halt mit Verarschung rechnen. (Meine Meinung)
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 »

Exclusive Oder, den lumpigen Kommentar hätteste Dir auch sparen können.
Den braucht hier auch keiner.
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> lumpige Source
Das ist kein lumpiger Source, es ist einer dieser Codes, die zeigen "wie's geht".
Wir posten hier nicht nur für die "Coder-Elite" (für die ist dieser Code in der Tat nicht der Knaller), sondern auch für die Anfänger, die sowas sicherlich brauchen können.

> muss man halt mit Verarschung rechnen

Mein Code zur Auslistung aller Laufwerke ohne API ist auch nicht der Brüller, erntete aber in der Tat weniger Offtopic-Gesülz als hier. Niemand, der Codes postet sollte mit Verarschungen rechnen, eher sollte man die Posts der "Verarscher" löschen. Die Coder haben keine Verarschungen verdient.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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 »

Jeder Anfänger darf hier Code posten, den er für nützlich hält. Und wenn
jemand anderes den Code "wirklich nicht braucht", weil er ja so unnötig ist,
dann soll er ihn eben nicht benutzen und einfach mal die Fresse halten.

Meine Meinung.

Und solange der Threadstarter nichts einzuwenden hat, wird an dieser Stelle
jetzt auch mal geschlossen.
Gesperrt