drei Fenster?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: drei Fenster?

Beitrag von HeX0R »

kartmanne hat geschrieben:Ich habe in den Fenstern bis zu ca. 50 gadgets, auch Text-Gadgets, die verändert werden können und werden (wenn die COM Daten liefert). Insoweit ist mir eine Struktur, die die Aktionen der Fenster "clustert" übersichtlicher, als wenn ich die "eventtypen" clustere.
Dynamische Gadgets sind dann sinnvoll, wenn man vorher nicht weiss, wieviele Gadgets man am Ende eigentlich haben wird.
Zum Beispiel, wenn Du einen Visual Designer programmierst.
Dann hast Du ja vorher keine Ahnung, wieviele Gadgets der User erstellen möchte.

Aber manche stehen auch grundsätzlich auf dynamische Erzeugung, das ist nicht verwerflich, aber man muss etwas besser aufpassen und natürlich einen ganzen Sack Variablen mit sich rumschleifen (das ist der eigentliche Grund, warum ich persönlich das nur dann nutze, wo es Sinn macht).
kartmanne hat geschrieben:Aus Schleifen per break rausspringen... sowas mag ich nicht. Ich mag auch das basic-typische Goto nicht (benutze es nur, um bei der Fehlersuche zeitweise große code-Blöcke inaktiv zu setzten).
Ja bei break scheiden sich die Geister, der eine mag es, der andere nicht.
Goto ist da eher relativ großflächig verhasst ;)
Das schöne ist, dass jeder machen kann, was er will.
kartmanne hat geschrieben:Aber... ich hab immer noch nicht erkannt, warum mein code das Verhalten des Testfensters provoziert... :?
Ganz einfach, schau Dir das hier an:

Code: Alles auswählen

    Case Window_e_0 ;einstellungendialog
      Select event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case Button_e_0 ;ende
              ende_e=1
          EndSelect
        Case #PB_Event_CloseWindow
          ende_e=1
        EndSelect
     
      If ende_e =1                         ; einstellungen beenden
        CloseWindow(Window_e_0)
      EndIf
Wie wir vorhin festgestellt haben ist Window_e_0 = Window_t_0
Du hast Dein Fenster Window_t_0 eben durch den Klick auf den Button geöffnet.
Es werden verschiedene Events für dieses Fenster erzeugt.
Da nun Window_e_0 = Window_t_0 wird in obigen Code eingesprungen, was natürlich nicht beabsichtigt ist.
Dann hast Du leider die Überprüfung, ob das Fenster geschlossen wird, ausserhalb der Eventüberprüfung eingebaut.
D.h. egal welcher Event kommt (und ein neu erstelltes Fenster erstellt so einige Events, die dich eigentlich hier gar nicht interessieren) dieser Teil wird immer angesprungen:

Code: Alles auswählen

      If ende_e =1                         ; einstellungen beenden
        CloseWindow(Window_e_0)
      EndIf
Und da Deine ende_e Variable noch auf 1 steht (Du hast das Einstellungsfenster ja vorher geschlossen) wird das Fenster sofort wieder geschlossen.

Eine oft genutzte Methode ist übrigens, alle Fenster gleich zu erstellen und bei bedarf nur an und auszuknipsen (also HideWindow()).
Dann hast Du die meisten Probleme, die bei dynamisch erstellten Gadgets entstehen können elegant umschifft und ein User sieht keinen Unterschied.
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: drei Fenster?

Beitrag von kartmanne »

HI,

Sorry - ich habe deinen ersten Beitrag zwar gelesen, aber nicht wirklich verinnerlicht. :oops: Ich hab's nochmal gelesen und jetzt, glaub ich, auch kapiert. Ich hab's auch ansatzweise überprüft. Solange das "Einstellungen"-Fenster nicht geöffnet und geschlossen wurde, funktioniert auch das "Test"-Fenster einwandfrei. Klar, denn es kollidieren auch keine automatisch aus "frei verfügbaren" zugewiesene handles (window_e_0/window_t_0).

Danke Dir, für die Geduld :praise:
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: drei Fenster?

Beitrag von matbal »

kartmanne hat geschrieben: Aber... ich hab immer noch nicht erkannt, warum mein code das Verhalten des Testfensters provoziert... :?
Das falsche Verhalten entsteht ja nur, weil die beiden Fenster die gleiche ID bekommen können, wenn sie nicht gleichzeitig geöffnet sind. In diesem Fall wird dann in der Event-Verarbeitung der falsche Zweig abgearbeitet.

Wenn du beim Schließen das Fensters auch die dazugehörige ID-Variable des Fensters ungültig machst, gibt es das Problem im Test-Code nicht mehr.

Das sind die beiden Stellen:

Code: Alles auswählen

CloseWindow(Window_t_0)
Window_t_0 = 0
und

Code: Alles auswählen

CloseWindow(Window_e_0)
Window_e_0 = 0
Aber du kannst im Designer in den Properties auch das Häkchen vor #PbAny entfernen, dann werden Konstanten verwendet. Man kann die Voreinstellungen in der IDE auch ändern (Datei -> Einstellungen -> Form -> Neue Gadgets verwenden standardmäßig #PbAny deaktivieren).
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: drei Fenster?

Beitrag von kartmanne »

HI Matbal,

ja, das "löschen" der window-ID hab ich auch verstanden.

Ich hab jetzt drei Hinweise, die mir alle einleuchten - jetzt, wo ich's mit der handle-Vergabe kapiert hab.
- ID-Löschen beim schließen des Fensters (für meine Struktur...)
- statt #pb_any #Konstanten für die Fenster verwenden
- Fenster hidden (und invisible) anfangs öffnen und dann nur noch hidewindow #true/#false verwenden (weil meine Fester keinen dynamischen Aufbau haben.

Dank euch :allright:
Antworten