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
- crei la finestra di login solo quando serve all'inizio, e non la tieni inutilmente in memoria;
- imponi all'utente di dare un responso prima di chiudere la finestra;
- 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);
- 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.;
- non crei inutilmente il Form principale (MainForm) se non occorre farlo;
- 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.