Pongo un quesito che che di per se non è un vero problema (e per alcuni potrà anche sembrare stupido), in quanto non ho problemi di funzionamento in nessuna delle due soluzioni che ho sperimentato,
ma sono curioso ci capire quale possa essere il miglior approccio, e perchè,
mi spiego meglio;
Partiamo da una applicazione standard (non ha importanza di cosa si occupi), chiaramente utilizza una serie di Form dedicate a gestire i dati, immaginiamo la classica applicazione clienti, fornitori, commessse ... quindi una serie di Form costruiti ad hoc, e tutti residenti nella stessa cartella (o un'altra) ma dedicati a questa applicazione, niente di strano,
Immaginiamo anche che sia necessario una dialog di login, bene, quest'ultima potrebbe essere anche lei dedicata all'applicazione, quindi con i dati di accesso inseriti direttamente nel componente, o come sono solito fare a runtime o in una unit Init che sia negli Uses,
però è anche vero che, meno di particolari casi che non mi ne vengono in mente, si potrebbe pensare di tenerla in una cartella Utilities e usarla (sempre la stessa) per più programmi, e questa è la soluzione che credo sia la più corretta, o almeno io faccio così,
quindi si può dire che se il processo di check del login, è comune a tutte le applicazioni, certamente non lo è il DB utilizzato, la posizione ...
spero fin quì di essere stato sufficientemente chiaro, ora viene il quesito:
dato che l'oggetto/form TLogin non può contenere i dati di accesso al DB, perchè cambiano a seconda del programma che lo chiama, vedo due possibili soluzioni (probabilmente non ci vedo bene ;-)
a. inizializzo dal programma principale una connessione ad DB, la passo come parametro all'oggetto che la usa per il check di cui sopra, mi restituisce il risultato ( ok puoi entrare, oppure no) e poi distruggo la connessione,
es:
....
try
try
// Create DB connection ...
dbConn:= TZConnection.Create(self);
// with relevant DB parameters inside function, tests and returns connection data
dbConn:= GetUserDBConnection;
// call Login form ...
LogIn:= TLogIn.Create(Application);
LogIn.SetDBConnection( dbConn); // Provide connection to Login Dialog
LogIn.ShowModal;
// assign User data to global var
if LogIn.GetLoginResult then LogIn.GetLoginInfo(USER_KEY, USER_NAME, USER_FULL, USER_PASS, USER_PROF);
// handle generic error !
except
on E: Exception do MessageDlg( 'There was an error: ' + E.Message, mtError, [mbOK], 0);
end;
finally
LogIn.Free;
dbConn.Free;
end;
b. al posto di passare un oggetto TZConnection come parametro al metodo SetDBConnection, potrei modificarlo e passare i parametri Protocol e Database necessari, affinche la connessione venga inizializzata all'interno dell'oggetto TLogin stesso.
non ho un codice da postare per questo esempio (io utilizzo il primo), ma non è difficile immaginarlo.
ora, personalmente non vedo una grande differenza tra le due soluzioni, passare un oggetto già inizializato come parametro, oppure passare dei parametri affinchè questo avvenga inizializzato da un'altra parte ... cosa cambia ? :-\
appunto vi chiedo:
.. cambia qualche cosa ?
.. e dal punto formale quale soluzione sarebbe la più "corretta" ?
.. oppure esiste un'altra soluzione che lo sarebbe ancora di più
scusate il post "fiume" :)
M