Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Programm beenden (https://www.delphipraxis.net/149821-programm-beenden.html)

EarlyBird 31. Mär 2010 08:59


Programm beenden
 
Hallo,
ich habe eine Komponente die beim Start meines Programmes ein Fenster öffnet.
(es ist ein LoggIn Dialog)
Wie kann ich es erreichen das bei einem nicht erfolgreichen loggin der Start des Programmes abgebrochen wird und das Programm sofort beendet wird.
Im Augenblick mache ich es so:
Delphi-Quellcode:
procedure TRegisterDlg.loaded();
begin
  inherited;
  IF csDesigning IN ComponentState THEN         // Komponente ist zur Designtime (=DragDrop) erstellt worden
    BEGIN
      Exit;
    END;

  if FShowonstartup then
    begin
     showform;
    end;
end;


function TRegisterDlg.showForm() : Integer;
begin
   IF csDesigning in ComponentState THEN
    BEGIN
      Exit;
    END;
   if not Assigned(FRegisterform) then
     begin
       FRegisterform := TStart.Create(Nil);
     end;
   if FRegisterform.ShowModal = idCancel then
     begin
       FRegisterform.Close;
       freeAndNil(FRegisterform);
       Application.terminate;
     end;
end;
Dann wird aber das Fenster des Programmes erst noch fertig erstellt und dann das Porgramm geschlossen.
Wie kann ich den Programmstart abbrechen?

Danke für Eure Hilfe
EarlyBird

hoika 31. Mär 2010 09:25

Re: Programm beenden
 
Hallo,

Halt ?


Heiko

EarlyBird 31. Mär 2010 11:04

Re: Programm beenden
 
Danke für den Tipp.

leider geht es nicht mit Halt innerhalb der Komponente.

Ich mache es jetzt im onCreate des DataModules
Delphi-Quellcode:
procedure TOraData.DataModuleCreate(Sender: TObject);
begin
  if not RegisterDlg1.isLoggedIn then
    Halt;
end;
Das funktioniert.
Ist aber nicht so schön da ich das Programm gern in der Komponente selbst beenden würde.
Ist das überhaupt möglich?

EarlyBird

Die Muhkuh 31. Mär 2010 11:09

Re: Programm beenden
 
Zur Not Forms in die uses aufnehmen und per Application.Terminate in die ewigen Jagdgründe übergehen.

EarlyBird 31. Mär 2010 11:20

Re: Programm beenden
 
Application.Terminate beendet den create Prozess des Programmes nicht.
Der Prozess wird erst fertig ausgeführt und dann wird das Programm beendet.

Die Muhkuh 31. Mär 2010 11:28

Re: Programm beenden
 
Hi,

ok, andere Möglichkeit, die ich gerne nutze:

Quellcode der dpr-Datei:

Delphi-Quellcode:
  LoginForm := TLoginForm.Create(Application);
  if (LoginForm.ShowModal = mrOK) then
  begin
    FreeAndNil(frmLanguageSelector);
    Application.CreateForm(TdmData, dmData);
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end;
Ich hoffe, dass Prinzip ist Dir klar?

daddy 31. Mär 2010 15:41

Re: Programm beenden
 
Um ein Formular während des Aufrufs abzubrechen, bevor es überhaupt erscheint, überschreibe ich immer den Konstruktor des Formulars.

Delphi-Quellcode:
Type
  TMyForm = Class(TForm)
    ...
  public
    constructor Create(AOwner: TComponent); override;
    ...
  end;

implementation

constructor TMyForm.Create(AOwner: TComponent);
begin
  ... Abbruchprüfung ...
  if <Abbruchbedingung erfüllt> then Raise Exception.Create(<Fehlermeldung>);
  inherited;
  ...
end;
In der aufrufenden Prozedur muss die Exception dann per Try .. Except abgefangen werden, damit sie nicht nach außen dringt.

Gruß
Daddy

EarlyBird 31. Mär 2010 18:11

Re: Programm beenden
 
@Daddy:
Im Prinzip mache ich es jetzt auch so.

Im DataModul das meine Komponente enthält prüfe ich im onCreate den Booleanwert einer Property meiner Komponente.
Delphi-Quellcode:
procedure TOraData.DataModuleCreate(Sender: TObject);
begin
  if not MeineKomponente.isLoggedIn then
    Halt;
end;
So kann ich auf die Exeption verzichten.
Das klappt auch ganz gut so.

Noch lieber wäre es mir aber ich könnte das Ganze direkt in meine Komponente verlagern.
Da habe ich noch keinen Weg gefunden.

@Muhkuh:
Das Prinzip ist mir klar.
Hilft mir aber leider mit meiner Komponente nicht weiter.

Gruß
EarlyBird

daddy 1. Apr 2010 10:42

Re: Programm beenden
 
Hallo EarlyBird!

Was mir noch nicht ganz klar ist: Kannst Du denn nicht im DPR-File den Aufruf Deines Formulars verhindern? Etwa in dieser Form:

Delphi-Quellcode:
...

begin
  ...
  if MeineKomponente.isLoggedIn then
  begin
    ...
    Application.Run;
    ...
  end;
  ...
end.
Gruß
Daddy

[Edit] Siehe auch bereits Beitrag #6 [/Edit]

Die Muhkuh 1. Apr 2010 10:57

Re: Programm beenden
 
Genau das wollte ich damit auch sagen ;-)


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