IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Variable partagée et fenêtres modales


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut Variable partagée et fenêtres modales
    Bonjour à tous,

    je réalise une application comportant trois unités :
    - quizz_24_04.pas : application principale
    - bdd_28_08.pas : identification dans une bdd
    - paratager.pas : déclaration d’une variable partagée nommée utilisateur.

    Nom : mes fiches.png
Affichages : 412
Taille : 4,1 Ko

    On démarre avec l’interface de la fiche principale.
    Nom : fiche princ.png
Affichages : 393
Taille : 11,8 Ko


    Cette fiche comporte notamment un bouton « connexion » qui créé la « form bdd » de manière modale, et donc la fiche principale devient inerte en arrière plan.
    Nom : fiche bdd.png
Affichages : 325
Taille : 2,6 Ko

    Si l’identification est ok, on affecte le nom de l’utilisateur dans la variable « utilisateur », puis la fiche bdd est fermée, rendant la main à la fiche principale.

    Désireux d’afficher le nom de la personne connectée dans le Tlabel « lb_élève » de la fiche principale, je ne peux pas le faire sur le « OnClose » de la « forme bdd » car les objets de la fiche principale lui sont inconnus. La variable commune mise à jour « Utilisateur », doit permettre cette transmission.


    Si je mets à jour cet affichage en utilisant un bouton, au retour sur la fiche principale, cela fonctionne, mais ca reste manuel, donc bof….
    Nom : pr_lb_élèveClick.png
Affichages : 388
Taille : 2,9 Ko

    On précise dans la doc que le « OnActivate » des forms est appelé dès que la form est activée, à la création bien sur, mais également quand on lui « rend la main » après une fenêtre différente, appelée de manière modale. Je voulais utiliser cet événement de retour pour cela, mais il ne semble pas être appelé, car même le « showmessage » n’est pas accompli au retour dans mon « OnActivate », alors qu’il est accompli au démarrage.
    Nom : on activate.png
Affichages : 324
Taille : 3,8 Ko


    1/ L’événement OnActivate de la form principale peut-il être appelé à la réactivation de la fiche principale, déjà existante mais à la récupération du focus ?

    2/ Quel autre événement peut détecter que la fiche a été « remise en premier plan » et ainsi accomplir un peu de code à ce moment là ??

    Merci pour vos idées……

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Bonsoir,

    Si je comprends bien, l'utilisateur est accepté ou non dans la fiche modale, grâce à une interrogation de BDD.

    Ma question accessoire : que se passe-t-il s'il n'est pas autorisé ?

    Sinon, au lieu de cibler un événement de la fiche principale, il pourrait suffire d'exploiter le OnClose de la fiche modale auquel on aurait affecté une fonction de celle principale.

    Ou utiliser une méthode d'objet style MajFichePrincipale comme fonction de rappel (avec le passage du nom d'utilisateur en argument), qui maintiendrait l'indépendance des fiches en évitant l'unité pour partager une valeur.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Tu n'as pas besoin d'un événement supplémentaire, c'est le retour de ShowModal qu'il faut traiter.
    La fiche modale va certainement contenir deux boutons, l'un "Ok" avec un ModalResult à mrOk et l'autre "Annuler" à mrCancel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm8.bConnectionClick(Sender: TObject);
    begin
      if fBDD.ShowModal = mrOk then
        lb_eleve.Caption := Utilisateur;
    end;

  4. #4
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut toujours en vrac...
    Bonjour Tourlourou

    Merci de prendre en compte mon appel!

    L'application principale est un quizz visuel sur un domaine technique, où l'on doit placer des images sur des emplacements dédiés, selon les questions.
    Si on n'est pas connecté, on peut utiliser le quizz pour "s'entrainer" de manière anonyme.
    Si on veut conserver un résultat, on peut s'identifier.
    Quand on demande la connexion, si on est identifié, la variable "utilisateur" contient le nom du connecté.
    Si on ne parvient pas à s'identifier, on ferme la fenêtre "bdd" et on redonne la main au mode anonyme.

    Effectivement, utiliser l'événement "OnClose" de la fenètre de connexion pour mettre à jour le nom du connecté est une idée qui semble la plus appropriée.
    En effet, je retourne sur la fiche principale avec le nom contenu dans "utilisateur" partagée par la fiche principale.
    Cependant, sur le OnClose, je suis encore sur la fiche bdd, et une procédure concernant un objet de la fiche principale ne peut fonctionner., non??
    En effet, Comment la fiche bdd pourrait mettre à jour le champ "lb_élève.caption" qu'elle ne peut voir, puisque appartenant à la fiche principale??

    A part manuellement, au retour sur la fiche principale, je clique sur un objet pour effectuer "lb_eleve.caption := utilisateur", ca marche mais c'est sans intérêt.... Ou alors un timer qui toutes les 5 secondes effectue "lb_eleve.caption := utilisateur", au hasard, pour être utile une seule fois...
    Bof, bof,.... y a vraiment un truc qui m'échappe....

  5. #5
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut Pour Andnotor
    Citation Envoyé par Andnotor Voir le message
    Tu n'as pas besoin d'un événement supplémentaire, c'est le retour de ShowModal qu'il faut traiter.
    La fiche modale va certainement contenir deux boutons, l'un "Ok" avec un ModalResult à mrOk et l'autre "Annuler" à mrCancel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm8.bConnectionClick(Sender: TObject);
    begin
      if fBDD.ShowModal = mrOk then
        lb_eleve.Caption := Utilisateur;
    end;
    Merci pour les suggestions!

    J'aimerais que quand la fiche "secondaire" bdd se ferme et rend la main à la fiche principale, le nom de l'utilisateur identifié, s'affiche automatiquement sur la fiche principale qui reprend la main.
    Dans votre exemple, il me semble qu'il faut cliquer sur un élément sur la fiche Tform8 principale pour mettre à faire apparaitre le nom??

    Ma difficulté est de mettre à jour le champ objet de la fiche principale, alors que je quitte une fiche secondaire...

    Passer la valeur dans une variable "utilisateur" par exemple, fonctionne grâce à la variable partagée, mais faire agir cette variable spontanément au retour sur la fiche principale représente mon problème réel...

    Si une idée vous vient, elle sera la bienvenue!

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Andnotor a proposé le code à utiliser dans le clic d'un bouton de connexion d'utilisateur, mais il doit remplacer celui qui crée la fiche modale, dont la valeur de retour doit être positionnée en même temps que la variable utilisateur lors de la validation.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut MERCI !!
    Merci à Andnotor et Tourlourou !!

    Vous vous êtes mis à deux pour m'expliquer la méthode et j'ai quand même passé encore une heure à faire des essais pour une solution d'une simplicité désarmante.. Bravo!

    En fait, quand la fiche perd la main ou la reprend, le "OnActivate" ne semble pas sollicité, donc pas exploitable...

    En revanche, ce qui aurait dû me frapper (pas trop fort quand même), c'est que dès la demande "showmodal" sur la fiche1, elle se fige immédiatement, sans terminer les intructions sur le bouton "Onclick" qui permet la création de cette fiche2 en "Showmodal".

    Et donc, au retour, on termine en premier par les instructions contenues dans ce "OnClick" du bouton de connexion sur la fiche1.

    Et donc comme me l'a écrit Andnotor, il suffit de mettre à jour au retour juste après le "ShowModal".

    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //------------- J'APPUIE SUR LE BT CONNEXION ------------------------
    procedure TForm8.Bt_ConnexionClick(Sender: TObject);
    begin
    MaForm := TMaForm.create (Self);
    MaForm.ShowModal ;
    lb_élève.caption := utilisateur;
    end;
    C'est simple et efficace, mais je n'arrivais pas à le voir et à comprendre....

    Merci à tous les deux pour avoir remis de l'huile dans mes rouages cérébraux endormis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de variable dans une fenêtre modale
    Par arthuro45 dans le forum jQuery
    Réponses: 5
    Dernier message: 25/03/2011, 08h34
  2. Formulaire dans une fenêtre modale
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 14h25
  3. [CR] Variables partagées
    Par titdiable dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/12/2004, 09h16
  4. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52
  5. Rendre une fenêtre modale non modale
    Par Smortex dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/03/2003, 17h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo