Autor Beitrag
motion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: So 03.04.05 01:08 
Ich möchte bei der dynamischen Erstellung eines Formulars im OnFormCreate Ereignis eventuell die Erstellung mit einer Fehlermeldung (MessageBox) abbrechen.
Wie ist das sauber durchzuführen?

Ist folgendes legitim?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TAdresseDrucken.FormCreate(Sender: TObject);
begin
  inherited;
  If --hier der Test-- Then
     Begin
       MessageBox ('Fehler!');
       Close;
     End;
end;


Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 03.04.05 01:44 
Mach es bevor die Methode Create aufgerufen wird.

Was du machts, ist in das Auto einsteigen und gleichzeitig wieder austeigen wollen.
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 03.04.05 10:05 
So müsste es gehen - du muss Create - eigentlich das ganze Programm - verlassen, sonst wird zuerst Code, der eventuell in Close steht, ausgeführt und dann würde es in Create weitergehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TAdresseDrucken.FormCreate(Sender: TObject);
begin
  inherited;
  If --hier der Test-- Then
     Begin
       ShowMessage('Fehler!');
       Close;
       Application.Terminate;  //hier verlassen!
     End;
end;

Jedenfalls klappt das bei mir problemlos!
//Edit: Habe vorhin überlesen, dass es sich um eine dynamisch erzeugte Form handelt und es daher mit einer "normalen" Form getestet!

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 03.04.05 10:51 
Es gibt zwei Wege, das sauber zu lösen:

1. Vorher klären, also Konstruktor gar nicht erst aufrufen, wenn nicht möglich
2. Im Konstruktor eine Exception auswerfen, die dann aber auch wieder außerhalb gefangen werden muss.
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: So 03.04.05 13:02 
Hmmmm,
ich arbeite mit einer Form-Vererbung und habe einiges an Logik in das Basis-Formular eingepreßt. Dann diesen Test bei jedem Aufruf aus dem Formular rauskopieren für die ca. 6 verschiedenen Aufrufe ist nicht so prall.
Eventuell generiere ich eine Public Function PreCreateTest:Boolean in meinem Basis-Formular, so dass ich dann in den aufrufenden Proceduren vor dem FormCreate einfach die obige Testfunktion ausführe und dann falls notwendig das Create eben gar nicht ausführe.

Obwohl: Create ist ja die erste Methode zur Erzeugung des Formulars. Dann werde ich dort wohl besser eine Boolsche Variable/Funktion setzen, die nach dem Create den Status anzeigt und dann entscheiden, ob ich überhaupt FormShow aufrufen kann.

Okay,
vielen Dank für die Rückmeldungen.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 03.04.05 13:58 
Du kannst aber auch eine class function Creatable: Boolean; Funktion definieren. Die kanst du auch ohne Instanz aufrufen (Klassenname.Creatable).