Konversation mit dem Debbuger?! "...are you sure of that?"

Anfängerfragen zum Programmieren mit PureBasic.
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

Konversation mit dem Debbuger?! "...are you sure of that?"

Beitrag von Olaf.Renns »

Hallo liebe PB'ler,

ich wollte die Möglichkeit nutzen, ein vorhandenes und bereits erstelltes Gadget mit der gleichen Gadget-Nummer neu zu erstellen. Dabei ist mir bei der Verwendung von #PB_Any eine Debugger-Error-Meldung hochgekommen. Hat jemand vielleicht eine Idee, warum der Fehler Auftritt und wie man diesen umgehen kann? Die PB-Nummer gibt PB ja selber vor, also warum hat er dann damit ein Problem?

Anbei ein einfaches Beispiel, um das Problem zu verdeutlichen. Die Suche hat mir zu dem Thema nichts ausgespuckt.

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    a=StringGadget(#PB_Any,8,10,306,20,"Normal StringGadget...")
    StringGadget(a,8,10,306,20,"Normal StringGadget...")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Generell funktioniert ja auch das einfache Überschreiben vorhandener Gadgets:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(1,8,10,306,20,"Normal StringGadget...")
    StringGadget(1,8,10,306,20,"Normal StringGadget...")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Grüße Olaf
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Kaeru Gaman »

weil du keine ID die du per #PB_Any angefordert hattest, wiederverwenden darfst um ein neues Objekt zu erzeugen.

wiederverwenden darfst du nur Nummern, die du direkt angegeben hast.

Rückgabe-IDs von #PB_Any sind interne Handles, die musst du neu erzeugen lassen, also nochmal per #PB_Any.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von helpy »

Mit FreeGadget():

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    a=StringGadget(#PB_Any,8,10,306,20,"Normal StringGadget...")
    FreeGadget(a)
    a=StringGadget(#PB_Any,8,10,306,20,"Normal StringGadget...")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Olaf.Renns »

weil du keine ID die du per #PB_Any angefordert hattest, wiederverwenden darfst um ein neues Objekt zu erzeugen.

wiederverwenden darfst du nur Nummern, die du direkt angegeben hast.

Rückgabe-IDs von #PB_Any sind interne Handles, die musst du neu erzeugen lassen, also nochmal per #PB_Any.
Das hat in der Hinsicht aber nichts mit #PB_Any und deren Anforderung zu tun. PB kann nur keine indexierten Gadget-Nummern verarbeiten, die größer sind als 10000. Mich wundert es nur, das #PB_Any aber Gadget-Nummern erstellt, die genau dieser Regeln nicht entsprechen. Scheinbar sind #PB_Any und #Gadget zwei unterschiedliche Dinge (Handle und ID). Wieder was gelernt oder eher bisher unbewusst wahrgenommen :-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Kaeru Gaman »

weil eben, wie gesagt, #PB_Any keine Nummern erstellt sondern Handles.
die Nummern bis 10000 sind Indices auf eine Handle-Tabelle.
wenn das Handle direkt erstellt wird, braucht es keinen Platz in dieser Tabelle.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von ts-soft »

Nimm einfach den Tip von Helpy an.

Fixe IDs werden in einer Art LinkList gespeichert, dynamische IDs sind Objectpointer in dieser List. Damit sich diese nicht überlappen, gibts da eine begrenzung der id höhe, aber nicht nur deswegen.

Diese pointer können nicht einfach durch die pointerangabe überschrieben werden, die müssen freigegeben werden.

Gruß
Thomas
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
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von helpy »

Grundsätzlich mal ne Frage:

In welcher Situation will man denn ein Gadget neu erstellen und überschreiben? Ich kann mir jetzt keine Anwendung vorstellen, wo ich das so anwenden würde.

lg,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Kaeru Gaman »

stimmt irgendwie schon. bei dynamisch erzeugten Formularen würde man von Anfang an von einer dynamisch erzeugten Handle-Liste ausgehen.

... aber wenn man das nicht weiß, das mit den Handles und den Nummern, dann wird man sich natürlich zuerst eine Lösung mit Nummernkreisen ausdenken, bevor man merkt, dass das unnötig ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Olaf.Renns
Beiträge: 27
Registriert: 26.02.2009 10:11

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Olaf.Renns »

Da einfache Überschrieben ist ja ein nettes Feature von PB. Das man das vielleicht nicht so nutzen sollte, (genauso wie Goto, nicht verwenden der Free... Befehle usw.) ist ja eine bekannte Regeln. Hat mich nur gewundert im Moment des Aufkommens. Einen einfachen Workarround gibt es ja in jedem Fall:Sauberes Arbeiten :bounce:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Konversation mit dem Debbuger?! "...are you sure of that

Beitrag von Kaeru Gaman »

Zitatwürdig.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten