Seite 2 von 2

Verfasst: 27.03.2006 13:26
von Sven
>>Vielleicht kann ja als Hinweis in der Hilfedatei eine Anmerkung eingefügt werden (bei Menüitem und Toolbarbuttons) das man hier #pb_any nicht nutzen kann.

Gilt übrigens auch für AddKeyboardShortcut().

Es wäre schön, wenn #PB_Any unterstützt wird. Zum Beispiel für einen MessageRequester, in dem Tasten (Return, Esc) nur auf die entsprechenden Buttons umgelenkt werden, muss man sonst dafür Konstanten verwenden, während die Buttons schon schön mit #PB_Any arbeiten... Oder die Erstellung von dynamischen PopUp-Menus... Ist also so sinnlos nicht, das auch für Menu-Ereignisse einzuführen. Vielleicht ab PB5.0 ;-)

Sven

Verfasst: 27.03.2006 14:08
von Sven
Ok, hab jetzt im englischen Forum was gefunden:

http://www.purebasic.fr/english/viewtopic.php?t=12113
http://www.purebasic.fr/english/viewtopic.php?t=18716

Es scheint nicht zu gehen, weil:
Fred: It won't be added for menu items, as #PB_Any is only for main objects (menu here), not for subobjects which can be numbered as you wish, as there is no memory constraint. It's just an id. Also on Windows there is a limitation which 16 bits id, which would not work with the #PB_Any concept.
Dann wäre eine kurze Bemerkung in der Hilfe schön...

Sven

Verfasst: 28.03.2006 00:13
von Andre
Sven hat geschrieben:
Fred: It won't be added for menu items, as #PB_Any is only for main objects (menu here), not for subobjects which can be numbered as you wish, as there is no memory constraint. It's just an id. Also on Windows there is a limitation which 16 bits id, which would not work with the #PB_Any concept.
Dann wäre eine kurze Bemerkung in der Hilfe schön...
Kümmere mich darum, falls es nicht schon Fred selbst erledigt hat.

Verfasst: 28.03.2006 18:20
von Toshy
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