Entwickler-Ecke
Dateizugriff - Programm automatisch nicht beendbar
Mige - Fr 12.01.07 16:37
Titel: Programm automatisch nicht beendbar
Hallo zusammen!
Arbeite eigentlich nur nebenbei mit Delphi, (Delphi 7) und habe grad ein kleines problem.
Und zwar ruft das programm hintereinander anwendungen auf, und wartet immer bis die vorherige abgeschlossen ist.
Funktioniert eigentlich alles.
Nur soll es jetzt auch mit Parameter gestartet werden.
Und zwar soll es dann den vorgang direkt automatisch starten, und sich dann am schluss auch automatisch wieder schliessen.
Starten tuts schon mal, und läuft auch.
Nur am schluss beendet es einfach nicht automatisch.
Manuell gehts dann.
Egal ob ich jetzt
-Close
-Form1.Close
-oder den close button aufrufe,
Das Programm ist am schluss immer noch offen...
Hier der code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69:
| procedure TForm1.FormCreate(Sender: TObject); begin if Paramstr(1) = 'autorun' then begin ParaStatus := 1; Form1.Button1.Click; end else ParaStatus := 0; end;
procedure TForm1.Button1Click(Sender: TObject);
VAR Dateiname: string; Directory: string; ShellErrorCode: INTEGER; exInfo: TShellExecuteInfo; Ph: DWORD; Aktiv: INTEGER;
begin
Label1.Caption := ('Vorgang läuft...'); ADOQueryMaster_Prog.First;
WHILE NOT ADOQueryMaster_Prog.Eof DO BEGIN Dateiname:= ADOQueryMaster_Prog['ExecuteFile']; Directory:= ADOQueryMaster_Prog['Directory']; Aktiv:= ADOQueryMaster_Prog['Aktiv'];
if Aktiv = 1 then begin FillChar(exInfo, SizeOf(exInfo), 0); with exInfo do begin cbSize := SizeOf(exInfo); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); ExInfo.lpVerb := 'open'; ExInfo.lpParameters := PChar(0); lpFile := PChar(Directory + Dateiname); nShow := SW_SHOWNORMAL; end; if ShellExecuteEx(@exInfo) then Ph := exInfo.HProcess else begin ShowMessage(SysErrorMessage(GetLastError)); end; while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do Application.ProcessMessages; CloseHandle(Ph); end; ADOQueryMaster_Prog.Next;
END; ADOQueryMaster_Prog.Active := FALSE; Label1.Caption := ('Vorgang abgeschlossen!');
if ParaStatus = 1 then begin form1.Close; end;
end; |
(sorry, formatierung hats nicht grad so gut übernommen...)
Also blau markiert, der teil wo das programm geschlossen werden müsste...
Orange markiert, der teil der programms der sozusagen "geklaut" ist und den ich nicht 100% verstehe, hier könnte sich gut der grund verstecken weshalb sich nun mein problem ergibt...
Wäre wirklich für jede hilfe dankbar :D
gruss Mige
Moderiert von
raziel: Quote- durch Delphi-Tags ersetzt
Delete - Fr 12.01.07 21:54
Ersetze
if ParaStatus = 1 then
begin
form1.Close;
end;
durch
if ParaStatus = 1 then halt;
Bei mir funktioniert es in einem anderen Programm.
Soll das Programm eigentlich laufen ohne Autorun-Parameter ?
Wenn nicht, dann muss man natürlich das Programm vorher beenden,
sonst ist ja ParaStatus = (immer) 0 !
JayEff - Fr 12.01.07 23:13
Ja, genau! Arbeite mit Halt; ! Und wenn du (Zitat anderer User von vorhin) dein Auto bremsen musst, suchst du dir auch einen Baum zum drauffahren, oder?
Wenn du mit Halt; arbeiten musst, hast du was falsch gemacht.
Was die Formatierung betrifft: Kein problem, einfach
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAGa9d9189d044273024cf7e02bede6c05b}</span></span> drum statt Quote tags.
Mige hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69:
| procedure TForm1.FormCreate(Sender: TObject); begin if Paramstr(1) = 'autorun' then begin ParaStatus := 1; Form1.Button1.Click; end else ParaStatus := 0; end;
procedure TForm1.Button1Click(Sender: TObject);
VAR Dateiname: string; Directory: string; ShellErrorCode: INTEGER; exInfo: TShellExecuteInfo; Ph: DWORD; Aktiv: INTEGER;
begin
Label1.Caption := ('Vorgang läuft...'); ADOQueryMaster_Prog.First;
WHILE NOT ADOQueryMaster_Prog.Eof DO BEGIN Dateiname:= ADOQueryMaster_Prog['ExecuteFile']; Directory:= ADOQueryMaster_Prog['Directory']; Aktiv:= ADOQueryMaster_Prog['Aktiv'];
if Aktiv = 1 then begin FillChar(exInfo, SizeOf(exInfo), 0); with exInfo do begin cbSize := SizeOf(exInfo); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); ExInfo.lpVerb := 'open'; ExInfo.lpParameters := PChar(0); lpFile := PChar(Directory + Dateiname); nShow := SW_SHOWNORMAL; end; if ShellExecuteEx(@exInfo) then Ph := exInfo.HProcess else begin ShowMessage(SysErrorMessage(GetLastError)); end; while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do Application.ProcessMessages; CloseHandle(Ph); end; ADOQueryMaster_Prog.Next;
END; ADOQueryMaster_Prog.Active := FALSE; Label1.Caption := ('Vorgang abgeschlossen!');
if ParaStatus = 1 then begin form1.Close; end;
end; | |
So siehts dann aus.
Was das Problem an sich betrifft: Ersetze mal Form1.Close; mit Showmessage('Test'); und überprüfe so, ob ParaStatus zu diesem Zeitpunkt überhaupt 1 ist. Ich würde vermuten, dass die if-Abfrage übersprungen wird, weil ParaStatus nicht 1 ist.
Wenn du das gemacht hast, sag uns, was das Ergebnis war.
Ach ja: zwischen Form1.Close; und Close; gibts nur dann einen Unterschied, wenn du Close; aus einer anderen Form aufrufst (in einer anderen Unit als der Hauptunit) Ansonsten wird sowieso sozusagen ein Form1. davor gesetzt, genau wie wenn du mit einem Label arbeitest, du "Label1.Caption" mit "Form1.Label1.Caption" ersetzen könntest.
Nochmal was zur Formatierung: Argh! Das kann doch kein Mensch lesen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure fuu(ba:String); begin Anweisung; if Abfrage then DoSomething else begin DoSomething(else); FoooBaar; end; end; |
So formatiert man!
Manina - Sa 13.01.07 01:41
Ich denke, es ist ein Reihenfolgeproblem...
Du rufst im Create den ButtonClick auf, der dann (bei "autorun") am Schluß das Fenster schließen soll. Noch während des Create ? Geht das überhaupt ? :gruebel:
Ich mach solche Auto-Beendigungen lieber im OnActivate oder im OnShow des Hauptformulars, dort klappts... :wink:
JayEff - Sa 13.01.07 15:32
jaenicke hat folgendes geschrieben: |
Lasse das Fenster am besten gar nicht erst erzeugen, wenn es nicht gebraucht wird... :roll: |
Klar, beste Lösung, nur wenn er auf die Statusausgabe über das Label besteht, hat er keine andere Wahl, als die Form erzeugen zu lassen. Und wenn der User das programm mit diesem Parameter startet, nichts passiert, ausser dass der PC rechnet, und die ganze Prozedur mehrere Minuten in Anspruch nimmt, wundert sich der User natürlich erstmal, was da seinen PC auslastet. Man muss also abschätzen, wo es richtig ist, die Form nicht anzuzeigen, und wo man es besser doch macht.
jaenicke - Sa 13.01.07 15:42
Naja, aber man kann ja die Abfrage durchaus dennoch aus dem Formular heraus verlagern. Das Formular ist ja nur die Schnittstelle zum User. Die Berechnung ist davon ja unabhängig. Und deshalb kann ja von der Projektdatei aus das Fortschrittsanzeige-Formular angezeigt, die Berechnung angestoßen und dann danach ggf. das Hauptfenster angezeigt werden oder eben das Programm wieder beendet werden.
Mige - Mo 15.01.07 12:17
hathor hat folgendes geschrieben: |
Ersetze
if ParaStatus = 1 then
begin
form1.Close;
end;
durch
if ParaStatus = 1 then halt;
Bei mir funktioniert es in einem anderen Programm.
Soll das Programm eigentlich laufen ohne Autorun-Parameter ?
Wenn nicht, dann muss man natürlich das Programm vorher beenden,
sonst ist ja ParaStatus = (immer) 0 ! |
Problem gelöst, so einfach kanns sein.
Vielen dank! :zustimm:
edit:
@
jaenicke hat folgendes geschrieben: |
Lasse das Fenster am besten gar nicht erst erzeugen, wenn es nicht gebraucht wird... :roll: |
Und die darauf folgenden posts:
Wenn ich das gern so haben möchte und es nicht hinkriegen würde, würde ich schon fragen... :wink:
JayEff - Mo 15.01.07 20:44
JayEff hat folgendes geschrieben: |
Ja, genau! Arbeite mit Halt; ! Und wenn du (Zitat anderer User von vorhin) dein Auto bremsen musst, suchst du dir auch einen Baum zum drauffahren, oder?
Wenn du mit Halt; arbeiten musst, hast du was falsch gemacht. |
*wiederhol*
jaenicke - Mo 15.01.07 21:05
Na gut, das musst du wissen, wenn du das System durch einen absichtlichen Programmabsturz instabil / langsam machen willst. Aber wenn du vorhast das Programm jemandem weiterzugeben, dann solltest du ihn fairerweise warnen, das das Programm nicht sauber programmiert ist! Nicht dass der sich dann wundert, was mit seinem System los ist.
Denn leider gibt es in letzter Zeit viele solcher Programme im Internet und ich such dann jedesmal ewig, warum mein System so besch*** läuft.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!