Newsgroup: it.comp.lang.delphi
Titolo: è possibile chiudere una form durante la creazione?

Ciao a tutti,
il dubbio è quello in oggetto:
è possibile chiudere una form durante la creazione, o quantomeno prima
della sua visualizzazione?
Ciao,
Matteo

 ha scritto nel messaggio 
news:7fbe3121-e342-4f9e...@i6g2000yqj.googlegroups.com...
Ciao a tutti,
il dubbio � quello in oggetto:
� possibile chiudere una form durante la creazione, o quantomeno prima
della sua visualizzazione?
Application.terminate;
oppure
halt; 

 della sua visualizzazione?
a che pro?
A.

> Application.terminate;
.ehm... e se non è la mainform?
A.

.ehm... e se non è la mainform?
Infatti a me interessa non per la mainform... :)
Per la cronaca alla terza ora di ricerca su internet ho trovato:
    PostMessage(self.handle, WM_CLOSE, 0, 0);
Che sto verificando se riesco ad usare...
Matteo

 la veda (quindi prima che diventi visibile).
Imho stai facendo un errore di progettazione: non ï¿œ il form che deve 
chiudersi da solo se l'utente non ha i privilegi per aprirlo.
Creati una classe controllore che incapsula queste regole, e chiedi a 
lei ogni policy. In base ai risultati potrai impedire che l'utente apra 
il form magari disabilitando o nascondendo i pulsanti/menu di apertura.
Ciao
-- 
Morde

 il form magari disabilitando o nascondendo i pulsanti/menu di apertura.
..preceduto di un soffio..! :-))
A.

 Morde
Si, ci stavo pensando...
Stavo percorrendo la strada dell' "auto-chiusura" a causa del
paradigma dell'incapsulamento. L'oggetto form deve sapere se si deve
aprire oppure no.
Il problema principale da risolvere è soprattutto quello delle
aperture da altre form.
Mi spiego: immagina che dalla form A io voglia aprire B.
I casi sono:
1- A deve sapere se B può essere aperta oppure no, questo significa
che ogni form deve sapere ogni diritto di ogni altra form. Non mi
sembra fattibile!
2- B conosce se può essere aperta oppure no, da qualsiasi oggetto
venga richiamata, è B stesso che verifica se e quali diritti ha.
3- Delego tutto ad un controllore (C?) dal quale passare per vedere se
è possibile aprire o no la form
Il caso 2 mi sembrava il più pulito dal punto di vista logico ed è per
questo che stavo verificando se riesco a farlo cosi.
Anche perchè lo piazzerei sulla classe madre così mi si eredita in
tutto il progetto.
Questo però provoca il problema di cui sopra per cui, se non ne esco,
dovrò fare come dici tu, anche se questo significa aggiungere una
altra classe che supervisioni e tutte le chiamate dovrò farle passare
da lei.
Adesso verifico anche questo...
Matteo

 da lei.
E' esatto.
Tu usi un paradigma diverso dal mio.
Conosci il pattern MVC, il model view controller? Non dico che devi 
implementarlo, ma il concetto di avere a disposizione un controller al 
quale delegare queste responsabilitï¿œ ï¿œ sempre comodo.
Tu vuoi aggiungere logica ai form, io invece credo che lo scopo del 
form essenzialmente sia di gestire le informazioni da visualizzare 
(presentation layer). Io lascio decidere ad un controller se 
quell'utente ha le credenziali o meno per aprire una finestra. La 
finestra, mostra le informazioni e non dovrebbe sapere chi/che cosa la 
sta guardando o manipolando.
"Divide et impera", isola e gestisci.
-- 
Morde

 da lei.
infatti.
A.

 della sua visualizzazione?
Non entro nella discussione di Alberto (che condivido comunque) ma
voglio solo darti un'idea per il tuo problema:
Hai provato l'evento OnShow? Se ricordo bene parte la prima volta che
si tenta di visualizzare una finestra.
Li' puoi implementare logiche del tipo:
if (current user non ha i diritti) then Self.Close;
Ciao,
Gp

 Matteo
secondo me basterebbe una funzione che restituisca il livello 
dell'utente in base a questo apre o meno la form. in una mia 
applicazione ho fatto in modo che sia l'amministratore dell'applicazione 
stessa a decidere un livello utente cosa pu� aprire...
saluti

 halt; 
Secondo me non ï¿œ una buona soluzione, dato che generalmente l'utilizzo 
diretto di Terminate() andrebbe evitato anche nei casi di normale 
terminazione di un'applicazione. Per Halt(), a maggior ragione... :)
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)