Toon posts:

[Delphi] Programma 1 keer laden.

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een programmatje geschreven maar nu wil ik ervoor zorgen dat hij maar 1 keer geladen kan worden. Dus als het proggie loopt kan hij niet nog een keer worden geladen. Heeft hier iemand een voorbeeldje van? Ik kan het nergens vinden.

Bedankt

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Zeker, is simpel.
Ik kan je zo doorverwijzen naar www.google.com en www.torry.net maar ik zal zelf ook even een voorbeeld zoeken.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Het idee is ongeveer zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
HPrevInst := FindWindow('YourMainFormBName',Nil);
If HPrevInst = 0 then
Begin
   Start things here

end
else
Begin
   ShowMessage('Program is already running');
    Windows.SetFocus(HPrevInst);
    EOJ;
end;

Dit kan in je project source. Je moet wel even wat dingen aanpassen, zoals YourMainFormBName.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Ashbjorn
  • Registratie: Maart 2001
  • Laatst online: 07-04-2019

Ashbjorn

Who's your daddy! WHUZAAA

Example:

{The code for OneInstance.dpr}

program OneInstance;

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

{$R *.RES}

begin
{Attempt to create a named mutex}
CreateMutex(nil, false, 'MyApp');
{if it failed then there is another instance}
if GetLastError = ERROR_ALREADY_EXISTS then begin
{Send all windows our custom message - only our other}
{instance will recognise it, and restore itself}
SendMessage(HWND_BROADCAST,
RegisterWindowMessage('MyApp'),
0,
0);
{Lets quit}
Halt(0);
end;
Application.Initialize;
{Tell Delphi to un-hide it's hidden application window}
{This allows our instance to have a icon on the task bar}
Application.ShowMainForm := true;
ShowWindow(Application.Handle, SW_RESTORE);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


{The code for unit1.pas}

unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

var
OldWindowProc : Pointer; {Variable for the old windows proc}
MyMsg : DWord; {custom systemwide message}

function NewWindowProc(WindowHandle : hWnd;
TheMessage : LongInt;
ParamW : LongInt;
ParamL : LongInt) : LongInt stdcall;
begin
if TheMessage = MyMsg then begin
{Tell the application to restore, let it restore the form}
SendMessage(Application.handle, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(Application.Handle);
{We handled the message - we are done}
Result := 0;
exit;
end;
{Call the original winproc}
Result := CallWindowProc(OldWindowProc,
WindowHandle,
TheMessage,
ParamW,
ParamL);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
{Register a custom windows message}
MyMsg := RegisterWindowMessage('MyApp');
{Set form1's windows proc to ours and remember the old window proc}
OldWindowProc := Pointer(SetWindowLong(Form1.Handle,
GWL_WNDPROC,
LongInt(@NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
{Set form1's window proc back to it's original procedure}
SetWindowLong(Form1.Handle,
GWL_WNDPROC,
LongInt(OldWindowProc));
end;

begin
{Tell Delphi to hide it's hidden application window for now to avoid}
{a "flash" on the taskbar if we halt due to another instance}
ShowWindow(Application.Handle, SW_HIDE);
end.

Athlon 64 3500+ || MSI Neo2 Platinum || 1GB PC3200 Corsair XLPRO 2-2-2-5@1T || Hitachi SATA 250GB@7200 8MB || WD Raptor 73GB@10000 8MB || AOpen GF 6800 GT 256MB || SB Audigy2 Platinum || Logitech Laser G5 || 19" Iiyama HM903DT || 1280@100Hz


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Lekker stuk code. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Echt een supersnelle reactie allemaal zeg. Binnen 10 seconde gewoon. THX :)

Bedankt ik zal eens even gaan proberen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op maandag 12 november 2001 13:46 schreef Phalcon het volgende:
Echt een supersnelle reactie allemaal zeg. Binnen 10 seconde gewoon. THX :)
Komt omdat dit best wel simpel is, en makkelijk te vinden is op internet.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:59

Creepy

Tactical Espionage Splatterer

Op maandag 12 november 2001 13:48 schreef jelmervos het volgende:

[..]

Komt omdat dit best wel simpel is, en makkelijk te vinden is op internet.
Dat is dus een hint voor als je nog eens een keer wat gaat vragen >:)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Op maandag 12 november 2001 15:28 schreef Creepy het volgende:

[..]

Dat is dus een hint voor als je nog eens een keer wat gaat vragen >:)
Het is zeker makkelijk al je weet waar je op moet zoeken. Ik heb hier de search gebruikt en daar kon ik niks vinden. Ik heb deze code voor mijn proggie gebruikt. Dit is voor de mensen die het ook niet konden vinden. *D
code:
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
 // -== Check to see if the named mutex object existed before this call ==-
     MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
     if MutexHandle <> 0 then
      begin
        if GetLastError = ERROR_ALREADY_EXISTS then
           // -== set hPrevInst property and close the mutex handle ==-
        begin
           MessageBox(0, 'Instance of this application is already running.',
                     'Application already running', mb_IconHand);

         hPrevInst := TRUE;
           CloseHandle(MutexHandle);
           Halt; // 'Halt' Is the actual one that prevents a second instance
               // of your app from running.
        end
          else
          begin
                // -== indicate no previous instance was found ==-
             hPrevInst := FALSE;
          end;
       end
     else
       begin
            // -== indicate no previous instance was found ==-
            hPrevInst := FALSE;
       end;

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op maandag 12 november 2001 15:28 schreef Creepy het volgende:

[..]

Dat is dus een hint voor als je nog eens een keer wat gaat vragen >:)
Misschien, ik vindt het persoonlijk niet zo erg als er af en toe es een newbie vraag tussen zit hoor. Soms weet zelf een prof het niet meer zo goed hoe het moest, en die vindt dit soort vragen terug in de search.

Maarja, even zoeken met Google kan natuurlijk ook. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:59

Creepy

Tactical Espionage Splatterer

Newbie vraag is helemaal niet erg... daarom wijs ik em ook op de search :) En er is meer dan de GoT search alleen he.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Ik kan verder geen pascal maar volgens mij is die van Atlantez de enige die goed zal werken en waar ik dus voor zou kiezen :). Normaal als je een proggie voor de 2de keer start dan moet hij de eerste als top window (SetForegroundWindow) zetten en dus geen bericht geven dat er al een instance loopt.

Van die foute mannier zijn trouwns genoeg voorbeelden te vinden op internet alleen de versie van Atlantez kom je niet zo vaak tegen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Waarom is die manier van mij verkeerd volgens jou?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op dinsdag 13 november 2001 21:59 schreef mgfun het volgende:
Ik kan verder geen pascal maar volgens mij is die van Atlantez de enige die goed zal werken en waar ik dus voor zou kiezen :).
CreateMutex is wel de netste oplossing, maar ook nogal omslachtig...
Normaal als je een proggie voor de 2de keer start dan moet hij de eerste als top window (SetForegroundWindow) zetten en dus geen bericht geven dat er al een instance loopt.
In Delphi klopt dat niet helemaal. Je Application.MainForm is het eerste form dat via CreateForm is aangemaakt, maar "onder de kap" zit nog het "echte" (hidden) main form. En je kunt dus voordat je Application.MainForm wordt aangemaakt wel degelijk checken of er al een form met die naam of van dat type bestaat.

Verwijderd

Op dinsdag 13 november 2001 22:08 schreef jelmervos het volgende:
Waarom is die manier van mij verkeerd volgens jou?
Opzich is hij wel netjes als je 'ShowMessage('Program is already running');' er uit breekt :) Verder moet je zorgen dat de lpClassName van FindWindow altijd Uniek is maar dat zal duidelijk zijn (Geld ook voor Mutex natuurlijk).

Trouwns een Mutex is altijd Uniek...

Verwijderd

CreateMutex is wel de netste oplossing, maar ook nogal omslachtig...
Als ik een programma schrijf dan is hij toch al snel enkele honderden regels groot dus dan maken die 10regels voor OnlyOneInstance ook niet meer uit :)

Ow ik gebruik C++ Builder dus een klein beetje pascal kan ik wel :) (Naja lezen niet coden)

Verwijderd

mgfun: Als ik een programma schrijf dan is hij toch al snel enkele honderden regels groot dus dan maken die 10regels voor OnlyOneInstance ook niet meer uit :)
Douw 't in een library, en 't is nog maar 1 of 2 regels. Maar dat maakt jelmervos' manier nog steeds niet slechter. :)
Ow ik gebruik C++ Builder dus een klein beetje pascal kan ik wel :) (Naja lezen niet coden)
Als je de source van de VCL ook nog wilt begrijpen, zul je wel moeten. 8-)

Verwijderd

Maar dat maakt jelmervos' manier nog steeds niet slechter. :)
Zoals ik al aangaf vind ik hem verder prima... alleen de message window er uit halen :)
Als je de source van de VCL ook nog wilt begrijpen, zul je wel moeten. 8-)
Ik werk al een aantal jaar met C++ Builder en ik kan me aardig redden, gelukkig heb ik nooit de gehele VCL hoeven door spitten. Waarom zou je ook.

Verwijderd

Op dinsdag 13 november 2001 23:04 schreef mgfun het volgende:
Ik werk al een aantal jaar met C++ Builder en ik kan me aardig redden, gelukkig heb ik nooit de gehele VCL hoeven door spitten. Waarom zou je ook.
't Is een schat aan informatie over hoe je het beste binnen de VCL kunt programmeren. En voor 't tracen compileer ik altijd de VCL mee, want soms liggen de fouten gewoon daar, en niet in m'n applicatie. Dan is 't wel handig als je de source goed kunt volgen...
Pagina: 1