Problème Accès table avec mot de passe recuperation d'erreur

kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 8 septembre 2009 - 13 févr. 2008 à 20:06
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 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).


Bref, si qqun peut me décoincer...


Merci d'avance à tous.

Et bonne soirée.


Kawapoulpe.

11 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.

cantador
0
kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Derniè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é.


Kawapoulpe.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 févr. 2008 à 08:15
"Donc rien à installer sur la machine."




HOUHOUAAAAHHHH, une paille !



Lis les documentations relatives à l'install d'une appli sous paradox...

D'ailleurs tes anomalies viennent vraisemblablement de là ....

cantador
0
kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 8 septembre 2009
14 févr. 2008 à 10:21
Et si tu t'expliquais un peu ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.

Pour te convaincre, juste un avant goût : http://brouardf.club.fr/PdoxMulti.html

bon courage

cantador
0
kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Derniè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).


Merci.


Kawapoulpe.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.

Wait and See..

cantador
0
kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 8 septembre 2009
15 févr. 2008 à 17:48
Ok, j'ai compris, il va donc falloir que je revoie cela de plus près.

Peut-être utiliser un simple fichier texte de type csv, pour mes données( elles sont simples).


Pour ce qui est du compodant database, je n'en ai pas.

J'ai uniquement Ttable et Tdatasource. Pas besoin de Tdatabase avec des tables paradox  toutes simples.


Quant aux erreurs de programmation, ça, je n'en doute pas... c'est pour
cela que je demande de l'aide ... Je suis quasiment comme un débutant.


Merci.


Kawapoulpe.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 févr. 2008 à 20:00
Si c'est vraiment simple Utilises le type TRecord, les ini, les csv..etc
jette un oeil sur PostitForEver.

cantador
0
kawapoulpe Messages postés 13 Date d'inscription mercredi 13 février 2008 Statut Membre Derniè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.

Ca marche maintenant parfaitement.


Merci


a++

Kawapoulpe
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 févr. 2008 à 19:16
J'ai trouvé des composants de base de données..


Merci de nous indiquer leurs noms
çà peut tjrs servir..

cantador
0
Rejoignez-nous