Problème Accès table avec mot de passe recuperation d'erreur
kawapoulpe
Messages postés13Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention 8 septembre 2009
-
13 févr. 2008 à 20:06
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
29 févr. 2008 à 19:16
Bonjour,
Je suis nouveau sur ce site, je débute en développement (enfin, pas
tout à fait, mais comme je n'en ai pas fait depuis plus de 10 ans et
que je n'était pas un expert à l'époque...c'est tout comme ! ).
Voici mon problème :
J'ai une table de type Paradox qui contient des données protégées par mot de passe.
Le mot de passe a été défini à la création de la table (avec le module de base de données).
Je dois donc indiquer mon mot de passe pour accèder à la table.
Evidemment, je souhaite que ce soit l'utilisateur du programme qui entre son mot de passe lors du démarrage de l'application.
Evidemment, ca ne fonctionne pas bien.
Lorsque je démarre l'application, j'ai bien une fenêtre qui me demande
un mot de passe, et si je rentre le bon, tout fonctionne parfaitement !
Par contre, si je clickes sur "Annuler" ou que je rentre un mauvais mot de passe, c'est la cata, j'ai droit à un beau plantage.
Je souhaite donc récupérer les erreurs possibles afin de terminer proprement et non pas avoir un plantage.
A force de cherche, j'ai trouvé comment récupérer l'évenement
"OnPassword" qui permet de changer la boite de dialogue par défaut.
Coool.
Mais je n'arrive pas à récupérer les évenements lorsque j'ai une erreur de mot de passe ou un mot de passe vide !
J'ai tout essayé (enfin, ce que j'ai pu), sans succès.
Y a til qqun qui pourrait m'aider, svp ??
Voici où j'en suis : (j'ai épuré le code pour simplifier la lisibilité)
(je souhaite que le mot de passe soit demandé au démarrage de l'application).
============================
procedure TForm.FormCreate(...):
begin
Session.OnPassword : = Password; // Je remplace la demande de mot de passe par défaut par la mienne (ci-dessous)
if not Session.GetPassword thenbegin // et je lance cette demande de mot de passe
ShowMessage('Erreur de passwd'); // j'arrive ici si le mot de passe saisi est vide et qu'on a appuyé sur ok
Application.Terminate; exit;
end;
try // Lorsque j'arrive ici, c'est parce qu'un mot de passe a été entré (qu'il soit bon ou pas) et qu'on a appuyé sur ok
Table1.Open; // Et là, problème, il me redemande le mot de passe et boucle et plante si erreur.
except
begin
// normalement on arrive ici si on ne peut pas ouvrir la table
ShowMessage('Erreur !');
Application.Terminate; Exit; // alors je ferme l'application.
end;
end;
end;
---------------------------------
procedure TForm.Password(Sender: TObject; var Continue: Boolean);
var Passwrd: String; res : boolean; // J'arive dans cette provédure lors de l'appel de la fonction "GetPassword"
begin
// Mais aussi, hélas!, lors de l'ouverture de la table !
res := Inputquery('Sécurité', 'Mot de passe :', Passwrd);
Continue := (Passwrd > ''); // si un mot de passe est entré, continue vaut alors True,
if res then begin // Si j'ai appuyé sur Ok dans ma boite de dialogue
Session.AddPassword(Passwrd); // J'ajoute mon mot de passe pour ouvrir la table.
end
else begin // Si j'ai appuyé sur Annuler ou sur la petit croix rouge
Showmessage('Vous avez annulé. Au revoir.'); // je quitte l'application.
Application.Terminate; Exit;
end;
end;
== =================
Comment ca se passe tout ça ?
Je démarre, j'ai une demande de mot de passe provoquée par "GetPassword".
Cas n°1 : Je rentre le bon mot de passe.
le try arrive à ouvrir la table
le programme continue et démarre
Tout va bien.
Cas n°2 : J'appuie sur le bouton Annuler ou la croix rouge
J'ai le message "Vous avez annulé..."
J'appuie sur Ok et le programme
s'arrête normalement. (je suis donc dans le Else de la procédure
password.)
Cas n° 3 : J'appuie sur "ok" sans rentrer de mot de passe (donc pwd vide).
J'ai le message "Erreur de password"
J'appuie sur Ok et le programme
s'arrête normalement (je suis donc dans le "if not getpassword"').
Cas n°4 : Je rentre un mot de passe erroné et j'appuie sur ok.
Il ne se passe rien de spécial, la
fenêtre me demandant le mot de passe se ferme et se rouvre aussitôt
avec la zone de saisie vide et attentd un nouveau mot de passe.
A partir de là, 3 nouveaux cas : (les mêmes)
4.1 : Je rentre le bon mot de passe
L'application s'ouvre normalement.
4.2 : Je rentre à nouveau un mot de passe erroné et j'appuie sur ok
Rien de spécial, la fenêtre est de nouveau rappelée pour me demande un
mot de passe.
4.3 : J'appuie sur Annuler :
J'ai le message "Vous avez annulé"
J'appuie sur ok
J'obtiens un plantage, erreur : "Le projet xxx a provoqué une classe
d'exception EDBEngineError avec
le message
'Droits sur la table insuffisants pour l'opération. Mot de passe
nécessaire.
...(blablabla...)"
4.4 : J'appuie sur Ok sans rien mettre (avec un mot de passe vide)
J'obtiens un plantage, erreur : "Le projet xxx a provoqué ... (idem ci-dessus).
====
En débuggant en pas à pas, je m'apperçois qu'en fait, à partir du
moment où j'ai entré un mot de passe erroné, je sors de la procédure
Password que j'avais définie moi-même et le programme continue son
cheminement.
Il arrive alors sur "Table.Open".
Comme il n'a pas de mot de passe correct pour ouvrir la table, il
recommence la demande de mot de passe et appelle donc le "OnPassword"
ce qui relance ma procédure de demande.
Jusque là, tout va bien.
Sauf que je ne sais pas récupérer le résultat de ma procédure lors de son appel automatique par le Open.
Donc, si j'ai une erreur mot de passe vide ou bouton annuler, je ne peux plus, cette fois, la traiter comme je le faisais
dans mon "if not getpassword" précédent !
Moralité, je me suis dit qu'avec une bonne récupération d'erreur ca devrait être faisable, d'où le "Try" qui englobe
l'open de la table.
Sauf que ca ne marche pas, le Except n'est jamais utilisé !!!! et je ne sais pas pourquoi !
Bref, Au secours !!!
En résumé, lors de l'ouverture de ma table, j'ai une erreur si mon mot de passe est vide ou si je fais "Annuler".
Je pensait pouvoir contourner le problème en utilisant mon GetPassword et en modifiant la procédure par défaut
OnPassword.
Malheureusement, je ne fait que déporter le problème car je ne peux pas
tester si le mot de passe est bon autrement qu'en essayant d'ouvrir la
table. Or, cela provoque une erreur si j'ai un mot de passe vide ou un
"annuler" sur la saisie du mot de passe. Et je ne sais pas comment
récupérer cette erreur.
Est-e que qqun peut m'aider, svp ? Me dire comment je peux/dois
récupérer l'erreur d'ouverture de la table. Est-ce qu'il y a une valeur
quelque part qui me donne cette info, et est-ce que j'ai besoin de
garder mon Getpassword? (sachant qu'il fait en quelque sorte double
emploi avec l'appel automatique du table.open).
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 13 févr. 2008 à 21:36
Ce n'est plus une question, c'est un roman feuilleton..
Enfin, tu as quand même de l'énergie..
Conseil : Puisque tu as décidé de rependre le flambeau, jette BDE + paradox et prends un autre SGBD.
je sais c'est dur..Mais au moins tu y verras plus clair.
kawapoulpe
Messages postés13Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention 8 septembre 2009 14 févr. 2008 à 00:21
Salut,
Oui c'est sûr, ca peut etre une solution, cependant, l'avantage des
tables paradox, c'est que je ne suis pas dépendant, justement, d'un
SGBD. Donc rien à installer sur la machine.
Ca facilite la vie.
Je ne me vois pas installer tout un SGBD pour une toute petite application de rien du tout.
Surtout que je dois pouvoir utiliser cette appli facilement, sans installation, depuis une clé usb.
Donc pas question d'installer quoi que ce soit sur la machine.
Juste mes fichiers (programme et données) sur la clé.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 14 févr. 2008 à 14:05
J'ai pas trop envie de rentrer dans les détails.
Ce système je l'ai viré déjà depuis une bonne dizaine d'années..
Tes soucis me rappellent trop ceux que j'avais à cette époque..
Evidemment tout dépend si tu travailles en monoposte ou en réseau.
Mais come tu évoques, l'installation sur une machine avec une clé USB..
Déjà, sur la machine, il te faut le BDE et avec une installation correcte.
(Tu as du oublié certainement de mettre la prop. LoginPrompt à false..)
Cà revient à installer le client pour un autre SGBD..
et la mise en réseau (avec un fichier partagé etc..), je préfère passer..
et quand à la gestion des index, les réparations etc....là on attend le sommet.
kawapoulpe
Messages postés13Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention 8 septembre 2009 15 févr. 2008 à 08:41
Bonjour,
Non, ce n'est pas tout à fait cela.
On peut considérer que je travailles en monoposte.
Je ne parlais pas "d'installation" avec une clé usb, mais
"d'utilisation" du logiciel sur une clé usb afin de pouvoir m'en servir
depuis n'importe quel poste.
Tout étant sur la clé (programme et tables de données).
Ceci afin de ne pas avoir à installer le programme quelque part.
(typiquement, cela me permet d'utiliser mon programme lorsque je vais chez un ami par exemple, car je l'ai sur ma clé usb).
Pourquoi aurais-je besoin d'installer un truc sur la machine en question ? Je ne veux surtout pas !
Normalement, mon programme (et son fichier de données) se suffit à lui-même, non ?
De quel "loginprompt" parles-tu ? a quel endroit ?
coté mise ne réseau, ce n'est pas du tout mon intention.
Et pour ce qui est index et cie, je ne vois pas ou est le problème? De quels sommets parles-tu ?
Quant à ton exemple, il est plutôt encourrageant, mais il ne me
concerne pas (pas en réseau ni en multi-utilisateurs pour mon cas).
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 15 févr. 2008 à 15:41
Ok, tu es effectivement dans la situation la plus simple :
on résume :
application monoposte avec la base de donnée le tout sur clé USB :
Mais sans le BDE, ça ne fonctionnera pas..
ca marche bien sûr sur ta machine où la machine d'un autre car vous avez tous les deux Delphi installé et dans ce cas le BDE est installé par défaut.
Ensuite, il doit vraisembablement y avoir quelques erreurs de programmation..
la propriété LoginPrompt est celle du composant TDataBase.
kawapoulpe
Messages postés13Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention 8 septembre 2009 29 févr. 2008 à 16:02
Problème résolu, merci de votre aide.
J'ai trouvé des composants de base de données qui remplacent ceux par
défaut de delphi (un database et un table) et qui fonctionnent sans BDE
ni un quelconque moteur à installer, et qui utilisent un fichier en
local comme base de données. Ideal.