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 FMX Delphi Discussion :

FMX - Evenement anonyme


Sujet :

Composants FMX Delphi

  1. #1
    Membre habitué Avatar de oneDev
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2019
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : mars 2019
    Messages : 139
    Points : 160
    Points
    160
    Par défaut FMX - Evenement anonyme
    Bonjour,

    Je suis en train de jouer avec les animations en FMX sur Delphi 10.4.2.
    J'ai le code suivant qui déclanche une animation qui se détruit à la fin.
    Ce code fonctionne très bien.

    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 TForm4.EndAnim(Sender: TObject);
    begin
      TThread.ForceQueue(nil,
        procedure
        begin
          TBitmapListAnimation(Sender).Parent.Free;
        end);
    end;
     
    procedure TForm4.Button1Click(Sender: TObject);
    var
      rec: TRectangle;
      anim: TBitmapListAnimation;
    begin
      // ...
      anim.OnFinish := EndAnim;
      anim.Enabled := True;
    end;
    J'ai voulu simplifié l'écriture en utilisant une procédure anonyme, mais je n'y arrive pas.
    Voici le code modifié :

    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
    procedure TForm4.Button1Click(Sender: TObject);
    var
      rec: TRectangle;
      anim: TBitmapListAnimation;
    begin
      // ...
      anim.OnFinish := procedure(Sender: TObject)
        begin
          TThread.ForceQueue(nil,
            procedure
            begin
              TBitmapListAnimation(Sender).Parent.Free;
            end);
        end;
      anim.Enabled := True;
     
    end;
    J'obtiens alors l'erreur suivante : "[dcc64 Erreur] Main.pas(68): E2010 Types incompatibles : 'TNotifyEvent' et 'Procedure'".

    Savez-vous comment je dois m'y prendre ?

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 230
    Points : 21 572
    Points
    21 572
    Par défaut
    une procedure anonyme comme gestionnaire évènement, il manque le Self implicite comme Data du TMethod
    Cela ne doit pas être compatible comme en C# (les closure ?)

    On voit encore que la suppression de la méthode Release et du Purgatory pour libérer les objets en différent en dehors d'un gestionnaire évènement c'est un peu dommage.


    Si tu veux le généraliser et réutiliser, crée une TBitmapListAnimationAssistant, une sorte de Helper mais sans vraiment l'être avec des méthodes utilitaires
    Un gestionnaire évènement peut être une méthode de classe, juste Self c'est du coup la Méta-Classe et non une instance mais pour tout besoin ce n'est pas un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class procedure TBitmapListAnimationAssistant.EndAnim(Sender: TObject);
    begin
      TThread.ForceQueue(nil,
        procedure
        begin
          TBitmapListAnimation(Sender).Parent.Free;
        end);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    anim.OnFinish := TBitmapListAnimationAssistant.EndAnim;

    Pour le cas du TNotifyEvent qui est assez simple en utilisant une méthode de classe comme gestionnaire évènement, tu peux pousser la logique comme ce TNotifyEventDispatcher dans VCL events with anonymous methods - what do you think about this implementation? qui utilise un objet Bridge qui fourni un TNotifyEvent pour ensuite lui lancer la méthode anonyme c'est une version inversée du code dans l'aide Méthodes anonymes en tant qu'événements.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      anim.OnFinish := TNotifyEventDispatcher.Create(anim,
        procedure (Sender: TObject)
        begin
          TThread.ForceQueue(nil,
          procedure
          begin
            TBitmapListAnimation(Sender).Parent.Free;
          end
        end);
    Le TNotifyEventDispatcher instancié sera libéré par son Onwer soit anim qui est libéré par la méthode du Thread ... un peu tordu, au pire Self comme Owner mais on perd un peu l'idée de réduire l'utilisation de la mémoire



    Si tu es joueur, tu peux jouer avec le TMethod.Code pour lui bidouiller une méthode de classe à partir de la méthode anonyme : Using anonymous methods in method pointers
    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 habitué Avatar de oneDev
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2019
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : mars 2019
    Messages : 139
    Points : 160
    Points
    160
    Par défaut
    Merci beaucoup de ta réponse. Je vais tester tout ça.

Discussions similaires

  1. [VB6] Interception des évènement Copier/Couper/Coller
    Par youtch dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 18/10/2002, 17h09
  2. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46
  3. Evenement Change
    Par PierDIDI dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2002, 10h08
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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