Konstanten sind nicht schneller als die Handles, die man mit '#PB_ANY' bekommt. Ich mach's an einem Beispiel klar.
Es ist ja bekannt, dass Konstanten den Wert 5000 nicht überschreiten sollten. Dann meckert der Compiler nämlich mit einem Error.
Das heißt wir können als Konstanten auch nur Werte unter 5000 nehmen. Es wird vermutlich auch selten vorkommen, dass man mehr als 5000 Konstanten für solche Objekte anlegt. Von daher völlig ok.
Aber was passiert nun, wenn wir beispielsweise ein Fenster mit der Konstante 0 als ID erstellen.
Intern wird natürlich eine entsprechende API aufgerufen und das OS erstellt das Fenster und gibt ein Handle dazu zurück. PB muss jetzt unsere ID 0 mit dem echten Handle verknüpfen. Wie macht es das? Ganz einfach mit einem Array. Sobald das Fenster erstellt wurde, erstellt PB also ein Array für Window-Handles der Größe 1 und speichert an Stelle 0 des Arrays das echte Handle für Fenster, das es vom OS bekommen hat.
Erstellen wir noch andere Fenster mir höheren konstanten IDs, wird dieses interne Array vergrößert um die zusätzlichen anfallenden Handles auch noch speichern zu können.
Wichtig wird das alles genau dann, wenn wir weitere Sachen mit dem Fenster machen wollen. Zum Beispiel, wenn wir es wieder schließen wollen. Dann schreiben wir einfach:
PB schaut jetzt zunächst, ob der Wert in den Klammern unter 5000 liegt. Wenn das der Fall ist, ist es wohl eine Konstante, also muss diese im Array nachgeschlagen werden um an das echte Handle zu kommen. Erst mit diesem können wir dem OS sagen, dass es das Fenster schließen soll. Mit der Zahl 0 alleine kann es nämlich nicht viel anfangen.
Anders ist es bei '#PB_ANY'. Der Wert, der von 'OpenWindow' zurückgegeben wird, wenn man es benutzt, ist meines Wissens¹ schon direkt das OS-Handle. Es wird also nicht erst extra ein Array angelegt oder erweitert, wenn man es nutzt. Da diese Handles unter Windows, Linux und Mac typischerweise immer größer als 5000 sind, kommt es da auch nicht zu Kollisionen und deswegen ist es auch wichtig sie in Variablen vom Typ Integer zu speichern oder gleich als Pointer. Wie man eben möchte.
Ansonsten kann man sich auch darüber streiten, wie viele Variablen man so mit schleppen will. Ich bin eher für '#PB_ANY', strukturiere aber alles etwas anders, weil ich objektorientierter denke. Meine Handles werden in Strukturen gespeichert und nur dem entsprechenden Interface zur Verfügung gestellt, dass mit den GUI-Objekten was zu tun hat. So brauche ich auch keine globalen Variablen dafür, nur passende Strukturen.
Grob gesagt, wirst du keinen Performance-Unterschied feststellen zwischen '#PB_ANY' und Konstanten. Der ist so marginal, wenn überhaupt vorhanden, dass du davon absehen kannst. Und was den Vorteil von Enumerations angeht und dass man sie so schön durchlaufen kann: Das geht auch mit Arrays und '#PB_ANY'.
