Seite 8 von 13
Verfasst: 29.03.2009 23:28
von Falko
Eine kleine Lösung habe ich. Man kann das Programm ja per Batch starten und diesen Batch löschen. Ein kleines Problem besteht noch.
Wenn man es mit IDE startet, wird der Batch beendet, was auch so sein soll. Leider wird dieser aber nicht beendet, wenn man die IDE nicht vorher startet.
Vielleicht hat noch jemand eine Lösung um den Batch zu beenden, nachdem der Source ausgeführt wurde.
Diese als Exe compilieren und dann aus dem WinAPILibraryverzeichnis starten.
Code: Alles auswählen
EnableExplicit
Define EventID,start
Define Quit
Define dir.s
dir=Space(255)
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,120,20,"PureBasic Source",0)
GetCurrentDirectory_(255,dir)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
Select EventGadget()
Case 1
CreateFile(0,"Start.bat")
WriteStringN(0,"@echo off")
WriteStringN(0,Chr(34)+dir+"\Codes\Arbeitsspeicher\Freier Arbeitsspeicher ermitteln.pb"+Chr(34))
WriteStringN(0,"exit"); geht leider nicht,
WriteStringN(0,"echo on")
CloseFile(0)
RunProgram("start.bat","","",0)
Delay(500); Zeit lassen bevor gelöscht werden kann!!
DeleteFile("start.bat")
EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Verfasst: 29.03.2009 23:38
von Falko
Nachdem du das hier geschrieben hast, habe ich probiert, dem Runprogramm etwas Zeit zu geben. Denn im VirtuellPC wird alles viel,
viel langsamer ausgefürhrt. Darum geht es auch mit dem Source. Also das Delay(2000) scheint wohl das Problem zu beheben.
Bitte folgendes Programm compiliert im API-Verzeichnis testen. Bei mir geht es.
Code: Alles auswählen
EnableExplicit
Define EventID,start
Define Quit
Define dir.s
dir=Space(255)
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,120,20,"PureBasic Source",0)
GetCurrentDirectory_(255,dir)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
Select EventGadget()
Case 1
RunProgram(Chr(34)+dir+"\Codes\Arbeitsspeicher\Freier Arbeitsspeicher ermitteln.pb"+Chr(34),"","",0)
Delay(2000); Zeit lassen damit die IDE vollständig mit Source geladen wurde!!
EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Gruß und gute Nacht
Falko
Verfasst: 29.03.2009 23:54
von Little John
Falko hat geschrieben:Vielleicht hat noch jemand eine Lösung um den Batch zu beenden, nachdem der Source ausgeführt wurde.

Jo.

Den Befehl in der Batch-Datei mit
start beginnen.
Den Unterschied kann man gut sehen, wenn man einmal das testet:
und dann das:
Auf
echo on kann man verzichten, also würde der Code dann so aussehen:
Code: Alles auswählen
Case 1
CreateFile(0,"Start.bat")
WriteStringN(0,"@echo off")
WriteStringN(0,"start " + Chr(34)+dir+"\Codes\Arbeitsspeicher\Freier Arbeitsspeicher ermitteln.pb"+Chr(34))
CloseFile(0)
RunProgram("start.bat","","",0)
Delay(500) ; Zeit lassen bevor gelöscht werden kann!!
DeleteFile("start.bat")
Gruß, Little John
Verfasst: 30.03.2009 11:33
von RSBasic
@Falko & @Little John
Man kann doch auch direkt mit Hilfe des cmd.exe-Programms Befehle ausführen.
Also einfach so: cmd.exe /c start "" "...code.pb"
Dann erspare ich mir das Erstellen der Datei.
PS: Es funzt!
Update kommt gleich/später.
\\Edit: Oder auch nicht.
\\Edit:
Komisch, wenn ich normal RunProgram() die Konsole ausführe, dann funktioniert es ohne Probleme.
Aber wenn ich #PB_Program_Hide verwende, so dass die Konsole nicht sichtbar ist, dann stürzt mein Programm plötzlich wieder ab!
Was für ein Problem hat PureBasic denn?
@All
Kann einer von euch im engl. Forum einen Thread über diesen ekligen Bug posten? Danke!
\\Edit2:
Wenn ich mein Programm vorher minimiere ( SetWindowState(0,#PB_Window_Minimize) ), dann stürzt mein Programm nicht ab, aber wieso?
Ich versteh das irgendwie nicht...
Verfasst: 30.03.2009 12:55
von Falko
Probier mal diesen Source nachdem es compiliert wurde.
Mit Errorausgabe im Messagerequester, welcher keinen Fehler zeigt, funktioniert es anscheinend. Nur muss man diesen dann immer bestätigen.
Lässt man den Massagerequester weg, stürzt das Programm wieder ab.
Code: Alles auswählen
EnableExplicit
Define EventID,start
Define Quit
Define dir.s , Ergebnis.s
dir=Space(255)
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,120,20,"PureBasic Source",0)
GetCurrentDirectory_(255,dir)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
Select EventGadget()
Case 1
start=RunProgram(Chr(34)+dir+"\Codes\Arbeitsspeicher\Freier Arbeitsspeicher ermitteln.pb"+Chr(34),"","",#PB_Program_Open) ;Mit |#PB_Program_Error stürtzt es ab
Ergebnis=ReadProgramError(start)
MessageRequester("Ausgabe","Source geladen:"+Ergebnis);
CloseProgram(start)
EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Falko
Verfasst: 30.03.2009 13:04
von RSBasic
@Falko
OKay hab ich.
Hm...komische Sache, mit Msg geht es, aber ohne nicht....
Ich möchte mal gerne wissen, wieso das so ist...
Verfasst: 30.03.2009 20:57
von Falko
zur MSG habe ich im Netz noch einige Tips gefunden, die aber in PB leider nicht das machen, was sie sollten. Vielleicht hast du dazu noch selbst eine IDEE zur API.
Es sollte eigentlich die MSG gefunden und geschlossen werden.
Zwar gab es noch andere Messages, aber damit sürtzt das PB wiederum ab. Hiermit wird aber leider alles beendet

, sodass
nur noch der Source im Editor stehen bleibt.
Code: Alles auswählen
EnableExplicit
Define EventID,start,hMSB
Define Quit
Define dir.s , Ergebnis.s
dir=Space(255)
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,120,20,"PureBasic Source",0)
GetCurrentDirectory_(255,dir)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
Select EventGadget()
Case 1
start=RunProgram(Chr(34)+dir+"\Codes\Arbeitsspeicher\Freier Arbeitsspeicher ermitteln.pb"+Chr(34),"","",#PB_Program_Open) ;Mit |#PB_Program_Error stürtzt es ab
Ergebnis=ReadProgramError(start)
MessageBox_(1,"Source geladen","Ausgabe",#MB_OK)
hMSB =FindWindow_(1,"Ausgabe")
PostMessage_(hMSB,#WM_CLOSE,0,0); Leider wird damit das ganze aufrufende Programm beendet.
CloseProgram(start)
EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Verfasst: 30.03.2009 21:15
von ts-soft
Code: Alles auswählen
EnableExplicit
Define EventID
Define Quit
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(1,10,10,100,20,"PureBasic",0)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
Select EventGadget()
Case 1
WinExec_(#PB_Compiler_Home + "PureBasic.exe C:\...\Code.pb", #SW_SHOWNORMAL)
EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit=1
EndIf
Pfad anpassen und testen, bei mir funktioniert es
Verfasst: 30.03.2009 21:46
von RSBasic
@ts-soft
Danke schön Thomas, es funktioniert ohne Probleme, kein Absturz, nix.
Endlich ist das nervige Problem weg

Verfasst: 30.03.2009 21:53
von ts-soft
RSBasic hat geschrieben:@ts-soft
Danke schön Thomas, es funktioniert ohne Probleme, kein Absturz, nix.
Endlich ist das nervige Problem weg

Hatte wenig Zeit, ansonsten hat das finden eines Workarounds nur wenige
Minuten gebraucht
Aber als sich hier die Postings gemehrt haben, hab ich mir die Zeit mal genommen.
PS: Bauste noch das ScintillaGadget:
ScintillaGadgetPB mit ein, sieht dann schöner aus
Gruß
Thomas