![]() |
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?
|
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 |
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 |
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.
|
Re: Close geht nicht zum Programmbeenden
Hallo,
benutze einmal Application.Terminate. Damit müsste es gehen. |
Re: Close geht nicht zum Programmbeenden
Warum immer diese Haudrauf-Methode wenn es besser geht?
|
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] |
Re: Close geht nicht zum Programmbeenden
Danke Lucki, das war sehr einleuchtend :)
|
Re: Close geht nicht zum Programmbeenden
Zitat:
Greetz alcaeus |
Re: Close geht nicht zum Programmbeenden
@ alcaeus:
Delphi-Quellcode:
MfG Marc
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; |
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 ;-)
|
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:
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.
ShowMessage('Das Programm ist bereits geöffnet');
Close; //oder Application.Terminate, je nachdem was dir besser gefällt Greetz alcaeus |
Re: Close geht nicht zum Programmbeenden
Hi,
mit folgendem Code kannst du abfragen ob deine Anwendung schon läuft:
Delphi-Quellcode:
Falls sie schon läuft bekommst du eine Meldung.
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. Mfg André |
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.
|
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 |
Re: Close geht nicht zum Programmbeenden
Eine Lösung würde sich hier mit:
initialization bzw. finalization anbieten. :zwinker: |
Re: Close geht nicht zum Programmbeenden
Hi,
Zitat:
MfG Marc |
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