Autor Beitrag
delphimike
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: So 08.05.05 12:50 
hallo

wahrscheinlich ist es zu einfach um draufzukommen. Ich möchte ein Formular (TFORM) schließen, wenn bestimmte Voraussetzungen beim Öffnen nicht erfüllt sind (hier: Datenbanktabelle gesperrt)
in Form.activate überprüfe ich das, aber weder auf die Zuweisung von modalresult oder den close-Befehl reagiert das Formular. Was mache ich falsch?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 08.05.05 14:15 
Oh, da bin ich heut' noch am basteln. Eine elegante Lösung hab ich noch nicht gefunden.
Ich würde folgendes machen (im Hauptprogramm->Projekt Quelltext)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin
  Application.Initialize;
  Application.CreateForm (TDatamodule, Datamodule);
// ... und alle anderen CreateForms....
  If Datamodule.CanStartApplication Then // Hier testen, ob alles ok ist...
    Appication.Run;
End.
delphimike Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: So 08.05.05 17:44 
kingt sinnvoll, so hab ich es auch jetzt gelöst
anders scheint es nicht so Formularkonform...

danke
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: So 08.05.05 17:52 
Das wäre eigentlich ganz einfach:
wenn du die Überprüfung im OnShow, bzw. (da weiß ich net was passiert, müsste aber klappen) im OnCreate Ereignis machst. Weil im OnActivate Ereignis ist noch net gewährleistet, dass schon alle Komponenten erstellt sind. Desweiteren tritt dieses Ereignis nicht nur am Programmstart, sondern jedes mal, wenn die Form den Fokus bekommt, auf.
Gruß alias

_________________
Programmers never die, they just GOSUB without RETURN
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: So 08.05.05 17:55 
user profile icondelphimike hat folgendes geschrieben:
aber weder auf die Zuweisung von modalresult oder den close-Befehl reagiert das Formular.


Ist dein Quelltext wirklich so wie hier? Achte dabei darauf, dass du den richtigen Namen vom Formular verwendest.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormActivate(Sender: TObject);
begin
 Form1.Close
end;


oder

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormActivate(Sender: TObject);
begin
 Application.Terminate
end;


oder

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormActivate(Sender: TObject);
begin
 postmessage(form1.Handle,WM_SYSCOMMAND,SC_CLOSE,0);
end;
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 08.05.05 18:08 
Im OnCreate gehts nicht. Im OnShow klappts. So ein Dreck. :autsch: Da brech' ich mir jahrelang einen ab und dann kommst Du mit so einem lächerlichen Tip. :D
Danke :beer:
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: So 08.05.05 18:21 
Du hattest es doch geschrieben das du es im OnActivate-Ereignis versuchst. Im OnCreate funktioniert Close nicht, aber Terminate müsste funktionieren. Kannst es ja damit mal ausprobieren.
feivel3333
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: So 08.05.05 18:47 
Application.Terminate terminiert dir aber die gesamte Anwendung, nicht nur ein Fenster.

Eine kleine Anmerkung will ich hier noch reinbringen:
Ich habe die Erfahrung gemacht, dass, wenn man zu viel in das OnShow packt, ich meine jetzt richtig viel, das Formular sich aufhängen kann. Deshalb gehe ich folgenden Weg:

Ich packe mir einen Timer aus SYSTEM ins Formular, lasse diesen 100 ms warten und lasse diesen die Prüfungen durchführen, die beim Öffnen notwendig sind. Zudem habe ich mir eine Routine geschrieben, die sämtliche Elemente des Formulars auf Enable = true schaltet. So habe ich zum Entwurfszeitpunkt alle Buttons und so weiter auf disable geschaltet, damit der Benutzer so lange, wie noch nicht einwandfrei geklärt ist, ob das Fenster angezeigt werden darf, nicht schon irgendwo draufklicken kann und die OnShow-Prozedur damit durcheinander bringt. Zudem packe ich eine lbCanClose-Variable in das Formular, die erst mal false ist. Erst wenn die Prüfung im Timer erfolgreich abgelaufen ist, wird diese auf true gesetzt. Vorteil: Im CanClose-Event kann ich dieses nutzen, um das Fenster so lange offen zu halten, bis es sich "beruhigt" hat. Erst dann darf der Benutzer es wieder schließen.

Für mich lohnt dieser Aufwand, da ich sehr viel mit Datenbanken arbeite. Und wenn während des Öffnens von Dateien jemand auf die Idee kommt, das Fenster wieder zu schließen, dann ist das gar nicht gesund für die Dateien.

Gruß, André
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: So 08.05.05 18:58 
Das Terminate die gesamte Anwendung schließt ist mir schon klar, aber da man in vielen Projekten nur ein Fenster hat kann man ja gleich die Anwendung beenden, anstatt nur das Formular. Das Ergebnis ist das selbe, nur das Terminate für das Betriebssystem angeblich die saubere Variante zum beenden einer Anwendung ist.
feivel3333
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 190

W7
Delphi XE prof
BeitragVerfasst: So 08.05.05 19:11 
Da muss ich dir voll und ganz Recht geben. Ich war nur fälschlicherweise davon ausgegangen, dass es sich um ein Programm mit mehreren Fenstern handelt.