Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mehrere Instanzen des Programms verhindern (https://www.delphipraxis.net/28020-mehrere-instanzen-des-programms-verhindern.html)

Shaman 18. Aug 2004 18:54


Mehrere Instanzen des Programms verhindern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen

Wenn man nicht will, dass die Anwendung mehrmals gestartet werden kann, ist das ziemlich mühsam zu implementieren. Hier eine Komponente von mir, die man nur auf die Hauptform zu platzieren hat, um sich nicht mehr um das Thema kümmern zu müssen. Sie verhindert den Start einer zweiten Instanz und übergibt Kommandozeilen-Parameter und Fokus der ersten.

Macht das Beste draus :thumb:

Gruss
Shaman

PS: Eigentlich behindert, dass man sowas nicht direkt in TApplication oder so integriert hat. Aber gediegen, so hat man was zu tun... :coder:

[edit=Chakotay1308]Eintrag in der Code-Library ist hier zu finden. Mfg, Chakotay1308[/edit]

juergen 8. Jan 2009 22:53

Re: Mehrere Instanzen des Programms verhindern
 
Hallo zusammen,

ich versuche diese Unit als Package zu installieren, über
-> Neu-> Package.
In der Projektverwaltung sehe ich dann das Package.
Ich speichere dieses unter einem neuen Namen und füge dann die Unit "OneInstance" hinzu.
Dann will ich kompilieren.
Ist das Überhaupt so richtig?
Ich bekomme dabei dann folgenden Fehler:
[DCC Fehler] E2161 Warning: Duplicate resource: Type 2 (BITMAP), ID TONEINSTANCE; File D:\_Programmierung\_installierte_Komponenten\Progr ammNurEinmalStarten\OneInstance.dcr resource kept; file D:\_Programmierung\_installierte_Komponenten\Progr ammNurEinmalStarten\OneInstance.dcr resource discarded.

Die Frage wäre:
Wie binde ich nun das als Komponente richtig ein?

Vielen Dank schon mal im Voraus!

mkinzler 8. Jan 2009 22:59

Re: Mehrere Instanzen des Programms verhindern
 
Entferne die dcr wieder aus dem Package. diese wird implizit eingebunden.
Zudem solltest du das Package installieren und nicht nur comillieren.

juergen 8. Jan 2009 23:15

Re: Mehrere Instanzen des Programms verhindern
 
Danke mkinzler!
Da wäre ich nicht drauf gekommen, mit dem entfernen der dcr.

Coole Komponente vom Daniel. :thumb:
Besonders auch, dass die Anwendung in den Vordergrund kommt/ bleibt.

Ps.:
Glückwunsch zum Moderator!

Paul0703 17. Jan 2009 18:59

Re: Mehrere Instanzen des Programms verhindern
 
Hallo!

Ich bekomme es irgendwie nicht hin, dass die Komponente die Parameter an die die erste Instanz übergibt :wall:
Also im OnCreate der Anwendung übergebe ich die Parameter folgendermaßen:
Delphi-Quellcode:
for I := 1 to ParamCount do ListBox1.Items.Insert(0, ParamStr(i));
Wenn ich mehrere Parameter hatte, wurde das Programm immer mehrmals geöffnet. Durch die Komponente wird es jetzt auch verhindert, wie es sein soll. Aber es wird nur ein Parameter übergeben!

Ich hoffe, mir kann jemand helfen :thumb:

MfG Paul

omata 17. Jan 2009 19:11

Re: Mehrere Instanzen des Programms verhindern
 
Wie sieht dein Programmaufruf aus?

Paul0703 17. Jan 2009 19:20

Re: Mehrere Instanzen des Programms verhindern
 
Was meinst du mit Programmaufruf? :oops:

omata 17. Jan 2009 19:24

Re: Mehrere Instanzen des Programms verhindern
 
Ich meine z.B. den Aufruf über die Konsole, wie sieht der aus?
Also, wie startest du deine Anwendung und wie sieht dort die Parameterliste aus?

Paul0703 17. Jan 2009 19:29

Re: Mehrere Instanzen des Programms verhindern
 
Naja ich klicke im Explorer auf eine bzw. mehrere Dateien und wähle dann über "Öffnen mit" mein Programm aus.
Meintest du das?

omata 17. Jan 2009 19:38

Re: Mehrere Instanzen des Programms verhindern
 
Ja, dann wird dein Programm für jede dieser markierten Dateien gestartet und es wird an jede Instanz deiner Anwendung eine Datei (Dateiname als Parameter) übergeben. Da du jetzt verhinderst, dass deine Anwendung mehrfach gestartet wird, wird eben nur die erste Instanz wirklich ausgeführt und somit auch nur die erste markierte Datei angezeigt.
Ob deine Parameterverarbeitung richtig arbeitet, kannst du innerhalb von Delphi testen, über Start->Parameter.

Markiere mal im Explorer Dateien und ziehe sie dann mit der Maus über deine Anwednung und laß dann die Maustaste los.

Paul0703 17. Jan 2009 19:48

Re: Mehrere Instanzen des Programms verhindern
 
Wenn ich Dateien über das Symbol von meinem Programm ziehe, läuft alles, wie es soll!
Dann werden alle Parameter übergeben.

jfheins 17. Jan 2009 20:21

Re: Mehrere Instanzen des Programms verhindern
 
Wie teilst du der laufenden Anwendung den Parameter mit, den die neue Instanz erhält?

Die Kompo verhindert, dass mehrere Instanzen gestartet werden - dass die erste Instanz die Parameter der 2. mitbekommt, dafür musst du selbst sorgen ;)

Paul0703 17. Jan 2009 20:25

Re: Mehrere Instanzen des Programms verhindern
 
achso! Ich habe mir das mal in der Demo angesehen, aber ich bekomme es nicht so richtig hin :angel2:
Kannst du mir zeigen, wie ich das machen kann?

Paul0703 19. Jan 2009 13:43

Re: Mehrere Instanzen des Programms verhindern
 
Kann mir vielleicht noch mal jemand erklären, wie man alle Parameter der ersten Instanz übergibt :?:

MfG

Klaus01 19. Jan 2009 14:10

Re: Mehrere Instanzen des Programms verhindern
 
Hallo,

hat die Komponete nicht das Ereignis/Event OnSwitch?
wird dort nicht als String der/die Parameter (durch '|' getrennt) übergeben?

Grüße
Klaus

Paul0703 19. Jan 2009 14:17

Re: Mehrere Instanzen des Programms verhindern
 
Die Komponente hat nur die Ereignisse OnAllow und OnGetParams.
Hab ich vielleicht eine alte Version?

Klaus01 19. Jan 2009 14:27

Re: Mehrere Instanzen des Programms verhindern
 
Zitat:

Zitat von Paul0703
Die Komponente hat nur die Ereignisse OnAllow und OnGetParams.
Hab ich vielleicht eine alte Version?

Das weiß ich nicht, ob Du eine alte Version hast.
Ich habe mir nur den Quelltext aus dem Eingangsbeitrag angeschaut und dort
steht im Header:

{>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
{> Komponente: TOneInstance >}
{> Beschr. : Verhindert mehrere Instanzen der Anwendung >}
{> Properties: Enabled: Überwachung aktiv >}
{> AutoBringToFront: Nach Wechsel erste Instanz in den Vordergrund bringen >}
{> OnExists: Wird in der zweiten Instanz ausgelöst, wenn die erste läuft >}
{> OnSwitch: Wird in der ersten Instanz ausgelöst, nachdem die zweite die >}
{> Kommandozeilen-Parameter übermittelt hat und beendet wurde >}
{> Version : 1.0, 18.08.2004 >}
{> Autor : Daniel Pauli >}
{> Kontakt : daniel.pauli@gmx.ch >}
{> Lizenz : Frei verfügbar für Delphi-PRAXiS-Mitglieder >}
{>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}

Grüße
Klaus

Paul0703 19. Jan 2009 15:01

Re: Mehrere Instanzen des Programms verhindern
 
Ok. Ich hatte eine andere Version der Komponente.
Jetzt habe ich die richtige, aber ich bekomme es irgendwie immernoch nicht hin. Ich fülle im OnSwitch der Komponente eine Listbox mit den Parametern, die ja als "Parameters" definiert sind, wie du schon sagtest.
Aber irgendwas haut da nicht hin :roll:
Wenn ich das Programm starte, sagt Vista, dass das programm nicht mehr richtig funktioniert!

Klaus01 19. Jan 2009 20:12

Re: Mehrere Instanzen des Programms verhindern
 
Hallo Paul,

Deine Fehlerbeschreibung ist nicht sehr präziese.
Was funktioniert nicht?

Ich habe kein Vista um es auf diesem OS zu testen,
aber unter XP funktioniert es so:

Komponente auf das Formular ziehen.
Ereignisse OnExists und OnSwitch zuordnen.


Delphi-Quellcode:
procedure TForm1.OneInstance1Switch(Parameters: TStrings);
begin
  Listbox1.Items.Assign(Parameters);
end;

procedure TForm1.OneInstance1Exists(var Switch: Boolean);
begin
  close;
end;
Grüße
Klaus

Paul0703 19. Jan 2009 20:29

Re: Mehrere Instanzen des Programms verhindern
 
Jetzt habe ich es so gemacht, wie du es beschrieben hast. Aber jetzt passiert folgendes:
Wenn ich eine Datei im Explorer mit rechts anklicke und dann auf einen selbst erstellt KontextMenü eintrag für mein Programm klicke, öffnet es sich jetzt wieder für jede Datei einmal und in der ListBox steht nichts :pale:
Ich kann es gleich mal auf XP testen, aber ich denke, das ändert nichts.

Klaus01 19. Jan 2009 20:49

Re: Mehrere Instanzen des Programms verhindern
 
Ich habe einen Link des Programms in das SendTo Verzeichnis erstellt.
Klicke ich nun auf eine Datei und wähle dann send an <meinProjekt> dann öffnet sich
das Projekt. Wähle ich eine weitere Datei aus, während die erste Instanz noch läuft,
und wähle wiederum send an <meinProjekt> dann sehe ich den Parameter
in der ersten Instanz des Programm in der Listbox.

Auch funktioniert es bei mir, wenn ich das Programm aus der cmd shell aus aufrufe.


Grüße
Kalus

Paul0703 19. Jan 2009 21:04

Re: Mehrere Instanzen des Programms verhindern
 
mhh. nagut. danke erstmal für die Hilfe!
Ich teste es morgen mal auf XP und dann werde ich hier nochmal posten :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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