| |
|
|
- Seite 1 - |
|
Jörg Sellmeyer | Nachtrag: mit eingebautem WaitInput 5 funktioniert es jetzt wie erwartet.
Ich muss schon wieder nerven...
Folgender Code macht im Interpretermodus genau das, was ich erwarte und was aus dem Code eigentlich ersichtlich sein sollte
In compilierter Form stirbt das komplette Programm aber nach dem Klick aufs Kreuz eines Dialoges.
Declare Dlg&[],x%,y%
WindowStyle %11110
UserMessages $10
Cls
WindowTitle "Hauptfenster " + Str$(%hwnd)
x% = %winleft + 100
y% = %wintop + 120
WhileLoop 0,3
Inc x% ,30
Inc y%, 40
Dlg&[&Loop] = Create("Dialog",%hwnd,"" + Str$(&Loop +1),x%,y%,400,300)
Settext Dlg&[&Loop],"Test " + Str$(&Loop + 1) + " | " + Str$(Dlg&[&Loop])
Create("Button",Dlg&[&Loop],"Test",50,50,100,30)
Wend
While 1
WaitInput
Case %key = 27:Break' "ESC"
If %umessage = $10
If GetFocus(%hwnd)
Break
ElseIf ClassOf(GetActiveWindow()) = "#32770"
WhileLoop 0,SizeOf(Dlg&[]) - 1
If GetActiveWindow() = Dlg&[&Loop]
Print GetText$(Dlg&[&Loop]) + " beendet"
Setfocus(%hwnd)
DestroyWindow(Dlg&[&Loop])
'nachdem ich das WaitInput eingebaut habe, klappt es
'ich erinnererte mich, dass das compilierte Programm die Messageschleife nur jedes x-te Mal abruft.
WaitInput 5
Break
EndIf
Wend
Continue
EndIf
ElseIf GetText$(%getfocus) = "Test"
Print "Button",ItemId(%getfocus),"gedrückt"
EndIf
Case %Umessage = $10:Print "Das hier sollte nie zu sehen sein!"
Wend
Print "Hauptprogramm beendet"
WaitInput
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 02.06.2018 ▲ |
|
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
Jörg Sellmeyer | Meine Version steht in der Signatur. Das Problem ist, dass ohne WaitInput nach %umessage = $10, das Programm beendet wird, auch wenn nur auf einem Dialogfenster das Schließen-Kreuz betätigt wird. Außerdem wird das Hauptfenster nicht richtig aktiviert, wenn ein Dialog aktiv ist, und man dann das Kreuz im Hauptfenster klickt.
Ich hab es jetzt so gelöst, dass ich die Abfrage umgestellt hab und gleichzeit beim Hauptfenster noch auf &mwnd chcke. Damit funktioniert es für mich zufriedenstellend.
Declare Dlg&[],x%,y%
WindowStyle %11110 | 512
UserMessages $10
Cls
WindowTitle "Hauptfenster " + Str$(%hwnd)
x% = %winleft + 100
y% = %wintop + 120
WhileLoop 0,3
Inc x% ,30
Inc y%, 40
Dlg&[&Loop] = Create("Dialog",%hwnd,"" + Str$(&Loop +1),x%,y%,400,300)
Settext Dlg&[&Loop],"Test " + Str$(&Loop + 1) + " | " + Str$(Dlg&[&Loop])
Create("Button",Dlg&[&Loop],"Test",50,50,100,30)
Wend
Print "%GetFocus,GetActiveWindow(),%message,&lparam,&wparam"
While 1
WaitInput
Case %key = 27:Break' "ESC"
If %umessage = $10
If ClassOf(GetActiveWindow()) = "#32770"
WhileLoop 0,SizeOf(Dlg&[]) - 1
If GetActiveWindow() = Dlg&[&Loop]
Print GetText$(Dlg&[&Loop]) + " beendet"
DestroyWindow(Dlg&[&Loop])
WaitInput 5
Break
EndIf
Wend
Continue
ElseIf GetFocus(%hwnd) Or (%mwnd = %hwnd)
Break
EndIf
ElseIf GetText$(%getfocus) = "Test"
Print "Button",ItemId(%getfocus),"gedrückt"
EndIf
Case %Umessage = $10:Print "Das hier sollte nie zu sehen sein!"
Wend
Print "Hauptprogramm beendet"
WaitInput
|
|
|
| |
|
|
|
|
H.Brill | Bei mir funktioniert es compiliert, ob nur mit WaitInput oder auch mit WaitInput 5. Hab es jetzt aber nur mit XProfan X4 probiert.
Mit welcher Version hast du probiert ?
PS: Eine Zeile verstehe ich nicht ganz :
Wo hast du denn die "#32770" her ?
Ist das eine feste Dialog-Ressource in der Runtime ? |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 03.06.2018 ▲ |
|
|
|
|
Jörg Sellmeyer | Meine Version steht in der Signatur. Das Problem ist, dass ohne WaitInput nach %umessage = $10, das Programm beendet wird, auch wenn nur auf einem Dialogfenster das Schließen-Kreuz betätigt wird. Außerdem wird das Hauptfenster nicht richtig aktiviert, wenn ein Dialog aktiv ist, und man dann das Kreuz im Hauptfenster klickt.
Ich hab es jetzt so gelöst, dass ich die Abfrage umgestellt hab und gleichzeit beim Hauptfenster noch auf &mwnd chcke. Damit funktioniert es für mich zufriedenstellend.
Declare Dlg&[],x%,y%
WindowStyle %11110 | 512
UserMessages $10
Cls
WindowTitle "Hauptfenster " + Str$(%hwnd)
x% = %winleft + 100
y% = %wintop + 120
WhileLoop 0,3
Inc x% ,30
Inc y%, 40
Dlg&[&Loop] = Create("Dialog",%hwnd,"" + Str$(&Loop +1),x%,y%,400,300)
Settext Dlg&[&Loop],"Test " + Str$(&Loop + 1) + " | " + Str$(Dlg&[&Loop])
Create("Button",Dlg&[&Loop],"Test",50,50,100,30)
Wend
Print "%GetFocus,GetActiveWindow(),%message,&lparam,&wparam"
While 1
WaitInput
Case %key = 27:Break' "ESC"
If %umessage = $10
If ClassOf(GetActiveWindow()) = "#32770"
WhileLoop 0,SizeOf(Dlg&[]) - 1
If GetActiveWindow() = Dlg&[&Loop]
Print GetText$(Dlg&[&Loop]) + " beendet"
DestroyWindow(Dlg&[&Loop])
WaitInput 5
Break
EndIf
Wend
Continue
ElseIf GetFocus(%hwnd) Or (%mwnd = %hwnd)
Break
EndIf
ElseIf GetText$(%getfocus) = "Test"
Print "Button",ItemId(%getfocus),"gedrückt"
EndIf
Case %Umessage = $10:Print "Das hier sollte nie zu sehen sein!"
Wend
Print "Hauptprogramm beendet"
WaitInput
|
|
|
| |
|
|
|
Michael W. | @H.Brill
Gefunden in [...]
The following table describes the system classes that are available only for use by the system. They are listed here for completeness sake.
Class | Description |
ComboLBox | The class for the list box contained in a combo box. |
DDEMLEvent | The class for Dynamic Data Exchange Management Library (DDEML) events. |
Message | The class for a message-only window. |
#32768 | The class for a menu. |
#32769 | The class for the desktop window. |
#32770 | The class for a dialog box. |
#32771 | The class for the task switch window. |
#32772 | The class for icon titles. |
|
|
|
| System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 08.06.2018 ▲ |
|
|
|
|
H.Brill | Danke für die Info. Ich dachte immer, es gäbe nur Klassennamen, die für sich selbst sprechen, etwa Button, Window usw. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 08.06.2018 ▲ |
|
|
|
|
Michael W. | Findest Du im gleichen Artikel.
Es ist allerdings ein Mischmasch, der da zurückgegeben wird. Getreu dem Motto: Warum soll ich da 2 Variablen nutzen, wenn ich alles in einer unterbringen kann. Der Anwender wird schon wissen, was er da gerade zugewiesen hat. |
|
|
| |
|
|
|
H.Brill | Hallo Jörg, Ich habe nochmals mehrere Male einiges ausprobiert. Dabei mußte ich öfter den Taskmanager benutzen, um mein Programm abzuschießen.
Wie es aussieht, scheint das an dem gerade aktiven Fenster zu liegen. Folgendes scheint so zu laufen, wie gewünscht :
Declare Dlg&[],x%,y%
UserMessages $10
Cls
WindowTitle "Hauptfenster Beenden mit ESC " + Str$(%hwnd)
x% = %winleft + 100
y% = %wintop + 120
WhileLoop 0,3
Inc x% ,30
Inc y%, 40
Dlg&[&Loop] = Create("Dialog",%hwnd,"" + Str$(&Loop +1),x%,y%,400,300)
Settext Dlg&[&Loop],"Test " + Str$(&Loop + 1) + " | " + Str$(Dlg&[&Loop])
Create("Button",Dlg&[&Loop],"Test",50,50,100,30)
EndWhile
While 1
WaitInput
Case %key = 27 : Break' "ESC"
If %UMessage = $10
WhileLoop 0,SizeOf(Dlg&[]) - 1
If &UWnd = Dlg&[&Loop]
DestroyWindow(Dlg&[&Loop])
Print "Dialoghandle : ", Dlg&[&LOOP], " ist beendet !"
EndIf
EndWhile
SetActiveWindow(%HWnd)
EndIf
If GetText$(%getfocus) = "Test"
Print "Button",ItemId(%getfocus),"gedrückt"
EndIf
Wend
Print "Hauptprogramm beendet !"
WaitInput 2000
DestroyWindow(%HWnd)
End
Würde das deinen Vorstellungen entsprechen ?
PS: Normalerweise mache ich für jeden Dialog eine Proc und behandle den Dialog in einer Schleife und einem Waitinput. Halt so, wie es Roland auch in der Hilfe schreibt. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 08.06.2018 ▲ |
|
|
|
|
Jörg Sellmeyer | Bei meinem Programm werden die Dialoge zur Laufzeit erstellt, ohne dass ich Einfluss auf Anzahl oder Titel nehmen will. Eine Proc pro Dialog kommt also nicht in Frage. Ich werde deinen Vorschlag mal testen, bin aber mit meiner Lösung auch zufrieden, da durch das nochmalige WaitInput die UserMessage zurückgesetzt wird und nicht mehr im Hauptprogramm ankommt. |
|
|
| |
|
|
|
Michael W. | UserMessages können mit -Nr auch zurückgesetzt und dann erneut gesetzt werden |
|
|
| |
|
|
|
Jörg Sellmeyer | Hab ich alles ausprobiert, ohne dass es zuverlässig funktioniert hat. Liegt eben dran, dass die Runtime die Messageschleife seltener pollt, als der Interpreter. |
|
|
| |
|
|
|
H.Brill | Ja, scheint wohl an XProfans Messagehandling zu liegen. Bei meinem Code oben kommt nach Schließen aller Dialoge die wm_close - Nachricht auch nicht mehr zum Hauptfenster.
Da müßte man probieren, ob man mit Abschalten der internen Messageverarbeitung mit Set("FastMode", 1) und GetMessage weiter kommt. Auch Dialoge sind nicht ideal, da sie normalerweise auf $10 nicht automatisch reagieren.
Da bietet XProfan ja noch mehr Möglichkeiten. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 09.06.2018 ▲ |
|
|
|
|
H.Brill | So scheint es sauber (auch als .exe) zu laufen :
Declare Dlg&[],x%,y%
UserMessages $10
Cls
WindowTitle "Hauptfenster Beenden mit ESC " + Str$(%hwnd)
x% = %winleft + 100
y% = %wintop + 120
WhileLoop 0,3
Inc x% ,30
Inc y%, 40
Dlg&[&Loop] = Create("Window",%hwnd,"" + Str$(&Loop +1),x%,y%,400,300)
Settext Dlg&[&Loop],"Test " + Str$(&Loop + 1) + " | " + Str$(Dlg&[&Loop])
Create("Button",Dlg&[&Loop],"Test",50,50,100,30)
EndWhile
While 1
WaitInput
Case %key = 27 : Break' "ESC"
If %UMessage = $10
WhileLoop 0,SizeOf(Dlg&[]) - 1
If &UWnd = Dlg&[&Loop]
DestroyWindow(Dlg&[&Loop])
Print "Dialoghandle : ", Dlg&[&LOOP], " ist beendet !"
Break
EndIf
EndWhile
Case &UWnd = %HWnd : Break
SetActiveWindow(%HWnd)
EndIf
If GetText$(%getfocus) = "Test"
Print "Button",ItemId(%getfocus),"gedrückt"
EndIf
Wend
Print "Hauptprogramm beendet !"
WaitInput 2000
DestroyWindow(%HWnd)
End
|
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 09.06.2018 ▲ |
|
|
|