Problem mit #Nummer statt ID ...

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Problem mit #Nummer statt ID ...

Beitrag 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 ??? :shock:

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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
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 »

Habs nicht ganz verstanden :freak:
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
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
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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? :o

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 ?!? :D )

Gruß, PureLust.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
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 »

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 :mrgreen:

bzw., in Callbacks kannste doch GadgetID(ID) verwenden!
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
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Identifier <> Handle ???

yup.

Identifier = "PB-eigene #Nummer"

normalerweise jedenfalls...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

@Kaeru, ...

hey, super - vielen Dank, das klappt !!! :allright:


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? :roll:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Ab 4.0 / Windows
Fenster GetProp_(handle,"PB_WINDOWID")
Gadgets GetProp_(handle,"PB_ID")
Gesperrt