Seite 1 von 2
Problem mit #Nummer statt ID ...
Verfasst: 24.04.2006 07:56
von PureLust
Hallo zusammen, ...
angeregt durch
diesen Threat von steini hier mal eine weitere Frage bezüglich der Umstellung auf #Nummern statt ID's.
Generell finde ich die (beinahe) durchgehende Benutzung von #Nummern (statt einer bisher scheinbar wahrlosen Mixtur aus #Nummern und IDs) in PB4 eine sinnvolle Änderung, da hierdurch etwas mehr 'Linie' in die PB-Programmierung kommt.
ABER: Da ja nun (fast) alles auf #Nummern-Basis Arbeitet - wie kann man dann nun Zugriff auf die Elemente (also Windows, Gadgets, Images, ...) bekommen, wenn man als Information nur eine ID (also ein OS-Handle) hat - welche man ja z.B. bei einem CallBack geliefert bekommt?
Hab ich da es evtl. eine Funktion übersehen, die mit bei Übergabe eines Handles die zugehörige #Nummer zurück gibt?
Oder muss ich in einem solchen Fall tatsächlich nun alle Elemente einzeln durchgehen und die ID's meiner Elemente mit der vom OS gelieferten ID vergleichen, um so letztendlich an die #Nummer zu kommen die ich ja in den weiteren Befehlen (die ja neuerdings nun auschließlich die #Nummer verwenden) benötige ???
Wenn also schon jemand für dieses Problem eine Lösung gefunden hat oder mir meinen Denkfehler erklären könnte, wäre das klasse.
Wenn dies jedoch kein Denkfehler meiner Seits ist, dann hätte PB4 aber wohl eine gravierende Designschwäche.
Greetz and ThanX,
PureLust.
Verfasst: 24.04.2006 08:07
von ts-soft
Habs nicht ganz verstanden
Aber zur allgemeine Erläuterung:
Code: Alles auswählen
#Win = 0
OpenWindow(#Win, #PB_Ignore, 0, 100, 100, "")
Gadget = #Win
GadgetID = GadgetID(#Win) = hWnd
Win = OpenWindow(#PB_Any, #PB_Ignore, 0, 100, 100, "")
Gadget = Win
GadgetID = GadgetID(Win) = hWnd
Verfasst: 24.04.2006 10:05
von PureLust
Hallo Thomas, ...
wann man eine #Nummer und wann eine ID (Hdl) erhält ist schon klar.
Auch das man aus einer #Nummer eine ID bekommen kann ist klar.
Aber wie mache ich aus einer ID wieder eine #Nummer?
Denn was ist, wenn ich (z.B. in einem Event-Callback) vom OS nur ein Hdl - also eine ID - geliefert bekomme?
Wie kann ich auf Grund dieser ID dann wiederum die dazugehörige #Nummer bekommen?
Muss ich dann dafür tatsächlich alle vorhandenen Nummern in IDs umwandeln und mit der erhaltenen ID vergleichen?
Vor PB4 wurde ja bei vielen Befehlen die ID - also das Hdl - verlangt, so das man mit den ID-Werten eines Callbacks direkt was anfangen konnte.
Nun verlangt PB allerdings die #Nummer - und nicht mehr die ID.
So muss man nun also irgendwie aus der ID - die man ja vom Callback bekommt - wieder die dazugehörige #Nummer 'berechnen', da man diese ja für weiterfolgende Befehle benötigt.
(Ich hoffe, diesmal war's etwas klarer ?!?

)
Gruß, PureLust.
Verfasst: 24.04.2006 10:12
von ts-soft
Ja, etwas klarer!
Sollte eigentlich mit folgender Procedure bei Fenstern und Gadgets funktionieren:
Code: Alles auswählen
Procedure GetGadgetCtrlID(GadgetHandle)
ProcedureReturn GetDlgCtrlID_(GadgetHandle)
EndProcedure
Für den Rest gibts auch Klimmzüge
bzw., in Callbacks kannste doch GadgetID(ID) verwenden!
Verfasst: 24.04.2006 12:34
von PureLust
Hmmm, scheint wohl doch noch nicht so ganz klar zu sein ...
Bzgl. : GadgetID(ID) ???
Also laut Doku benötigt GadgetID() die #NUMMER und nicht die ID !?!
Weiterhin liefert GadgetID(#Nummer) ja die ID zurück !?!
Ich suche jedoch sowas wie GadgetNR(ID), an das man dann also die ID übergibt und die #Nummer zurückgeliefert bekommt.
Und was GetDlgCtrlID_(Handle) angeht, so ist es (so wie ich die win32-Doku verstanden habe) ja im Grunde nichts anderes, als die OS-Variante von IsGadget(#Nummer), nur das eben widerum ein Handel statt einer #Nummer übergeben werden muss.
Oder was genau verbirgt sich hinter dem zurückgeliferten Identifier? (Identifier <> Handle ???

)
Aber wie gesagt - ich suche halt einen Weg, um aus einem Handle (bzw. einer ID) wieder die dazugehörige und PB-eigene #Nummer zu erhalten.
Verfasst: 24.04.2006 12:49
von Kaeru Gaman
> Identifier <> Handle ???
yup.
Identifier = "PB-eigene #Nummer"
normalerweise jedenfalls...
Verfasst: 24.04.2006 13:19
von PureLust
@Kaeru, ...
hey, super - vielen Dank, das klappt !!!
Wie man hier sehen kann:
Code: Alles auswählen
WinID = OpenWindow(5,1,1,200,100,"Test")
CreateGadgetList(WinID)
ButID1 = ButtonGadget(8040,3,3,80,80,"TestButton")
ButID2 = ButtonGadget(#PB_Any,90,3,80,80,"TestButton")
Debug WinID
Debug GetDlgCtrlID_(WinID)
Debug "----------"
Debug ButID1
Debug GetDlgCtrlID_(ButID1)
Debug "----------"
Debug GadgetID(ButID2)
Debug ButID2
Debug GetDlgCtrlID_(GadgetID(ButID2))
CloseWindow(5)
entspricht
GetDlgCtrlID_(ID) tatsächlich der im letzten Post angesprochenen Wunschfunktion ala
GetGadgetNr(ID).
Aber wie man auch sehen kann, funktioniert dies nicht bei Windows, geschweige denn Images und natürlich auch nicht bei Linux oder Mac.
Bin ich denn wirklich der einzige der sowas PB-native vermisst, oder bin ich nur der einzige der bisher so intensiv in PB4 arbeitet das ich schon in Situationen gekommen bin, wo man merkt das solche Funktionen wirklich fehlen?

Verfasst: 24.04.2006 13:28
von Kaeru Gaman
kommt halt drauf an, was man machen will...
die Nummer / PB-ID wird bei der erzeugung festgelegt,
entweder direkt oder durch den rückgabewert bei erzeugung mit #PB_Any.
dementsprechend kann man sie später verwenden.
ich kann mir so spontan keine situation vorstellen,
wo ich die ID nicht kennen kann...
Verfasst: 24.04.2006 13:55
von PureLust
Kaeru Gaman hat geschrieben:ich kann mir so spontan keine situation vorstellen,
wo ich die ID nicht kennen kann...
Das ist schon klar, dass man die PD-ID (in der Doku ja immer
#Nummer genannt, da laut Doku die
ID ja einem Hdl entspricht) eines Objektes im Grunde immer kennt, solange man diese am Anfang abgespeichert hat.
Mir geht es halt darum:
Wenn ich z.B. in einem Callback als Anhaltspunkt nur das Handle bekomme - wie kann ich dann Rückschlüsse auf die PB-eigene ID ziehen, ohne jede ID meiner erstellten PB-Objekte einzeln mit dem erhaltenen Handel zu vergleichen?
Verfasst: 24.04.2006 17:44
von edel
Ab 4.0 / Windows
Fenster GetProp_(handle,"PB_WINDOWID")
Gadgets GetProp_(handle,"PB_ID")