| Autor |
Beitrag |
delphimike
      
Beiträge: 117
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| begin Application.Initialize; Application.CreateForm (TDatamodule, Datamodule); If Datamodule.CanStartApplication Then Appication.Run; End. |
|
|
delphimike 
      
Beiträge: 117
|
Verfasst: So 08.05.05 17:44
kingt sinnvoll, so hab ich es auch jetzt gelöst
anders scheint es nicht so Formularkonform...
danke
|
|
alias5000
      
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)
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: So 08.05.05 17:55
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 08.05.05 18:08
Im OnCreate gehts nicht. Im OnShow klappts. So ein Dreck.  Da brech' ich mir jahrelang einen ab und dann kommst Du mit so einem lächerlichen Tip.
Danke 
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: 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.
|
|