Deutsch
Forum

%Key wird nicht zurück gesetzt?

 

Nico
Madysa
Mir ist bereits bei XProfan9 ein Fehler aufgefallen, den ich hier nun mal zeigen will.
Ausgangspunkt ist dieser Minimalcode.
KompilierenMarkierenSeparieren
declare but& , dlg& , e%
WindowStyle 26
Window 100 , 100 - 200 , 200
cls External("User32","GetSysColor",15)
but& = Create("Button",%hWnd,"Dialog",5,5,100,25)

whilenot %Key = 2

    waitinput

    if Clicked(but&)

        dlg& = Create("Dialog",%hWnd,"DER Dialog",5,5,100,300)
        clear e%

        whilenot e%

            waitinput

            if %Key = 2

                inc e%

            endif

        wend

        DestroyWindow(dlg&)

    endif

wend

end

Wenn man über den Button den Dialog öffnet und diesen anschließend über das [X] wird das Hauptfenster auch geschlossen. Und das obwohl
1.) Das Hauptfenster keinen Dialogfenster-Stil hat.
2.) %Key nach dem auslesen doch zurück gesetzt werden sollt.

Hat jemand ne Lösung?
 
Nico Madysa
26.06.2006  
 



Probier mal das dulcoiF .
KompilierenMarkierenSeparieren
 
26.06.2006  
 




Sebastian
König
Hallo,

in meinen Augen ist das eigentlich kein Fehler, denn die äußere Schleife ist ja als

Whilenot %Key = 2

definiert. Nach dem Klick auf das X im Dialog ist aber %key = 2 gegeben und die Schleife wird verlassen. Dies liegt daran, dass %key nicht beim Auslesen zurückgesetzt wird, sondern nur durch einen WaitInput/-Key/-Scan oder GetMessage-Befehl.

Eine einfache Lösung wäre, auch für die äußere Schleife eine ende%-Variable zu benutzen und diese z.B. mit case %key = 2: ende% = 1 nach dem WaitInput in der äußeren Schleife zu setzen.

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
26.06.2006  
 




Nico
Madysa
Mit der Hilfsvariablen habe ichs schon probeirt, klappt nicht, da %Key beim Auslesen eben nicht zurück gesetzt wird.
Aber wenn ich deine erste Aussage richtig verstanden habe, würde´
KompilierenMarkierenSeparieren
Whilenot %Key = 2

    If Clicked(But&)

        Dlg& = Create("Dialog",%Hwnd,"DER Dialog",5,5,100,300)
        Clear E%

        Whilenot E%

            Waitinput

            If %Key = 2

                Inc E%

            Endif

        Wend

        Destroywindow(Dlg&)

    Endif

    Waitinput

Wend

End

klappen, da das Waitinput der ersten Schleife am Ende ist und %Key daher vor dessen Abfrage noch neu eingestellt werden würde.
Danke für die Hilfe.

@iF: Ich versteh dieses Dulcoif nicht, was soll das denn bedeuten?
 
Nico Madysa
27.06.2006  
 




Michael
Wodrich
[quote:0a67fc8c6a]@iF: Ich versteh dieses Dulcoif nicht, was soll das denn bedeuten?[/quote:0a67fc8c6a]
Dafür sollte man die Suche bemühen und sich den ganzen Thread durchlesen.

Das DulcoIf sollte verabreicht werden um dem kränkelnden Message-Handling auf die Sprünge zu helfen...

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
27.06.2006  
 




Sebastian
König
[quote:e7e4a282c6]Aber wenn ich deine erste Aussage richtig verstanden habe, würde´ [...]
klappen, da das Waitinput der ersten Schleife am Ende ist und %Key daher vor dessen Abfrage noch neu eingestellt werden würde.[/quote:e7e4a282c6] Das ist nicht ganz, was ich meinte, aber es funktioniert tatsächlich . Das WaitInput _nach_ der inneren Schleife setzt %key zurück und nur dann wieder auf 2, wenn das X im Hauptfenster angeklickt wird.

So ganz schön finde ich das mit dem WaitInput am Ende der Schleife allerdings nicht... Wahrscheinlich geht es in den meisten Fällen gut, aber ich würde es an den Anfang setzen, damit man nicht womöglich in irgendeinem undefinierten Zustand startet und vielleicht Aktionen ohne Eingabe ausgeführt werden (könnte in einer komplizierteren Schleife ja durchaus sein, denke ich).

Hier mal die Variante mit 2 separaten Ende-Variablen, an die ich gedacht hatte:
KompilierenMarkierenSeparieren
Declare But& , Dlg& , E1%, E2%
Windowstyle 26+512
Window 100 , 100 - 200 , 200
Cls External("User32","GetSysColor",15)
But& = Create("Button",%Hwnd,"Dialog",5,5,100,25)

Whilenot E1%

    Waitinput
    case %key = 2 : E1% = 1 war fälschlicherweise erst E1% = 0

    If Clicked(But&)

        Dlg& = Create("Dialog",%Hwnd,"DER Dialog",5,5,100,300)
        Clear E2%

        Whilenot E2%

            Waitinput

            If %Key = 2

                Inc E2%

            Endif

        Wend

        Destroywindow(Dlg&)

    Endif

Wend

End

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
27.06.2006  
 




Nico
Madysa
Da ist, glaube ich, ein kleiner Fehler:
Was passiert, wenn ich das Hauptfenster(mit Dialog-Stil) schließen will, ohne die Dialog-Box aufzurufen? Da wird E1% ja auf 0 gesetzt, läuft also weiter. Wegen dem undefiniertem Zustand bei einem nachgestellten Waitinput:
Man könnte auch eine Repeat-Until-Schleife als Hauptschleife nehmen;
oder man macht vor der Hauptschleife NOCH ein Waitinput, dann müsste die Sache klappen.
 
Nico Madysa
28.06.2006  
 




Sebastian
König
[quote:7a4701bab3]Da ist, glaube ich, ein kleiner Fehler:
Was passiert, wenn ich das Hauptfenster(mit Dialog-Stil) schließen will, ohne die Dialog-Box aufzurufen? Da wird E1% ja auf 0 gesetzt, läuft also weiter. (...)[/quote:7a4701bab3]
Ups - sorry!! Ich hatte bei der äußeren Schleife falschrum gedacht, also an While E1% ...
Richtig wäre natürlich: Case %Key = 2 : E1% = 1 - ich ändere das in dem Code oben gleich mal

Jetzt müsste aber alles in Ordnung sein - habe es jedenfalls gerade erfolgreich getestet - auch mit Stil 512...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
28.06.2006  
 




Nico
Madysa
OK, danke für die Hilfe!
 
Nico Madysa
29.06.2006  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

902 Betrachtungen

Unbenanntvor 0 min.
Georg16.01.2021
H.Brill09.02.2019
ByteAttack01.11.2015
holmol9313.06.2013

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie