Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Neustart des eigenen Programms (https://www.delphipraxis.net/29064-neustart-des-eigenen-programms.html)

MCXSC 3. Sep 2004 13:05


Neustart des eigenen Programms
 
Gibt es in Delpi die Möglichkeit, auf Knopfruck einen Neustart des eigenen Programms zu machen?

Bowler 3. Sep 2004 13:08

Re: Neustart des eigenen Programms
 
Willst du eine 2. Instanz öffnen, oder das erste vorher beenden? Also:

1. Knopf drücken
2. Programm beenden
3. Programm starten

Oder:

1. Knopf drücken
2. Programm starten

alcaeus 3. Sep 2004 13:08

Re: Neustart des eigenen Programms
 
Hi MCXSC,

du könntest ein Programm starten, welches dein Programm nach einer Zeitspanne neu startet. Nachdem du dieses Zwischenprogramm gestartet hast, beendest du dein Programm und die Sache ist erledigt.

Greetz
alcaeus

MCXSC 3. Sep 2004 13:25

Re: Neustart des eigenen Programms
 
Ja, daran habe ich auch schon gedacht. Aber man kann das Programm nicht doppeltstarten... Und das ist mein Problem.

toms 3. Sep 2004 13:33

Re: Neustart des eigenen Programms
 
Probier mal das:

0. Zwischenprogramm als Ressource in dein Programm einbinden
1. Dein Programm extrahiert Zwischenprogramm
2. Dein Programm startet Zwischenprogramm
3. Dein Programm beenden
4. Zwischenprogramm startet dein Programm
5. Dein Programm beendet dein Zwischenprogramm
6. Dein Programm löscht Zwischenprogramm

Ist etwas umständlich aber sollte vom Prinzip her funktionieren.

Alexander 3. Sep 2004 13:44

Re: Neustart des eigenen Programms
 
Oder du schreibst dir eine Batch-Datei, die du dann beim Beenden aufrufst.

Dax 3. Sep 2004 13:58

Re: Neustart des eigenen Programms
 
Meinst du aus der IDE heraus?

Wenn ja gibt es einen Weg:

1) CTRL+F2
2) F9

Dadurch wird dein Programm aus dem Speicher entfernt und wieder gestartet.

maximov 3. Sep 2004 15:30

Re: Neustart des eigenen Programms
 
Is doch ganz einfach

1. Du startest das programm - instanz 2 - mit einem parameter und dem handle von instanz 1
2. Direkt beim start von instanz 2 machst du eine schleife, die so lange wartet bis inst 1 beendet
2. du beendest instanz 1
3. die schleife wird verlassen und instanz 2 läuft wie gewohnt!

Klingt doch gut und man braucht keine anderen programme oder batch dateien :-D

SleepyMaster 3. Sep 2004 17:04

Re: Neustart des eigenen Programms
 
Jo! Ich machs auch immer so:

Delphi-Quellcode:
program Project1;

uses
  Forms,
  windows,
  Sysutils,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  s:string;
  i:integer;

begin
  if Paramcount >= 2 then
    if Paramstr(1)='abc' then
      begin
      for i:=1 to Length(Paramstr(2))do
        if (Paramstr(2)[i]>='0') and (Paramstr(2)[i]<='9') then
          s:=s+Paramstr(2)[i];
      while IsWindow(strtoint(s))do
        sleep(1);
      end;
  //Mutex erst hier einfügen
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', pchar('"'+paramstr(0)+'"'), pchar('abc '+inttostr(Handle)), nil, SW_SHOW);
close;
end;

Luckie 3. Sep 2004 17:40

Re: Neustart des eigenen Programms
 
Wäre es nicht sinnvoller eine Prozedur zu schreiben, die alle einstellungen wieder zurücksetzt, als da so einen Krampf zu programmieren? :roll: Oder hat das ganze einen tiefern Sinn?

SleepyMaster 4. Sep 2004 12:02

Re: Neustart des eigenen Programms
 
Klar hat das ganze einen Tieferen Sinn.

Mann könnte es aber natürlich auchwesentlich einfacher machen. Hab halt in dem Beispiel nur noch überrüft, ob der zweite Parameter wirklich ne Zahl ist.

Hoffe das sagt dir mehr zu

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', pchar('"'+paramstr(0)+'"'), pchar('abc '+inttostr(Handle)), nil, SW_SHOW);
  close;
end;

initialization
  if Paramstr(1)='abc' then
    while IsWindow(strtoint(Paramstr(2)))do
      sleep(1);

SleepyMaster 4. Sep 2004 12:08

Re: Neustart des eigenen Programms
 
Oder noch einfacher:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', pchar('"'+paramstr(0)+'"'), pchar(inttostr(Handle)), nil, SW_SHOW);
  close;
end;

initialization
  while IsWindow(strtoint(Paramstr(2)))do
    sleep(1);

Dax 4. Sep 2004 12:10

Re: Neustart des eigenen Programms
 
Was aber, wenn der erste Parameter NICHT 'abc' ist?

SleepyMaster 4. Sep 2004 12:22

Re: Neustart des eigenen Programms
 
Dann wird es wahrscheinlich ein Parameter sein, den MCXSC selber auswerten will. 'abc' sagt dem Programm ja nur, dass es erst erscheinen soll, wenn das im 2 Parameter steckende Handle nicht mehr existiert.

Falls er sowieso nicht will, dass man dem Programm Parameter übergeben kann, kann er ruhig die Letzte Möglichkeit nehmen. Die guckt ja nur, ob das als Paramerter übergebene Handle noch gültig ist.

MCXSC 4. Sep 2004 15:06

Re: Neustart des eigenen Programms
 
Aaaalso.... Warum ich das ganze einbauen will, hat eigentlich zwei Gründe, wovon es sein kann, dass einer auch anders zu lösen geht, wordurch aber der zweite wieder greift:

1.) Ich habe in D6 den ThemeManager eingebaut und der User kann auswählen, ob er diesen benutzen will oder nicht. Wenn ja, so wird er beim Splashscreen zur Laufzeit erstellt. Wenn ich allerdings die Optionen (ThemeManager) ohne den Splashscreen aktiviere, hat es nie geklappt, dass dann das MainForm den XP-Style hat, sondern immer nur die anderen Forms.

2.) Wenn ich alle Optionen auf Knopfdruck umschreibe im Programm, wird es recht groß und mit einem neustart will ich die Größe etwas reduzieren.

MfG

Robert Marquardt 4. Sep 2004 16:02

Re: Neustart des eigenen Programms
 
Also der beste Platz ist am Ende des OnDestroy-Ereignisses der Hauptform.
Dort ein "ShellExecute(PChar(ParamStr(0)),...". Solltest du nur eine Instanz in deinem Programm zulassen,
so kannst du ja einen Kommandozeilenparameter mitgeben, damit die neu gestartete Instanz das Testen unterlaesst.

Im Programm setzt du dann ein Flag und beendest es. Im OnDestroy pruefst du das Flag ob eine neue Instanz gestartet werden soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz