![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 04.12.2011
Ort: Pöcking
Beiträge: 126
|
Hallo,
wie kann ich das Fensterschlissen abfragen? Mit WindowStyle 10 <- ich würde gern vor beenden noch ein Parr Daten sichern!
__________________
Gerd Windows 7 Home Premium SP1 32Bit XProfanX2 12.0B-N Geändert von GT43A (10.01.2012 um 23:51 Uhr) |
|
|
|
|
|
|
#2 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 04.12.2011
Ort: Pöcking
Beiträge: 126
|
Ich hab zwar ein weg gefunden,
aber warum nicht mit %key? Code:
'-Begin-----------------------------------------------------------------
$H messages.ph
'-Hauptprogramm-------------------------------------------------------
'-Erzeuge Fenster mit----------------------------------------
WindowStyle 10
Window 40, 40 - 400, 400
Usermessages ~wm_close
While 1
waitinput
If %Umessage = ~wm_close
Print "Test"
Waitinput
BREAK
Endif
'Case %key=2:BREAK
Endwhile
'-End-------------------------------------------------------------------
End
__________________
Gerd Windows 7 Home Premium SP1 32Bit XProfanX2 12.0B-N Geändert von GT43A (11.01.2012 um 08:15 Uhr) |
|
|
|
|
|
#3 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 04.12.2011
Ort: Pöcking
Beiträge: 126
|
Na dann ist es kein Wunder wenn ich ein Dialog beende das
das Programm ohne zusätzliche Waitinput‘s in der Hauptprogrammschleife auch gleich den Geist aufgibt. Code:
'-Begin-----------------------------------------------------------------
'-Hauptprogramm-------------------------------------------------------
Proc Ein_Dialog
var Zeit_DLG& = @Create("Window",%Hwnd,"Test",500,40,200,200)
var Dialog_Schleife% = 0
WhileNot Dialog_Schleife%
waitinput
If %key=2
Print "Ich komme doch nur aus einem Dialog"
Dialog_Schleife% = 1
Endif
Endwhile
@DestroyWindow(Zeit_DLG&)
Endproc
'-Erzeuge Fenster mit----------------------------------------
WindowStyle $02B8
Window 40, 40 - 400, 400
While 1
waitinput
Ein_Dialog
Case %key=2:BREAK
Endwhile
'-End-------------------------------------------------------------------
End
__________________
Gerd Windows 7 Home Premium SP1 32Bit XProfanX2 12.0B-N Geändert von GT43A (11.01.2012 um 08:15 Uhr) |
|
|
|
|
|
#4 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 04.12.2011
Ort: Pöcking
Beiträge: 126
|
Oh das dürfte nicht sein
Code:
'-Begin-----------------------------------------------------------------
'-Hauptprogramm-------------------------------------------------------
Proc Ein_Dialog
var Zeit_DLG& = @Create("Window",%Hwnd,"Test",500,40,200,200)
var Dialog_Schleife% = 0
WhileNot Dialog_Schleife%
waitinput
If %key=2
Print "Ich komme doch nur aus einem Dialog"
Dialog_Schleife% = 1
Endif
Endwhile
@DestroyWindow(Zeit_DLG&)
Endproc
'-Erzeuge Fenster mit----------------------------------------
Window 40, 40 - 400, 400
var Programm_Schleife% = 0
WhileNot Programm_Schleife%
waitinput
If %key=2
Programm_Schleife% = 1
Endif
Ein_Dialog
Endwhile
Print "Ich will doch noch aufräumen"
'Das wird ja alles nicht mehr abgearbeitet!!!
DeleteObject hBild&,Bild1&
DeleteObject Dialog_Font&
Dispose DateTimePick#
Dispose Bereich#
'################## ProSpeed.dll
FreeFX(array1&)
FreeFX(array2&)
FreeFX(array3&)
FreeImage(logo&)
FreeImage(logo2&)
FreeImage(logoback&)
Dispose F_bereich#
'##################
'Dll aus dem Speicher loeschen(Wichtig!)
SKCtrl_DeInitDll()
'Dll freigeben...
FreeDll hdll&
FreeDll lvdll&
FreeDll neu&
DestroyWindow(%hwnd)
Waitinput
End
__________________
Gerd Windows 7 Home Premium SP1 32Bit XProfanX2 12.0B-N |
|
|
|
|
|
#5 (Direktlink) |
|
Stammuser
![]() Registriert seit: 21.04.2011
Ort: Hessen
Alter: 15
Beiträge: 327
|
&uWnd ist die Lösung für dein Problem. Damit kannst Du herausfinden, an welches Fenster die UserMessage gerichtet ist und entsprechend reagieren.
Code:
UserMessages 16
WhileNot (%uMessage = 16) And (&uWnd = %hWnd)
If (%uMessage = 16) And (&uWnd = DialogHandle&)
'Dialog schließen
EndIf
EndWhile
'Schnell noch was vor'm Beenden tun
End
Gruß Jonathan
__________________
ASUS K50IJ Notebook --- Pentium T4500 2x 2,4GHz --- 4GB RAM --- 64GB m4 SSD --- Win 7 Home Premium 32-Bit --- XProfan X2.0b Das Schönste am Programmieren ist immernoch die Fehlersuche Dieser Beitrag besteht zu 100% aus Recycling-Bytes.
Geändert von Jonathan (11.01.2012 um 17:46 Uhr) |
|
|
|
|
|
|
#6 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 04.12.2011
Ort: Pöcking
Beiträge: 126
|
Hallo Jonathan,
danke so geht's auch super! Aber wir haben doch unsere Kurse oder nicht? Und dort wird nicht drauf hingewiesen, wenn wir das Programm ordnungsgemäß beenden möchten müsst ihr die UserMessage und... hier Kurs 1 Code:
PROC Dialog1
Declare hD%, hB%, OK%
'Dialogfenster erzeugen
Let hD% = @Create("Dialog",%HWnd,"Dialogfenster",80,90,180,160)
'Einen Button mit OK erzeugen
Let hB% = @Create("Button",hD%,"&OK",120,100,40,25)
'Dialog-Schleife
Let OK% = 0
WhileNot Ok%
WaitInput
If @GetFocus(hB%) 'OK wurde angeklickt
Ok% = 1
EndIf
EndWhile
'Dialogfenster (incl. Button) entfernen
@DestroyWindow(hD%)
ENDPROC
'Haupt-Programm
'--------------
Window 20,20-400,300
PopUp "&Aktion"
AppendMenu 101,"&Dialog"
Separator
AppendMenu 199,"&Ende"
Let Ende% = 0
WhileNot Ende%
WaitInput
If @MenuItem(101)
Dialog1
ElseIf @MenuItem(199)
Ende% = 1
EndIf
EndWhile
End
Ok habe mal in der Hilfe nach UserMessage geschaut, und dort ist es auch gut erklärt warum. Zitat: Eine sinnvolle Anwendung ist z.B. die Message zum Schließen des Hauptfensters abzufangen, um etwa vor Beenden des Programmes noch etwas zu speicher oder Speicher frei zu geben. Code:
Declare Ende%
UserMessages $10
CLS
WhileNot Ende%
WaitInput
If %UMessage = $10
If @MessageBox("Programm beenden?", "Frage", 36) = 6
Ende% = 1
EndIf
EndIf
EndWhile
End
Der sucht sich dann dumm und dämlich und fragt sich „was mach ich falsch“
__________________
Gerd Windows 7 Home Premium SP1 32Bit XProfanX2 12.0B-N |
|
|
|
|
|
#7 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Ist sicher eine Anregung für Roland, darauf in der Hilfe näher einzugehen.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#8 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Statt in der Hilfe drauf hinzuweisen, lieber sowas:
Code:
WhileNot CloseWindow(%hWnd) ... ... EndWhile ermöglichen. Natürlich unabhängig vom Fensterstil, was ich sowieso blödsinnig finde.
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
#9 (Direktlink) |
|
Stammuser
![]() Registriert seit: 04.04.2009
Ort: Lübeck
Beiträge: 264
|
Diese simplen Konstruktionen werden ja meist nur bei den minimal Beispielen, wenn kein Aufräumen erforderlich ist, eingesetzt, und sind so in der Hilfe oder dem Lehrbuch nicht zufinden. %key=2 ist auch nur im Nebenfenster brauchbar und im Hauptfenster unnötig.
Code:
cls
var ed%=CreateEdit(%hwnd,"",10,10,100,20)
DIALOG
while 1
waitinput
'case %key=2:BREAK
wend
@WINEXEC("NOTEPAD.EXE",3)
end
proc DIALOG
var dlg%=CreateWindow(%hwnd,"",400,400,200,200)
while 1
waitinput
'case %key=2:BREAK
wend
DestroyWindow(dlg%)
setfocus(%hwnd)
Endproc
Code:
cls
var ed%=CreateEdit(%hwnd,"",10,10,100,20)
UserMessages 16
DIALOG
while 1
waitinput
case %UMessage=16:BREAK
wend
@WINEXEC("NOTEPAD.EXE",3)
end
proc DIALOG
var dlg%=CreateWindow(%hwnd,"",200,200,200,200)
while 1
waitinput
case %UMessage=16:BREAK
wend
DestroyWindow(dlg%)
setfocus(%hwnd)
Endproc
Gruß Thomas |
|
|
|
|
|
#10 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Ich möchte nicht in Abrede stellen, dass die Hilfe verbesserungswürdig ist, aber darauf hinweisen, dass zum Einen XProfan selbst sich beim END-Befehl ums Aufräumen kümmert und zum Anderen zumindest ab Windows XP Windows selbst beim Beenden des Programmes den Speicher wieder freigibt. Auf einige Ausnahmen bei Handles wird in der Hilfe bei der Funktion zum Erzeugen dieses Handles hingewiesen.
Nichts desto trotz wäre die Einführung einer CLOSEPROC, die beim Beenden aufgerufen wird, so sie denn existiert, sicher nachdenkenswert. Gruß Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
|
|
#11 (Direktlink) |
|
MoRoGeP-Träger 2011
![]() Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.878
|
So "bastle" ich für jedes meiner Tools eine eigene ENDPROCEDUR.
Bin dann sicher, dass alles säuberlich entfernt ist. Die hier ist für "2win4me" Code:
PROC PROGRAMM_ENDE CloseMessages(%hwnd) freedll lvdll& Dispose icons# Dispose itemtexts# Dispose nurso# Dispose bereich# Dispose maus_bereich# DELETEOBJECT font0% DELETEOBJECT font1% DELETEOBJECT font2% IF Right$(path1$,1)="\" I%=LEN(path1$) path1$=LEFT$(path1$,(I%-1)) ENDIF IF Right$(path2$,1)="\" I%=LEN(path2$) path2$=LEFT$(path2$,(I%-1)) ENDIF IF FILEEXISTS(log_datei$) WRITEINI log_datei$,"Start-Weg","FENSTER_LINKS",path1$ WRITEINI log_datei$,"Start-Weg","FENSTER_RECHTS",path2$ ENDIF IFNOT FILEEXISTS(log_datei$) WRITEINI log_datei$,"Start-Weg","FENSTER_LINKS","C:" WRITEINI log_datei$,"Start-Weg","FENSTER_RECHTS","C:" ENDIF DESTROYWINDOW(%HWnd) UserMessageS 0 END ENDPROC
__________________
Gruss, horst Computer werden kleiner und kleiner, bald verschwinden sie völlig. (Ephraim Kishon 1924-2005) http://www.web-treffpunkt.de |
|
|
|
|
|
#12 (Direktlink) | |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Zitat:
eine Funktion als Bedingung für das EventLoop, so das der Code dahinter ausgeführt wird, der auch nicht unbedingt das tatsächliche schließen des Fensters zur Folge haben sollte. Der Anwender drückt auf schließen, aber der Programmierer entscheidet Fast jedes Programm speichert am Ende noch Einstellungen, aktuelle Position des Fensters usw., ausserdem ist es bei Dialogfenstern oftmals besser, diese nur zu verstecken, anstatt zu schliessen, wenn der Aufbau eines Einstellungs- Dialoges etwas länger dauert.
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
|
#13 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Naja, bei Dialogfenstern geht das ja jetzt schon mit %key=2.
Gruß Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
|
#14 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Aber die Unterscheidung "DialogFenster" und anderes Fenster muss weg,
die Unterscheidung ist mir nicht schlüssig und Einsteigern schon gar nicht. Im Endeffekt sieht es so aus, das %Key = 2 nicht immer funktioniert, UserMessages nicht gerade Einsteigerfreundlich sind, somit muss was einfaches her, was auch jeder Einsteiger versteht, ohne Header einzubinden und API zu lesen Also eine einfache Abbruchbedingung, die immer funktioniert, wenn sie benutzt wird, die einfach das Eventloop unterbricht und beim Code dahinter fortsetzt. Es sollte auch das handle des Fensters, bzw. der Fenster berücksichtigt werden, da man Dialogfenster meist ja tatsächlich gleich schließt, im Unterschied zum Hauptfenster. Diese Abbruchbedingung so verpacken, das alter Code unverändert weiterhin funktioniert und gut ist, denke ich mir einfach mal so
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
#15 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Das wird nicht gehen, da diese beiden Fensterarten zum einen so von Windows vorgesehen sind und zum anderen auch sonst recht unterschiedlich agieren.
Der Dialogfensterstil ist immer dann zu verwenden, wenn auf dem Fenster Dialogelemente angebracht sind. Ein solches Fenster reagiert normalerweise nicht auf Klicks zwischen die Dialogelemente (etwa den Fensterhintergrund). Ohne Dialogfensterstil (normalerweise nur das Hauptfenster) wird auf Klicks in das Fenster reagiert und z.B. %MouseX und %MouseY gesetzt. Hier hat Windows ursprünglich keine Dialogelemente vorgesehen. Aber vielleicht fällt mir ja für X3 noch was ein. Aber bis dahin ist noch eine Weile ... Gruß Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| ListView DLL & WindowStyle 512 | Hovy | Dlls, Includes, Units & Prozeduren | 5 | 18.04.2010 11:37 |