Consiglio su esecuzione applicaxione VCL

di il
5 risposte

Consiglio su esecuzione applicaxione VCL

Salve a tutti vorrei un consiglio .
Ho una applicazione VCL, unico EXE, che prevede un DM e un  MainForm, con una serie di formchild.
Ora mi è nata la ncessità di inserire un login con utente e password all'avvio della mia applicazione.
Mi sono creato un form di login che fa una prima lettura nel DB per caricare la tabella degli utenti, fin qui tutto ok.
Sono riuscito a far partire la finestra del login ma quando do accedi deve caricare la MainForm, ma non sto riuscendo
In questo momento quello che faccio è:
//

 Form_Splash := TForm_Splash.Create(Application);
 Form_Splash.ShowModal;
 Form_Splash.Free;
 Application.CreateForm(TDM, DM);
 Application.CreateForm(TFMLogin, FMLogin);
 Application.CreateForm(TFM, FM);
 Application.CreateForm(TFMSCA, FMSCA);
 Application.CreateForm(TFMMG20FIL, FMMG20FIL);
 Application.Run;

Carico il DB e poi si avvia il login quando do accedi deve chiudere il login e partire con FM.
ho provato ad usare il tag facendo la seguente ma mi restituisce access violation

 Application.CreateForm(TDM, DM);
 Application.CreateForm(TFMLogin, FMLogin);
if FMLogin.tag=1 
begin
 Application.CreateForm(TFM, FM);
 Application.CreateForm(TFM, FM);
 Application.CreateForm(TFMSCA, FMSCA);
 Application.CreateForm(TFMMG20FIL, FMMG20FIL);
 Application.Run;
end;

Potete consigliarmi su come procedere ? FMLogin è un formstyle normale,

5 Risposte

  • Re: Consiglio su esecuzione applicaxione VCL

    ???

    Su mainform oncreate:

    Try

       Login.showmodal

    Finally

       Login free

    Su login

      Main.utenteloggato=vattelappesca

      Permessi= caricai oermessi

      Close

    Fai lo stesso se logout e cambio utente...

  • Re: Consiglio su esecuzione applicaxione VCL

    Grazie non ci avevo pensato.
    Sembra funzionare bene,

  • Re: Consiglio su esecuzione applicaxione VCL

    27/12/2024 - danielito ha scritto:

    ho provato ad usare il tag facendo la seguente ma mi restituisce access violation

    Non c'è alcuna necessità di usare la proprietà Tag: i Form hanno già tutte le proprietà che servono.

    27/12/2024 - danielito ha scritto:

     Form_Splash := TForm_Splash.Create(Application);
     Form_Splash.ShowModal;
     Form_Splash.Free;

    Questa non è corretta: se usi ShowModal(), blocchi l'esecuzione del codice che segue la visualizzazione della finestra, che dovrebbe proseguire per caricare il resto dell'applicazione mentre la "splash form" è visualizzata. Dovresti usare il normale Show(), magari mettendo un Timer all'interno della finestra per chiuderla in automatico chiamando il metodo Close(), e usare l'opzione caFree dell'evento OnClose; ad esempio,

    procedure TSplashForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Action := TCloseAction.caFree;
    end;

    27/12/2024 - danielito ha scritto:

    Application.CreateForm(TDM, DM);
     Application.CreateForm(TFMLogin, FMLogin);
     Application.CreateForm(TFM, FM);
     Application.CreateForm(TFMSCA, FMSCA);
     Application.CreateForm(TFMMG20FIL, FMMG20FIL);
     Application.Run;

    Tutte queste Application.CreateForm() siamo sicuri che siano indispensabili? Molte finestre dovrebbero essere create "alla bisogna" e non subito all'avvio dell'applicazione, a meno che non vadano mostrate tutte e subito. La finestra di login ad esempio, la visualizzi e poi la distruggi: non deve restare in memoria dato che serve solamente quando l'utente fa login all'avvio, oppure (se supportato) quando c'è un logoff/logon durante l'esecuzione del programma.

    27/12/2024 - danielito ha scritto:

    Potete consigliarmi su come procedere ? FMLogin è un formstyle normale,

    Il FormStyle va bene lasciarlo com'è, ma non va creato in automatico (toglilo dall'elenco "Auto-Create Forms" nelle opzioni del progetto).

    Quello che devi fare è anteporre nel programma principale la visualizzazione della tua finestra di login e attendere un responso: se l'utente conferma il tentativo di accesso e questo è corretto, allora puoi proseguire, altrimenti non procedi con la creazione della finestra principale (che non serve e non ha senso vederla "flickerare" inutilmente) e non avvii nemmeno l'applicazione nella sua interezza.

    Ad esempio, supponendo che la classe del form di logon si chiami TLogonForm, all'interno del programma principale (il "program", ovvero il file .dpr per intenderci) puoi scrivere qualcosa del tipo

    begin
     Application.Initialize;
     Application.MainFormOnTaskbar := True;
     var LLogonForm := TLogonForm.Create(nil);
     try
       if LLogonForm.ShowModal = mrCancel then
         Exit;
     finally
       LLogonForm.Free;
     end;
     Application.CreateForm(TMainForm, MainForm);
     Application.Run;
    end.

    In questo modo

    1. crei la finestra di login solo quando serve all'inizio, e non la tieni inutilmente in memoria;
    2. imponi all'utente di dare un responso prima di chiudere la finestra;
    3. utilizzi una variabile con scope locale per il Form (LLogonForm) e non quella globale che Delphi crea di default ma che andrebbe evitata (tranne forse per MainForm, come unica e rara eccezione);
    4. eviti l'uso della proprietà Tag che non serve e usi i valori preposti a questo scopo, ossia i valori di ritorno del metodo ShowModal(), come mrOk, mrCancel, ecc.;
    5. non crei inutilmente il Form principale (MainForm) se non occorre farlo;
    6. mantieni il codice più pulito e soprattutto ne mantieni anche il controllo, in linea di principio.

    Prenditi un attimo il tempo di leggere, capire e provare il codice, in modo da acquisire le motivazioni alla base e andarle poi ad applicare al tuo contesto, utilizzando i nomi delle classi che hai assegnato e integrando l'esempio nel resto del codice.

  • Re: Consiglio su esecuzione applicaxione VCL

    Un form con due tedit di cui uno mascherato con spunta "mostra password" che serve solo a verificare utente e password non pesa molto.

    La verifica si fa sul modulo se esiste l'utente e la pw coincide.

    Se coincide il modalresult è ok

    Al rientro se modalresul=ok bene altrimenti chiude il programma o va in demo se previsto.

    Se ok per ogni menu controlla i permessi prima di eseguire i comandi.

    Se, tuttavia, si volesse distruggere il form si potrebbe creare a runtime senza passare dal file di progetto.

  • Re: Consiglio su esecuzione applicaxione VCL

    27/12/2024 - danielito ha scritto:

    Mi sono creato un form di login che fa una prima lettura nel DB per caricare la tabella degli utenti

    Usa una query.

    Select bla bla where utente=tedit1 and userpassword=passwiord(tedit2)

    Se esiste (recordcount>0) blocchi l'utente da modifiche o cancellazioni.

Devi accedere o registrarti per scrivere nel forum
5 risposte