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 :

Reproduire le code d'un DBNavigator


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut Reproduire le code d'un DBNavigator
    Voilà ,je voudrais reprendre le code d'un DBNavigator concernat les 02 boutons: Valider et Annuler
    Car en utilisant ce qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFFournisseurs.OkBtnClick(Sender: TObject);
      Begin
      DataModule2.TabFrs.Post;
      OkBtn.Enabled:=false;
      AnnulBtn.enabled:=false;
     end;
    ET:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFFournisseurs.AnnulBtnClick(Sender: TObject);
    begin
    DAtaModule2.TabFrs.Cancel;
    OkBtn.Enabled:=false;
    AnnulBtn.enabled:=false;
    end;
    je n'arrive pas à reproduire ce qui suit:

    si je me positionne sur un enregistrement , et que je clique sur le bouton edit du DBNavigator ensuite je passe a un autre enregistrement sans valider, alors les 02 boutons : Valider et annuler doivent impérativement se désactiver, en d'autres termes détecter le déplacement dans la table.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Et bien il faut que tu détectes qu'il y a un déplacement de l'enregistrement courant et si le DataSet est en mode Edit alors tu fais un Cancel dessus.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    si mes souvenirs sont bons il faut gérer les boutons dans l'évènement OnStateChange du Datasource . Plus de détails si besoin apres ma pause déjeuner .

    Bon Appétit
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Et bien il faut que tu détectes qu'il y a un déplacement de l'enregistrement courant et si le DataSet est en mode Edit alors tu fais un Cancel dessus.
    Oui mais comment détecter le déplacement alors????? à travers quel évenement et comment l'implémenter concrétement?????

    Merci++++++++++++++++++++++++++++++++++

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Je pense que le plus simple est de lier tes boutons à des TActions.
    Et c'est dans le Update des actions que tu rends celle-ci active ou non (et donc les boutons).

    Cela donne quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.actPostCancelUpdate(Sender: TObject);
    begin
      TAction(Sender).Enabled := MyQuery.State in [dsInsert, dsEdit];
    end;
    Cet évènement étant lié aux 2 actions Post et Cancel.

    @+ Claudius

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Sinon pour détecter un mouvement tu peux réagir aux évènement BeforeScroll ou AfterScroll de ton DataSet.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    Je pense que le plus simple est de lier tes boutons à des TActions.
    Et c'est dans le Update des actions que tu rends celle-ci active ou non (et donc les boutons).

    Cela donne quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.actPostCancelUpdate(Sender: TObject);
    begin
      TAction(Sender).Enabled := MyQuery.State in [dsInsert, dsEdit];
    end;
    Cet évènement étant lié aux 2 actions Post et Cancel.

    @+ Claudius
    merci ++++ pour cette solution, mais excuse mon ignorance, je ne sais pas comment intégrer cette solution à mes 02 bontons????

  8. #8
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    si mes souvenirs sont bons il faut gérer les boutons dans l'évènement OnStateChange du Datasource . Plus de détails si besoin apres ma pause déjeuner .
    Et cette méthode ne serait elle pas plus adéquate??? surtout que ne n'ai pas su implémenter celle des Taction....???????

    Avec un DBNavigator classique, l'action est immédiate, si aprés avoir cliqué sur le bonton d'édition , on passe à un autre, les deux bontons : VAlider et annuler sont automatiquement désactivé...
    Je voudrais juste reproduire cela
    Merci++++++++++++++++++++++++

  9. #9
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    en fait j'ai essayer de brinoler un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TDataModule2.DataSFrsStateChange(Sender: TObject);
    begin
     if datamodule2.DataSFrs.State in [dsinsert, DsEdit] then
       Begin
        FFournisseurs.OkBtn.Enabled:=true;
        FFournisseurs.AnnulBtn.Enabled:=true;
       end
     Else
       begin
        FFournisseurs.OkBtn.Enabled:=false;
        FFournisseurs.AnnulBtn.Enabled:=false;
       end;
    end;
    Mais au moment de l'exécution, s'affiche une notification d'une exception du déboggeur: Le Projet Lgc.exe a provoqué une classe d'exception: EAccess violation avec le message "Violation d'accès à l'adresse 004F1118 dans le module Lgc.exe Lecture de l'adresse 00000328 ......

    je n'ai pas compris le problème

    Merci++++++++++++++++++

  10. #10
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    sans doute un problème d'ordonnancement de ton code qui fait que peut-être ton code se déclenche avant que ta variable FFournisseurs ne soit valorisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure TDataModule2.DataSFrsStateChange(Sender: TObject);
    begin
      if assigned(FFournisseurs) then
      begin
        if {datamodule2.}
           DataSFrs.State in [dsinsert, DsEdit] then
        Begin
          FFournisseurs.OkBtn.Enabled:=true;
          FFournisseurs.AnnulBtn.Enabled:=true;
        end
        Else
        begin
          FFournisseurs.OkBtn.Enabled:=false;
          FFournisseurs.AnnulBtn.Enabled:=false;
        end;
      end;
    end;
    Il est inutile voire dangereux de faire référence dans une méthode à l'instance de l'objet propriétaire de la méthode.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  11. #11
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    sans doute un problème d'ordonnancement de ton code qui fait que peut-être ton code se déclenche avant que ta variable FFournisseurs ne soit valorisée.
    Code :
    procedure TDataModule2.DataSFrsStateChange(Sender: TObject);
    begin
    if assigned(FFournisseurs) then
    begin
    if {datamodule2.}
    DataSFrs.State in [dsinsert, DsEdit] then
    Begin
    FFournisseurs.OkBtn.Enabled:=true;
    FFournisseurs.AnnulBtn.Enabled:=true;
    end
    Else
    begin
    FFournisseurs.OkBtn.Enabled:=false;
    FFournisseurs.AnnulBtn.Enabled:=false;
    end;
    end;
    end;
    Il est inutile voire dangereux de faire référence dans une méthode à l'instance de l'objet propriétaire de la méthode.
    Oui c'et bon il n'ya plus de message de notification, néanmoins la solution ne marche pas!!!
    Car le problème initial persiste!!! avec la non désactivation des 02 boutons si déplacement il y'a!!!
    Est ce qu'il serait possible de trouver le code source du DBNavigator??? quelque part???,

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Met un point d'arrêt sur le "if DataSFrs.State in [dsinsert, DsEdit] then" pour voir si tu es bien notifié lorsque ton DataSet change d'enregistrement alors qu'il est en édition.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    plus beau et tout aussi efficace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FFournisseurs.OkBtn.Enabled:=(DataSFrs.State in [dsinsert, DsEdit]);
    FFournisseurs.AnnulBtn.Enabled:=(DataSFrs.State in [dsinsert, DsEdit]);
    quant aux sources il suffit de fouiller un peu dans l'unité DBCtrls.Pas il me semble ({delphi}\source\vcl)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    plus beau et tout aussi efficace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FFournisseurs.OkBtn.Enabled:=(DataSFrs.State in [dsinsert, DsEdit]);
    FFournisseurs.AnnulBtn.Enabled:=(DataSFrs.State in [dsinsert, DsEdit]);
    quant aux sources il suffit de fouiller un peu dans l'unité DBCtrls.Pas il me semble ({delphi}\source\vcl)
    Merci pour cette solution je l'ai intégré mais idem, ça ne marche pas!!!
    les boutons ne se désactivent pas si on se déplace à un autre enregistrement autre que celui pointé au moment de cliquer sur le bouton d'édition!!!!

    Je ne comprend pas, ça a l'air d'être à portée de main vu le fonctionnement d'un DBNavigator classique!!!!!

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    As-tu vérifié que ton code est appelé lorsque tu change l'enregistrement courant en mettant un point d'arrêt comme je t'avais dis ?
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  16. #16
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    As-tu vérifié que ton code est appelé lorsque tu change l'enregistrement courant en mettant un point d'arrêt comme je t'avais dis ?
    Oui c'est bon, la condition est vérifiée (Checked)

    Je pense que c'est lors du changement d'état de la table que la procédure ne s'éxécute plus

    Et je ne sais pas!!!

  17. #17
    Invité1
    Invité(e)
    Par défaut une solution
    la solution la plus simple a mon avis c'est de mettre ce code dans l'evenement
    afterscroll de ta table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
    begin
    buttonOK.Enabled:=false;
    buttonCancel.Enabled:=false;
    end;
    afterscroll Se produit quand une application est passée d'un enregistrement de la table à un autre.

    je pense que ça devrait marcher.

    bonne chance

  18. #18
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par samy larson Voir le message
    la solution la plus simple a mon avis c'est de mettre ce code dans l'evenement
    afterscroll de ta table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
    begin
    buttonOK.Enabled:=false;
    buttonCancel.Enabled:=false;
    end;
    afterscroll Se produit quand une application est passée d'un enregistrement de la table à un autre.

    je pense que ça devrait marcher.

    bonne chance

    ça doit être ça effectivement, de toute façon j'ai opté pour autre chose, mais je vais tout de même l'essayer!!!

    Merci+++++++++

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 03h17
  2. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 12h29
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 15h58
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 10h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 18h45

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