Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Close geht nicht zum Programmbeenden (https://www.delphipraxis.net/40324-close-geht-nicht-zum-programmbeenden.html)

JPSelter 14. Feb 2005 12:41


Close geht nicht zum Programmbeenden
 
Ich frage am Anfang (FormCreate) meiner Software ab, ob eine andere Kopie bereits läuft. Wenn diese schon läuft, soll eine showmessage-Nachricht darauf hinweisen und das Programm soll sich dann beenden. Ich benutze direkt unter showmessage den Befehl "close", aber er schliesst die Anwendung nicht. Bei "halt" bekomme ich eine allgemeine Schutzverletzung. Was kann ich tun?

ReDoX 14. Feb 2005 12:46

Re: Close geht nicht zum Programmbeenden
 
Ich glaube close funktioniert nicht im oncreate event.
Du musst das im OnShow machen.
Mfg ReDoX
Edit: Ich habe es getestet es geht im OnShow

alcaeus 14. Feb 2005 12:47

Re: Close geht nicht zum Programmbeenden
 
Close funktioniert AFAIR weder im OnCreate, noch im OnShow. Du könntest aber Application.Terminate aufrufen, dann wird die Anwendung sobald wie möglich geschlossen.
Die zweite Möglichkeit ist, einen Timer zu aktivieren und das Form im Timer zu schließen.

Greetz
alcaeus

Luckie 14. Feb 2005 12:47

Re: Close geht nicht zum Programmbeenden
 
Überlegen wir doch mal, was du da machen willst: Du willst beim Einsteigen in das Auto gleichzeitig wieder aussteigen. Macht das Sinn? Kann das gehen? Nein. Entweder machts du das bevor OnCreate aufgerufen wird, bevor du also einsteigst, also bevor das Hauptformular erzeugt wird, das wäre dann in der Projekt Datei bevor das Hautpformular initialisiert wird oder du machst es dann, wenn du schon im Auto sitzt und steigst dann wieder aus.

Gollum 14. Feb 2005 12:48

Re: Close geht nicht zum Programmbeenden
 
Hallo,

benutze einmal Application.Terminate. Damit müsste es gehen.

Luckie 14. Feb 2005 12:50

Re: Close geht nicht zum Programmbeenden
 
Warum immer diese Haudrauf-Methode wenn es besser geht?

Chegga 14. Feb 2005 13:00

Re: Close geht nicht zum Programmbeenden
 
Hi,

@ JPSelter:

Warum nicht einfach mit einer MessageBox?
Dann hast du Hinweis und Application.Terminate in einem. :wink:

MfG Marc

[Edit]Sorry alcaeus, ich meinte A.T und nicht Close :oops: [/Edit]

JPSelter 14. Feb 2005 13:01

Re: Close geht nicht zum Programmbeenden
 
Danke Lucki, das war sehr einleuchtend :)

alcaeus 14. Feb 2005 13:02

Re: Close geht nicht zum Programmbeenden
 
Zitat:

Zitat von Chegga
Warum nicht einfach mit einer MessageBox?
Dann hast du Hinweis und Close in einem. :wink:

Das musst du mir jetzt erstmal erklären. Seit wann macht denn die MessageBox irgendein Form zu? :shock:

Greetz
alcaeus

Chegga 14. Feb 2005 13:09

Re: Close geht nicht zum Programmbeenden
 
@ alcaeus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Knopf: Integer;
begin
  Knopf := Application.MessageBox
   ('Diese Software ist schon geöffnet. Beenden?', 'Hinweis', 1+16);
  if Knopf = IDOK then Application.Terminate;
end;
MfG Marc

Ultimator 14. Feb 2005 13:12

Re: Close geht nicht zum Programmbeenden
 
Aber die Anwendung soll den Benutzer ja nur informieren, wenn sie schonmal geöffnet wurde, aber nicht ihm die Wahl lassen, ob er sie vielleicht doch 2mal offen haben will ;-)

alcaeus 14. Feb 2005 13:14

Re: Close geht nicht zum Programmbeenden
 
Hallo Chegga,

und wo soll da der Unterschied zu dem hier sein (außer der sinnbefreiten Abfrage auf Ok, nachdem das Form sowieso geschlossen werden soll...)

Delphi-Quellcode:
ShowMessage('Das Programm ist bereits geöffnet');
Close; //oder Application.Terminate, je nachdem was dir besser gefällt
Der sinnvollste (und auch normalerweise verwendete) Weg ist aber der, dass man einen Mutex o.ä. in der Projektdatei erstellt, und dort auch prüft ob er bereits existiert.

Greetz
alcaeus

MagicAndre1981 14. Feb 2005 13:16

Re: Close geht nicht zum Programmbeenden
 
Hi,

mit folgendem Code kannst du abfragen ob deine Anwendung schon läuft:
Delphi-Quellcode:
unit u_Instanz;

interface

implementation

uses windows,Dialogs,sysutils, u_SBNBUCH;

var mHandle: THandle;   // Mutexhandle

Initialization

    mHandle := CreateMutex(nil,True,'MEINEANWENDUNG');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
        // Anwendung läuft bereits
        ShowMessage('MEINEANWENDUNG wird schon ausgeführt!!!');
        halt;
    end;

finalization  // ... und Schluß
  if mHandle <> 0 then CloseHandle(mHandle)
end.
Falls sie schon läuft bekommst du eine Meldung.

Mfg
André

JPSelter 14. Feb 2005 13:22

Re: Close geht nicht zum Programmbeenden
 
Die Anwendung soll von mehreren PCs im Netzwerk ausführbar sein. Keine Ahnung, ob Dein Quelltext auch im Netzwerk funktioniert. Aber ich habs jetzt erstmal über eine Textdatei gelöst, in der der Status, ein Timestamp und der User drinsteht.

Muetze1 14. Feb 2005 16:50

Re: Close geht nicht zum Programmbeenden
 
Moin!

Warum "empfehlen" hier noch so viele User die Haudrauf Methode "Application.Terminate" ?? Das wurde doch nun schon mehrfach geklärt, das dieses Probleme bereitet - genauso wie ein "Halt()" Aufruf im FormCreate. Sprint hatte dazu auch schon die Erklärung geschrieben (Application.MainForm ist im FormCreate noch nicht gesetzt und dadurch wird die MainForm nicht wieder abgeräumt, bzw. nicht sauber...).

Also, nehmt endlich Abstand sowas weiter zu empfehlen...

Zum anderen: Die Mainform ist ein Teil der Applikation - das Hauptfenster. Nun ist die Frage warum noch das Hauptfenster angelegt wird, wenn man sich schon vorher einig sein könnte, das die Applikation beendet werden sollte. Daher wäre es doch eigentlich Blödsinn noch die MainForm anzulegen, oder?

Also:
Mutex, Named Pipe, FindWindow/PostMessage, etc - aber nicht unbedingt im FormCreate.

MfG
Muetze1

bigg 14. Feb 2005 17:13

Re: Close geht nicht zum Programmbeenden
 
Eine Lösung würde sich hier mit:
initialization bzw. finalization anbieten. :zwinker:

Chegga 14. Feb 2005 18:34

Re: Close geht nicht zum Programmbeenden
 
Hi,

Zitat:

Zitat von bigg
Eine Lösung würde sich hier mit:
initialization bzw. finalization anbieten. :zwinker:

Du hast schon gelesen was MagicAndre1981 geschrieben hat?! :roll:

MfG Marc

bigg 14. Feb 2005 19:21

Re: Close geht nicht zum Programmbeenden
 
:mrgreen: gar nicht gesehen :zwinker:
ich würde aber keinen mutex erzeugen,
eher ein virtuelles Fenster :P


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