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

Langage Delphi Discussion :

Surcharger une évenement d'un composant contenu dans un TFrame


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut Surcharger une évenement d'un composant contenu dans un TFrame
    Bonjour
    J'ai construit un TFrame (que l'on nommera Frame1) qui embarque un une TcxComboBox (que l'on nommera ComboBox1 , chargement par code des élements de la TcxCombobox)
    Lorsque je change la valeur de la Combobox1 je remplis un propriété publique AXECPT du Frame1 avec la valeur de la ComboBox1 grâce à l'évènement OnChange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TFrameChoixAxeComptable.cxLookupComboBoxAXECPTPropertiesEditValueChanged(Sender: TObject);
    begin
    	if ((Sender as TcxLookupComboBox).Text <> '') then
    	begin
    		AXECPT := (Sender as TcxLookupComboBox).EditValue;
    	end;
    end;
    Tout cela marche nickel

    Au niveau de la fiche qui utilise le Frame1, j'ai besoin de savoir quand l'utilisateur change de valeur de liste déroulante. Je dois récupérer la valeur d ela propriété AXECPT et lancer une recherche dans la base de données en utilsant AXECPT.
    C'est la que je sèche !!!!

    Si vous avez une idée pour solutionner ce petit problème
    par avance merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Salut michel,

    Si les Frames et moi, c'est incompatible, tu dois pouvoir redéfinir le gestionnaire.

    procedure TFrameChoixAxeComptable.cxLookupComboBoxAXECPTPropertiesEditValueChanged(Sender: TObject); est le gestionnaire par défaut dans TFrameChoixAxeComptable
    Mais au niveau de TForm1 qui contient une instance de Frame1 de type TFrameChoixAxeComptable, tu dois pouvoir changer la valeur du OnPropertiesEditValueChanged du cxLookupComboBoxAXECPT
    Dans la DFM, cela va faire un truc avec un inherited qui modifie un fragment de l'objet Frame

    C'est la méthode EDI que je ne pratique jamais, trop de mauvais souvenir, d'ailleurs, on y a travaillé ensemble là où j'ai détesté définitivement les TFrame.

    Tu as une méthode à base de Interface, Supports ... très élégante ou la TForm1 implémente une sorte de SinkEvent pour la TFrame1, disons que c'est un peu extrême, exemple ICI, de Form Dockée.

    Tu as la méthode Event simple, la TFrameChoixAxeComptable expose une property OnAXECPTChange: TNotifyAXECPTChangeEvent ...TNotifyAXECPTChangeEvent = procedure(const Value: string) of object;

    Dans le constructeur de TForm1

    Tu as un truc genre Frame1.OnAXECPTChange := AXECPTChangeEventHandler; déclaré procedure TForm1.AXECPTChangeEventHandler(const Value: string) où tu iras lire (Sender as TcxLookupComboBox).EditValue depuis Form1 et donc avoir accès a tes composants BD (un datamodule peut-être)

    Et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFrameChoixAxeComptable.cxLookupComboBoxAXECPTPropertiesEditValueChanged(Sender: TObject);
    begin
      if Assigned(FOnAXECPTChange) then 
        if Sender is TcxLookupComboBox then
          if TcxLookupComboBox(Sender).Text <> '' then
           FOnAXECPTChange(TcxLookupComboBox(Sender).EditValue);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.AXECPTChangeEventHandler(const Value: string);
    begin
      Query.SQL.Text := 'SELECT Machin FROM TableBidule WHERE AXECPT = :pAXECPT';
      Query.ParamByName('pAXECPT').AsString := Value;
      Query.Open();
     
    end;
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Merci je jette un œil et je te fais un retour

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Bonjour

    La surcharge de l'événement est tout à fait faisable directement depuis la fiche. C'est la solution la plus simple à mettre en place.

    L'autre solution, si la propriété AXECPT est gérée par code (ajout sur la TFrame standard ou une héritée), c'est de lui associer un événement maison. Il suffit pour cela de déclarer une autre propriété de type "procedure (ASender: Object; AIndexDuCombo : integer) of object".

    Dans le onCreate de la fiche, cette propriété est associée à la méthode à appeler lorsque la valeur de AXECPT change.
    Dans le setter de AXECPT, on teste si la propriété est assignée, et si c'est le cas on l'appelle en lui passant par exemple la valeur à traiter.

    L'avantage, c'est que si la TFrame est utilisée à plusieurs endroits ou en plusieurs exemplaires, ça se comporte comme n'importe quel composant avec des événements (sauf qu'il n'est pas visible au niveau du concepteur de fiche, juste dans le code).

    N'hésite pas à regarder la présentation que j'avais faite en 2019 sur l'utilisation de cadre comme composants et en discuter ici, je devais y expliquer ce genre de choses en détail.
    https://serialstreameur.fr/webinaire-20190222.php

  5. #5
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Comment effectuer la surcharge ?

    Citation Envoyé par pprem Voir le message
    Bonjour
    La surcharge de l'événement est tout à fait faisable directement depuis la fiche. C'est la solution la plus simple à mettre en place.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Via l'IDE depuis la Form contenant la Frame, tu peux remplacer l'évènement par défaut par un autre
    Citation Envoyé par ShaiLeTroll Voir le message
    Dans la DFM, cela va faire un truc avec un inherited qui modifie un fragment de l'objet Frame

    par code dans le constructeur, bon je ne sais plus découpage des propriétés DevExpress, ça ressemble à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Frame1.cxLookupComboBoxAXECPT.Properties.OnEditValueChanged := AXECPTChangeEventHandler;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.AXECPTChangeEventHandler(Sender: TObject);
    begin
        if Sender is TcxLookupComboBox then
          if TcxLookupComboBox(Sender).Text <> '' then
          begin
           Query.SQL.Text := 'SELECT Machin FROM TableBidule WHERE AXECPT = :pAXECPT';
           Query.ParamByName('pAXECPT').AsString := TcxLookupComboBox(Sender).EditValue;
           Query.Open();
         end;
     
    end;





    Dans un projet, j'ai viré une Frame justement mais ça me permet d'avoir un exemple avec les anciens sources :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFrameXmlEdit.BceXMLCaretChanged(ASender: TObject; X, Y: Integer);
    begin
     // Toto
    end;
    Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    object FrameXmlEdit: TFrameXmlEdit
      Left = 0
      Top = 0
      Width = 682
      Height = 400
      TabOrder = 0
      object BceXML: TBCEditor
        Left = 0
        Top = 0
        Width = 682
        Height = 400
        ... 
        OnCaretChanged = BceXMLCaretChanged
        ...

    Code dfm : 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
     
    object FrmConfigCmp: TFrmConfigCmp
      Left = 0
      Top = 0
      ... 
                inline FrameXml1: TFrameXmlEdit
                  Left = 0
                  Top = 3
                  Width = 866
                  Height = 286
                  Align = alClient
                  TabOrder = 1
                  ExplicitTop = 3
                  ExplicitWidth = 866
                  ExplicitHeight = 286
                  inherited BceXML: TBCEditor
                    Width = 866
                    Height = 286
                    ExplicitWidth = 866
                    ExplicitHeight = 286
                  end
                end


    Et lorsque l'on redéfini dans la fenêtre contenant la Frame

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFrmConfigCmp.FrameXml2BceXMLCaretChanged(ASender: TObject; X,
      Y: Integer);
    begin
      FrameXml2.BceXMLCaretChanged(ASender, X, Y); // Appel du gestionnaire hérité si nécessaire.
     
    end;
    Code dfm : 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
    end
              inline FrameXml2: TFrameXmlEdit
                Left = 1
                Top = 1
                Width = 864
                Height = 239
                Align = alClient
                TabOrder = 2
                ExplicitLeft = 1
                ExplicitTop = 1
                ExplicitWidth = 864
                ExplicitHeight = 239
                inherited BceXML: TBCEditor
                  Width = 864
                  Height = 239
                  OnCaretChanged = FrameXml2BceXMLCaretChanged
                  ExplicitWidth = 864
                  ExplicitHeight = 239
                end
              end
    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

  7. #7
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Merci ça marche nickel

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

Discussions similaires

  1. [XL-2003] renommer une feuille par la valeur contenue dans une cellule
    Par mimilll dans le forum Excel
    Réponses: 2
    Dernier message: 20/06/2009, 00h06
  2. Accéder à une variable d'un objet contenu dans une collection
    Par derlone dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/04/2009, 16h50
  3. Réponses: 1
    Dernier message: 28/03/2008, 21h37
  4. Réponses: 9
    Dernier message: 30/01/2008, 15h40
  5. Réponses: 2
    Dernier message: 05/10/2007, 23h49

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