Ok.
Dann weiß ich ja bescheid. Aber vielleicht regst du Fred ja mal an, denn das ginge schon. Mein Englisch ist zu schlecht um ihn selbst anzusprechen. Sobald die Konstante #PB_Any übergeben wird kann pb-intern natürlich nicht der selbe Code verwendet werden wie bei den "Long-Objekten", aber man kann dann ja einen einfachen eigenen Code aufrufen.
Dieser kann grundlegend auf dem gleich folgenden basieren oder wenn ich den Code vervollständigt habe kann er den ja als Beispiel zum "umgehen" bzw. "erweitern" nutzen. War nur ne Idee.
So, ich werde das bald ins "Codetipps-Forum" stellen, vielleicht braucht es ja wer.
Ich habe mal 'ne eigene Funktion / Procedure erstellt mit der man sozusagen PB_any auch bei Buttons's usw nutzen kann.
Falls wer lust hat kann er es gerne mal testen oder verwenden.
Code: Alles auswählen
; Thorsten Friedrichs, Sdstr. 5 a, 38170 Schppenstedt
; T-O-S-H-Y@Freenet.de
; http://www.netzspione.de/purebasic/" (Seite aktuell noch nicht online)
; Code darf jeder wie er will nutzen und weitergeben. Aber bitte bei Weitergabe immer den Originalcode mitgeben oder
; zumindest einen Link auf diesen bzw. die Homepage oben wo er auch bald zu sehn sein wird. Ist kein mu, wre aber nett :-)
; Ein "Ersatz" fr #PB_Any bei Men- und ToolbarItems/-Buttons
; Es mu PB_AnyW() die Adresse einer WordVariablen bergeben werden. Das geht indem man dem
; Variablennamen ein "@" voranstellt. Die Procedure PB_AnyW() gibt dann erstens als Ergebnis die Itemnummer zurck
; und zweitens wird in die Variable auch die Itemnummer geschrieben. Dadurch kann man PB_AnyW() auch direkt in eine
; Funktion / Befehl einbauen und mu keine Extra Zeile einbauen. Beispeispiel:
; ToolBarStandardButton(PB_AnyW(@IDWord.w), #ButtonIcon [, Modus])
; hier wird einerseits an die Funktion die ntige ID bergeben und gleichzeitig in der Variablen gespeichert. Das mu sein,
; da "ToolBarStandartButtun()" natrlich nicht wie z.B. Gadgetfunktionen die ID zurckgeben.
; Wichtig:
; Natrlich werden die ID`s bei lschen des bergeordneten Mens bzw. Toolbar nicht automatisch gelscht und die Wert wrde
; ansteigen bis es keine freien IDs mehr gibt. Man mu also die Id'S freigeben falls man das Men bzw. die Toolbar lscht.
; Dies geschieht enfach mit FreePB_AnyW(IDWord) - Achtung "IDWord" ist die Variable OHNE "@", also nicht der Pointer.
; Hinweis:
; Die Proceduren sind recht sicher. falsche Werte lsen normal keine Probleme im System / Programm aus. Einzig ein falscher Pointer
; PB_AnyW(@IDWord.w) knnte einen Speicherfehler im Programm auslsen, wenn das "@" vergesen wird oder nur eine
; ByteVariable bergeben wird. Das Programm selbst arbeitet dann natrlich vielleicht mit falschen Werten.
; Die Proceduren sind Threadsicher und knnen ohne Probleme gleichzeitig in mehrenen Thread parallel laufen.
; Achtung wichtig:
; Im Gegensatz zur Konstante #PB_Any DARF man im Programm NICHT PB_AnyW() mit fester Nummerierung von ButtonIDs nutzen.
; Das liegt daran, das durch die Konstante #PB_Any intern unterschieden wird zwischen fest vergebenen ID's und den dynamisch
; erstellten (am Rckgabewert ersichtbar). Da ich aber keine Mglichkeit habe diese fest vergebenen ID'S rauszubekommen bzw.
; auszulesen mu man sich fr eines entscheiden.
; Zukunft:
; Natrlich kann man #PB_Any DARF und PB_AnyW() in Zukunft wenn gewollt schon kombinieren, dazu mte ich dann noch Proceduren
; erstellen durch die man eine "fest vergebene ID" in die Liste sicher einfgen kann. Dies ist nicht so problematisch, bin
; aber noch nicht dazu gekommen und hatte momentan auch keine Lust. Wer es doch schnell braucht melde sich bitte einfach.
Global MutexLinkedListPB_AnyW.l
MutexLinkedListPB_AnyW = CreateMutex()
;FreeMutex(MutexLinkedListPB_AnyW) ; kann/sollte am Ende des Programms verwendet werden
Procedure.w PB_AnyW(*WordPointer)
LockMutex(MutexLinkedListPB_AnyW)
Ergebnis.w = -1 ;allgemeiner Fehler / Programmiercodefehler
Global Exist_PB_AnyW.b
If Exist_PB_AnyW = 0
Exist_PB_AnyW = 1
Global NewList main_PB_AnyW.w()
Global NewList free_PB_AnyW.w()
EndIf
If CountList(main_PB_AnyW()) >= 32767
Ergebnis = -2 ; keine ID's mehr frei (Word ohne Vorzeichen knnte mehr verarbeiten)
ElseIf CountList(free_PB_AnyW()) >= 1
AddElement(main_PB_AnyW())
SelectElement(free_PB_AnyW(), 0)
main_PB_AnyW() = free_PB_AnyW()
DeleteElement(free_PB_AnyW())
Ergebnis = main_PB_AnyW()
Else
AddElement(main_PB_AnyW())
main_PB_AnyW() = CountList(main_PB_AnyW())
Ergebnis = main_PB_AnyW()
EndIf
If *WordPointer > 0
PokeW(*WordPointer ,Ergebnis)
EndIf
UnlockMutex(MutexLinkedListPB_AnyW)
ProcedureReturn Ergebnis
EndProcedure
Procedure.b FreePB_AnyW(WordID.w)
LockMutex(MutexLinkedListPB_AnyW)
Ergebnis.b = -1 ;allgemeiner Fehler / Programmiercodefehler
If Exist_PB_AnyW = 0
Ergebnis = -2; noch keine Itemliste erstellt
ElseIf WordID > 32767 Or WordID <= 0
Ergebnis = -3; Item kann nicht vorhanden sein, Fehler sollte codestrukturtechnisch nicht vorkommen
Else
Counter.w = 0
ResetList(main_PB_AnyW())
FoundItem.w = -1
Ergebnis = -4 ; Item nicht gefunden
While Counter < CountList(main_PB_AnyW()) And FoundItem = -1
NextElement(main_PB_AnyW())
If WordID = main_PB_AnyW()
FoundItem = Counter
AddElement(free_PB_AnyW())
free_PB_AnyW() = WordID
DeleteElement(main_PB_AnyW())
Ergebnis = WordID
EndIf
Counter + 1
Wend
EndIf
UnlockMutex(MutexLinkedListPB_AnyW)
ProcedureReturn Ergebnis
EndProcedure
For i = 1 To 5
Debug "PB_AnyW()="+Str(PB_AnyW(@Word.w))
Debug "Word="+Str(Word)
Debug "Exist_PB_AnyW="+Str(Exist_PB_AnyW)
Next i
FreePB_AnyW(2)
FreePB_AnyW(442) ; Item existiert nicht, lst aber keinen Fehler aus. FehlerNr. wird aber zurckgeliefert.
FreePB_AnyW(-57) ; Item existiert nicht, lst aber keinen Fehler aus. FehlerNr. wird aber zurckgeliefert.
FreePB_AnyW(4)
For i = 1 To 5
Debug "PB_AnyW()="+Str(PB_AnyW(@Word.w))
Debug "Word="+Str(Word)
Debug "Exist_PB_AnyW="+Str(Exist_PB_AnyW)
Next i
Gruß
Toshy
1. Win10
PB6.1