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

Composants VCL Delphi Discussion :

OnChange sur l'IHM


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    frTRYER
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : frTRYER

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 32
    Points
    32
    Par défaut OnChange sur l'IHM
    Salut,

    voilà, je voudrais mettre en place un événement OnChange qui serait généré lors de modifications dans mon IHM sur les TEdit, TCheckBox, TComboBox, ....

    Je pourrais bien sur utiliser les événements OnChange de chaque contrôle mais ça me demanderai de modifier beaucoup de fenêtre existante (environ 50) et je ne trouve pas la solution super élégante.

    Avez vous une idée/solution pour centraliser tout ça ?
    merci d'avance
    FG

  2. #2
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Idée:

    Pour chaque composant que tu cites, faire un descendant qui implémente une interface avec la
    méthode OnDataChange dans un premier temps, ensuite passer tous les .pas et .dfm en renommant les classes par leur
    descendant implémentant l'interface.

    J'essaierai avec un composant, voire l'un après l'autre de façon ittérative sur une copie du projet, d'abord sur une
    fiche, puis sur l'ensemble des fiches.

    Si cette étape fonctionne, le reste devrait suivre.

    EDIT: J'ai donné un nom de propriété, mais il faut raisonner avec des méthodes, c'est une piste.

    TCheckbox n'a pas d'événement OnChange.

  3. #3
    Nouveau membre du Club
    Profil pro
    frTRYER
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : frTRYER

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 32
    Points
    32
    Par défaut
    Pourquoi pas, mais je devrais quand même modifier toutes mes fiches, et je devrais aussi penser à utiliser cette méthode pour les nvlles.

    Je viens de penser à une autre démarche: faire une classe mère commune à toute mes fiches, et tester dans cette classe tous les évènements Windows (avec l'objet TApplicationEvents) pour filtrer ceux qui m'intéressent.
    Il suffit alors de savoir qu'elles événements sont générés par mes contrôles TEdit, TCheckBox, TComboBox, .... lors d'un changement pour appliquer mon traitement.

    Qu'en pensez vous ?

  4. #4
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Ce mécanisme d'interception des changements de valeurs de champs existe pour tous les contrôles orientés données: TDBEdit, TDBCheckBox, etc ... .

    C'est le composant TDatasource qui se charge d'intercepter les événements conçernant il est vrai que les champs d'une table à la fois.

    J'ai jamais utiliser le composant TApplicationEvents.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Tu pourrais aussi t'inspirer de cet article:
    http://en.literateprograms.org/Apply...hi)?oldid=2979

  6. #6
    Nouveau membre du Club
    Profil pro
    frTRYER
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : frTRYER

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 32
    Points
    32
    Par défaut
    merci pour l'article ... je vais l'étudier de près, mais ça semble correspondre à ce que je voudrais faire.

  7. #7
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    En utilisant une interface, on s'affranchit des contraintes liées à l'héritage à savoir, que les composants doivent avoir un ancêtre commun si on veut profiter du polymorphisme.

    A partir du moment ou un composant implémente l'interface, il suffirait de parcourir les composants d'une form et de les rajouter dans une liste s'ils implémentent l'interface. Cette liste serait un attribut d'une classe qui détecterait les modifications faites dans l'IHM.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Pour info, j'avais essayé d'utiliser cette méthode il y a quelques temps mais j'ai buté sur le problème des valeurs numériques, parce qu'il y a toujours des soucis avec les arrondis, du coup les comparaisons sont souvent erronées (même en introduisant une marge d'erreur).

  9. #9
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Si tous tes événements OnChange ont un comportement similaire, et surtout, si tous tes TEdit doivent avoir le même gestionnaire OnChange, alors tu peux surcharger la méthode Change de TEdit.

    Il suffit de créer une nouvelle unité interception à référencer dans tes fiches : par exemple, je viens de coder ça :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    unit interception;
     
    interface
     
    uses
    stdctrls, sysutils, DateUtils, Dialogs, Controls, Graphics, Classes, Windows;
     
    type
      TEdit = class(stdctrls.TEdit)
      private
        fLastText: TCaption;
      public  // les 3 méthodes à surcharger
        procedure Change; override;
        procedure DoExit; override;
        procedure KeyDown(var Key: Word; Shift: TShiftState); override;
      public
        property LastText : TCaption read fLastText write fLastText;
      end;
     
     
     
    implementation
     
    procedure TEdit.DoExit;
    //
    // enregistrement de TEdit.Text lorsque le TEdit perd le focus.
    //
    begin
      LastText := Text;
      inherited;
    end;
     
    procedure TEdit.KeyDown(var Key: Word; Shift: TShiftState);
    //
    // exemple avec la touche ESC : rétablit l'ancienne valeur de TEdit.Text
    //
    begin
      if Key = vk_Escape then
      begin
        Text := LastText;
        SelStart := length(Text);
        modified := true;
        Change;
      end;
     
      inherited;
    end;
     
    procedure TEdit.Change;
    //
    // coloration automatique du texte en rouge si différent de la valeur précédente, sinon en vert !
    //
    begin
      if modified then
      begin
        if text <> LastText then Font.Color := clRed else Font.Color := clGreen;
      end;
     
      inherited;
    end;
     
    end.
    En plaçant le pointeur sur un TEdit en mode code : il te référence Edit1 - interception.TEdit !!
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  10. #10
    Nouveau membre du Club
    Profil pro
    frTRYER
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : frTRYER

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 32
    Points
    32
    Par défaut
    cette solution est pas mal aussi .... en tout cas plus simple à mettre en œuvre.

    merci à tous

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

Discussions similaires

  1. Petite question sur une IHM
    Par beb30 dans le forum MFC
    Réponses: 12
    Dernier message: 10/04/2006, 15h19
  2. [Onchange] sur checkbox selection ds une liste deroulante
    Par maxxou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/01/2006, 00h17
  3. onChange sur Checkbox prob IE vs FireFox
    Par Teufboy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/11/2005, 09h02
  4. Question sur les IHM
    Par Aradesh dans le forum MFC
    Réponses: 10
    Dernier message: 03/03/2005, 15h09
  5. Gestion OnChange sur une sorte d'éditeur de propriétés
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 09h59

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