Newsgroup: it.comp.lang.delphi
Titolo: Controllo permessi alla partenza 2

Ho cercato di seguire alcuni consigli che mi avete dato, ma mi rendo conto
che devo fare ancora un po' di strada per apprendere come funziona Delphi :
sto cercando di controllare i permessi di apertura di un form (principale
e/o secondario)
attraverso l'evento OnShow dello stesso :
procedure TForm2.FormShow(Sender: TObject);
var
  chiusura:Boolean;
begin
  chiusura:=true;
  try
    begin
      if chiusura then
        begin
          showmessage('Non si hanno i permessi per aprire il progetto');
          close;
        end
      else
        //showmessage('Si hanno i permessi');
        // a questo punto si può visualizzare il form
      end;
  finally
  end;
end;
Il vaolre della variabile boleana lo prenderò da un campo in una tabella
permessi di un database MySQL.
Il problema è che ottengo questo errore :
Project Project1.exe raised exception class ElnvalidOperation with message
'Cannot change Visible
in OnShow or OnHide'. Process stopped Use Step or Run to continue.
Probabilmente l'errore dipende dal fatto che non ho le idee chiare, ma come
faccio per ottenere
quello che voglio ?
Tenendo conto che vorrei fare il controllo sia su form secondarie che su
main form.
Ciao e grazie
Enrico

> attraverso l'evento OnShow dello stesso :
Prova su evento Create.
Bye
AS
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 e/o secondario) attraverso l'evento OnShow dello stesso :
Come ti e' stato gia' detto in altri messaggi, l'uso di OnShow non
e' la cosa piu' corretta da fare.  I controlli devi farli *prima*
dello Show della maschera.


Prima ho provato anche nell'evento OnCreate.
Non ottengo nessun errore, ma la form viene visualizzata anche con il close.
Qual'è il comando per impedire che venga visualizzata ?
Ciao

 in OnShow or OnHide'. Process stopped Use Step or Run to continue.
Il messaggio di errore è corretto.
Il fatto è che Delphi deve adattarsi al modo di funzionare di Windows. 
Quando avviene l'evento OnShow?
Quando la TCustomForm ad un certo punto trova la proprietà Visible=True, 
e non gli puoi spostare la sedia di sotto al sedere mettendogli 
Visible=False (quello fa TForm.Close) quando lo Shuttle ormai si è già 
staccato da terra.
D'altra parte, se noti, un po' di logica devi metterla nel tuo ragionamento.
Devi decidere se visualizzare una form sulla base di una informazione 
che non è "interna" alla form, ma viene da una entità "esterna"!
Se la form è creata a livello di .dpr (cioè nel .dpr c'è una linea del tipo:
   Application.CreateForm ( TipoForm, VariabileForm  );
vuol dire che la tua form è già creata, solo che non è visibile in 
quanto form non principale (secondaria) e verrà visualizzata solo 
attraverso Show() oppure ShowModal().
Quindi il controllo lo devi mettere, ad esempio, IN UN EVENTO DELLA FORM 
CHIAMANTE, non in quella dipendente!
Esempio:
   procedure BottoneOnClick ( Sender: Tobject );
   begin
     if TuttoAPosto
       then Form2.ShowModal()
       else ShowMessage ( 'Diritti insufficienti' );
   end;
Se vuoi centralizzare il tutto, cosa che è più corretta dal punto di 
vista della programmazione, devi prevedere una procedura pubblica
TForm2 = class(TForm)
   ....
........
public
   ....
   procedure Execute;
published
   ....
end;
....
procedure TForm2.Execute;
begin
   if TuttoAPosto
     then ShowModal()
     else ShowMessage ( 'Diritti insufficienti' );
end;
Cosa ho fatto?
Ho semplicemente chiamato la Show della form da una procedura interna 
alla form stessa!
Al posto della ShowModal(), in tutti i punti del tuo programma chiama la 
Execute, ed il gioco è fatto.
Buon lavoro.
Ciao.
Mimmo.

Qual'è il comando per impedire che venga visualizzata ?
Neanche l'evento OnCreate va bene.
Questo evento si scatena alla creazione del form e non
quando esso viene visualizzato (tieni presente che i form
esistono anche se non sono visibili).
Dimentica di compiere questi controlli negli eventi legati
al form.  La tua condizione tipica dovrebbe essere:
if Condizione then
  MyForm.Show
else
  // mancanza dei permessi necessari...
cioe' i controlli vanno fatti *prima* dell'OnShow e non
*dentro* l'OnShow.
Se il form e' quello principale, questi controlli vanno
fatti nel sorgente del progetto (Project/View Source).
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

 ............
Oltre a tutto quello già detto io personalmete farei il test dei diritti
ancora prima di creare la form
If testdirittiOK then
  With TForm.Create(self) do
  Try
    miechiamate
    show / showmodal
    ... test del modal result
  finally
    free;
  end;
Saluti NEA

Ma scusate l'ignoranza..
come è possibile??..
01> procedure TForm2.FormShow(Sender: TObject);
02> var
03>   chiusura:Boolean;
04> begin
05>   chiusura:=true;
06>   try
07>     begin
08>       if chiusura then ** ma è logico che sia vero!! visto che sopra
(05) e stata assegnata a true.
09>         begin
10>           showmessage('Non si hanno i permessi per aprire il progetto');
11>           close;
12>         end
13>       else
14>         //showmessage('Si hanno i permessi');
15>         // a questo punto si può visualizzare il form
16>       end;
17>   finally
18>   end;
19> end;