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 :

Changement état TdatasetState


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut Changement état TdatasetState
    Bonjour,

    Je suis sous Delphi XE2 avec une base de données Firebird sous Windows. J'utilise les composants Infopower et IbObject.

    Je réalise un programme. A partir de la form principale (form_A), j'appelle une fenêtre (form_B). form_B est affichée en appuyant sur le button Edit du dbnavigator (composant infopower) présent sur le form_A. Le dbnavigator est lié à un datasource qui est lié à une query (ibobject avec dataset intégré).

    Les différents éléments de la form_B auront un affichage spécifique en fonction du State du dataset.

    Dans l'évènement FormShow du form_B, je mets le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if Dm_ps12.qry_attributions_ps12.State = dsEdit then
        begin
          Self.p_display('edit');
        end
      else if Dm_ps12.qry_attributions_ps12.State = dsInsert then
        begin
          Self.p_display('new');
        end;
    Le problème est que dans cet évènement (FormShow), le state du dataset est toujours en dsbrowse. Lorsque la fenêtre est finalement affichée et active, il est bien en edit. En effet, je peux modifier et valider les données. J'ai également du code sur le state du dataset sur l'évènement OnClose du Form_B et là, il est dans le bon State.

    Je ne comprends pas pourquoi le state du dataset n'est pas encore en Edit sur l'évènement FormShow.

    Auriez-vous une explication de ce changement "tardif" du state ?

    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Je ne connais pas les composants que vous utilisez, mais à mon sens tout ça fonctionne de la manière suivante :
    - l'utilisateur clique sur le bouton Edit
    - le dataset se met en mode dsbrowse (je suppose)
    - entrée dans la fonction liée au clic de ce bouton
    - affichage de form_B
    - passage dans la fonction liée à l'événement onFormShow du form_B
    - sortie de la fonction liée au clic du bouton, et passage du dataset en mode dsedit

    Du coup, si ça fonctionne bien de cette manière, vous devriez pouvoir contourner ça par exemple en lançant un timer de quelques millisecondes (laissez de la marge, testez déjà avec une seconde) dans le onFormShow, qui exécutera votre code vérifiant le statut du dataset à la fin du timer.
    De cette manière, le code s'exécutera après la sortie de la fonction liée au clic du bouton, et le dataset devrait être en mode dsedit.

    Si cette solution fonctionne, tant mieux, mais elle n'est certainement pas très jolie. Mais au moins, nous aurons déjà compris d'où vient le problème .
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Dans le TDBNavigator de la VCL, cela invoque d'abord BeforeAction, puis effectue le l'opération, puis OnClick
    Possible que le Navigator de infopower soit codé différemment "OnClick puis l'opération"

    Sinon, pour différer sans utiliser un Timer, un PostMessage permet d'envoyer un message sans attendre,
    il s'ajoute à la fil des messages et sera traité une fois que l'ensemble des opérations liées au click soit terminé (ou d'un ProcessMessages)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci à MisterCactus et ShaiLeTroll pour les réponses et pistes.

    J'ai mis un Sleep(5000) dans l'évènement FormShow du Form_B mais cela ne change rien. Le dataset est toujours en dsbrowse (vérification en visuel via un label sur le form_b).

    J'ai ajouté un bouton sur le form_b. Je refais le même test que dans le FormShow pour mettre une valeur au label.
    Voici le code utilisé dans les deux cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      if Dm_ps12.qry_attributions_ps12.State = dsEdit then
        begin
          lbl_test.Caption := 'Edit';
        end
      else if Dm_ps12.qry_attributions_ps12.State = dsInsert then
        begin
          lbl_test.Caption := 'Insert';
        end
      else if Dm_ps12.qry_attributions_ps12.State = dsBrowse then
        begin
          lbl_test.Caption := 'Browse';
        end;
    Dès que je clique sur le bouton (première action réalisé après que le form_b soit disponible, le dataset est bien en dsEdit.

    Comme le pense ShaiLeTroll, je pense que c'est un problème de séquençage des étapes. L'évènement onclick est peut-être avant le l'évènement qui change le statut du Dataset.

    Sur le dbnavigator d'infopower, je n'ai rien en terme d'évènement. Par contre, sur les boutons de ce dernier, j'ai un évènement OnUpdateState. Je vais voir à quel moment je passe dedans.

    Je vous tiens informé

    Merci encore pour l'aide et les conseils.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    J'ai mis un Sleep(5000) dans l'évènement FormShow du Form_B mais cela ne change rien.
    Si tout cela fonctionne comme je l'ai expliqué, il est normal que cela ne change rien, car l'instruction Sleep() bloque le thread (ça "freeze" les actions en cours). Donc en gros, ça ne fait que retarder l'inévitable .

    D'où l'intérêt d'utiliser un timer, ou, comme l'a dit ShaiLeTroll, un PostMessage.
    Le timer s'exécute indépendamment des actions en cours sur le thread principal, et le dataset sera en dsedit à la fin de celui-ci.
    Le PostMessage se met dans la file des actions à exécuter, et attend patiemment son tour, ce qui fait que le dataset sera également en dsedit lorsque ce sera à son tour !

    Ceci dit, le PostMessage me paraît bien plus propre.
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    C'est bien un problème de thread.

    J'ai essayé la première solution proposée avec le timer. Effectivement il me change mon label correctement (le dataset est en mode edit après le temps imparti du timer).

    J'ai également essayé la solution PostMessage (plus long pour moi car j'ai découvert le concept). Même chose, le dataset est bien en mode dsedit.

    Comme proposé, postmessage est plus propre car il n'est utilisé que si on l'appelle.

    Pour voir le séquençage, j'ai mis des outputdebugstring dans les évènements suivants : OnClick et OnUpdateSate du bouton edit du dbnavigator. J'en ai également mis un dans la procédure du PostMessage.

    Cela donne "l'ordre de passage" suivant : Onclick, OnupdateState et procedure postmessage.

    pour votre aide


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

Discussions similaires

  1. [Débutant] Détecter changement état d'alimentation PC portable ou tablette Windows
    Par jeremyvb11 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/09/2016, 21h29
  2. [Magento] Event sur changement état de la commande
    Par ejaub dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 04/09/2015, 11h19
  3. Réponses: 3
    Dernier message: 03/06/2013, 17h30
  4. Changement état booléen
    Par Sheizaad dans le forum LabVIEW
    Réponses: 16
    Dernier message: 25/05/2012, 09h35
  5. Réponses: 2
    Dernier message: 01/06/2009, 10h47

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