Autor Beitrag
Mige
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 12.01.07 16:37 
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:

ausblenden volle Höhe 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;  {with}
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
    else
    begin
      ShowMessage(SysErrorMessage(GetLastError));
    end;  {else}
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
      Application.ProcessMessages;
      CloseHandle(Ph);
      end;

  ADOQueryMaster_Prog.Next;

  END{while}
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 user profile iconraziel: Quote- durch Delphi-Tags ersetzt
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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.

user profile iconMige hat folgendes geschrieben:
ausblenden volle Höhe 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;  {with}
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
    else
    begin
      ShowMessage(SysErrorMessage(GetLastError));
    end;  {else}
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
      Application.ProcessMessages;
      CloseHandle(Ph);
      end;
  ADOQueryMaster_Prog.Next;

  END{while}
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Win 7 Pro
RAD Studio 2010 Pro
BeitragVerfasst: 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:

_________________
Gates, oder Gates nicht ?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 13.01.07 10:09 
Oder noch besser (wie auch in einem anderen Thread gesagt):
Lasse das Fenster am besten gar nicht erst erzeugen, wenn es nicht gebraucht wird... :roll:
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 13.01.07 15:32 
user profile iconjaenicke 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 15.01.07 12:17 
user profile iconhathor 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:
@
user profile iconjaenicke 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 15.01.07 20:44 
user profile iconJayEff 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.