Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zusatzprogramm nur beim 1.Start des Hauptprogrammmes starten (https://www.delphipraxis.net/968-zusatzprogramm-nur-beim-1-start-des-hauptprogrammmes-starten.html)

m-werk 2. Okt 2002 16:07


Zusatzprogramm nur beim 1.Start des Hauptprogrammmes starten
 
Hallo Leute,

ich habe ein Hauptprogramm und ein Zusatzprogramm (Update). Beides sind EXE-Dateien. Das Zusatzprogramm macht ein Update auf eine Datenbank.

Nun möchte ich das Zusatzprogramm, sobald der User das Hauptprogramm zum 1. Mal (Nach der Neuinstallation) startet, dass zuerst das Zusatzprogramm gestartet wird.
Sobald der User im Zusatzprogramm auf OK klickt, soll erst das Hauptprogramm gestartet werden.

Sobald der User aber das 2. mal das Programm startet, dann soll aber das Zusatzprogramm NICHT mehr gestartet werden. Ich könnte mir einen Eintrag in der Registry vorstellen.

Wie kann ich das lösen

sakura 2. Okt 2002 16:12

:arrow: Nur einmal starten :!: Am besten ein erfolgreiches Update in der Registry oder in einer INI File sichern. Danach kann Program eins an der entsprechenden Stelle nachschauen, ob das Update noch ausgeführt werden muss. Oder, das Update Program wird nach dem erfolgreichen Update gelöscht. (Kann nicht mehr ausgeführt werden)

:arrow: Warten bis Update done :!: Schau mal im Forum nach "Anwendung ausführen" oder so, hatten wir vor ein paar Tagen erst eine Lösung für.

Christian Seehase 2. Okt 2002 16:19

Moin m-werk,

wenn ich das richtig verstanden habe macht das Zusatzprogramm nur ein Update auf die Datenbank.
Wäre es da nicht am einfachsten im Hauptprogramm zu prüfen, welche Version die DB hat, und dann, für den Fall, dass eine alte Version gefunden wird, das Zusatzprogramm zu starten?

Hansa 2. Okt 2002 19:57

Hallo Leute,

@Admin : hier habe ich vorher was gepostet, ist weg. Vielleicht auch diesen Beitrag verschieben bei FAQ oder so. Werde oft nach sowas gefragt.

Vielleicht ist das hier für den gewünschten Zweck zuviel, jedenfalls funktionierts. Es geht um sogenannte Semaphoren (Fremdwörterlexikon : Signalflagge (griech.)). Wie man am Quelltext sieht, ist es nicht von mir alleine, aber weiß nicht mehr wo's herkam. Das Prinzip ist eigentlich leicht zu verstehen. So wie ein Zug, der bei grün fahren darf und bei rot nicht, so kann ein Programm nur gestartet werden, wenn es nicht bereits aktiv ist. In dieser Variante (es gibt auch andere) kann also ein Programm, selbst wenn es minimiert wurde, nicht noch
einmal gestartet werden. Wird dies versucht, so wird das in der Taskleiste "geparkte" maximiert und ist noch genau so, wie es vor der Minimierung war (Eingabefelder usw.). Mehrfachstarts, die das System eventuell abstürzen lassen sind dann ausgeschlossen.

Folgende Unit muß in die USES Liste :

Code:
unit sema;

interface

uses
  Windows, Messages,SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

function BereitsAktiv: Boolean;

IMPLEMENTATION

function BereitsAktiv: Boolean;
var
  semName,
  appClass: PChar;
  hSem   : THandle;
  hWndMe : HWnd;
  appTitle: Array[0..MAX_PATH] of Char;
begin
  // Init
  Result := FALSE;
  GetMem(semName,15);
  GetMem(appClass,15);
  StrPCopy(semName,'sema');
  StrPCopy(appClass,'TApplication');
  StrPCopy(appTitle,ExtractFileName(Application.Title));

  // Create a Semaphore in memory. If this is the
  // first instance, then hSem's value should be 0.
  hSem := CreateSemaphore(nil,0,1,semName);

  // Check to see if the semaphore exists
  if (hSem <> 0) and (GetLastError() =
                      ERROR_ALREADY_EXISTS) then
    begin
      CloseHandle(hSem);

      // Get the current window's handle then change
      // its title so we can look for the other instance
      hWndMe := FindWindow(appClass,appTitle);
      SetWindowText(hWndMe,'ZZZZZZZ');

      // Search for other instance of this window then bring
      // it to the top of the Z-order stack. We find it by
      // matching the Application Class and
      // Application Title.
      hWndMe := FindWindow(appClass,appTitle);
      if (hWndMe <> 0) then
        begin
          BringWindowToTop(hWndMe);
          ShowWindow(hWndMe,SW_SHOWNORMAL);
        end;

      Result := TRUE;
    end;

  // Destroy PChars
  FreeMem(semName,15);
  FreeMem(appClass,15);
end;

end.
Im DPR muß noch folgende Änderung rein :

Code:
{$R *.res}

begin
  if NOT BereitsAktiv then
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TDataModul, DataModul);
      Application.Run;
    end
  else
    Application.Terminate;
end.
Gruß
Hansa

m-werk 3. Okt 2002 07:03

Hi Leute, Danke erst einmal für die Antworten.

Ich habe mir da heute in der Früh folgendes überlegt.


Ich werde ganz einfach das Zusatzprogramm (EXE) Nach der Installation automatisch starten lassen. Das funktioniert auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.

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