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 :

Affecter un évènement à un style


Sujet :

Composants FMX Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Une petite question...

    est il possible d'attribuer un événement à un style?
    Il y a la possibilité dans le concepteur de style, mais je n'arrive pas à l'appliquer. L'événement ne s'applique pas, même après un enregistrement, ou après l'application de mon style ...

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Question complexe qui demande des éclaircissements quant au but précis.

    Oui c'est possible par codification.
    en premier lieu il faut créer une procédure de type particulier (un TNotifyEvent) correspondant exactement à la déclaration de l'événement à coder
    par exemple pour un click bouton : procedure clicksurpaneldansstyle(sender : TObject);
    ensuite il faut récupérer le contrôle dans le style (c'est là où il me faudrait des éclaircissements)
    Admettons que le style soit appliquer sur un composant nommé X et que ce style contient un panel (je pense que c'est ça) dont le stylelookupname est 'panel1'
    alors pour affecter un événement de type onclick le code ressemblerai à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPanel(C.FindStyleResource('panel1')).onClick:=clicksurpaneldansstyle;
    j'ai écrit ressemblerai car c'est écrit de mémoire donc avec, très certainement des erreurs j'ai écrit un tutoriel qui utilise cette technique https://serge-girard.developpez.com/...phi/tabbutton/

    Il y a à mon avis au moins une autre façon d'écrire ce code (découverte après le tuto ) plus sûre car gérant la partie erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var APanel : TPanel
     
    if FindStyleRessource<TPanel>('panel1',APanel) then  APanel.Onclick:=clicksurpaneldansstyle;
    idem que pour le code précédent c'est écrit sans filet
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Plutôt complexe!!


    j'ai créer mon événement TNotifyEvent qui s'appelle panClick: procedure panClick(Sender: TObject);

    Et j'ai des panels, auquel j’attribue des styles qui contiennent un TRectangle (pour changer la couleur de bordure).
    Je veux que lorsque je clique sur un panel modifié par un style, cela me déclenche l’événement panclick.

    Je vais essayer d’appliquer les quelques lignes de code de ton tuto!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Alors, je n'arrive pas à compiler mon programme...

    J'ai le droit à une jolie erreur: [dcc32 Erreur] RectTension.pas(298): E2010 Types incompatibles : 'TNotifyEvent' et 'Procedure'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPanel(pan.FindStyleResource('recRed')).OnClick:=TFrame2.panClick;
    Pourtant j'ai bien déclaré ma procédure panClick! Faut il ajouter un mot clé? procedure panClick(Sender: TObject);

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    AMHA
    Il faut juste mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPanel(pan.FindStyleResource('recRed')).OnClick:=TFrame2.panClick;
    de plus la deuxième syntaxe que j'ai proposée est certainement plus juste, le transtypage
    TPanel(pan.FindStyleResource('recRed')) peut planter si la ressource n'est pas trouvée ou si l'objet trouvé n'est pas un TPanel dans ma deuxième proposition ces deux cas sont prévus et donc pas d'erreur
    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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Ca ne fonctionne pas!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if FindStyleResource<TPanel>('rectRed', ???) then  pan.Onclick:=panclick;
    Nom : dd.PNG
Affichages : 129
Taille : 12,4 Ko

    Peux tu me dire ce qu'est le "var AResource: T"?

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    ça ne fonctionne pas!
    Tout dépend comment et où tu codes cela et il faut indiquer le composant qui utilise le style, style qui contiendrai 'recRed' dans sa liste des StyleName

    Peux tu me dire ce qu'est le "var AResource: T"?
    la variable qui va contenir l'objet T dans ton cas un TPanel

    Pour un frame qui contient plusieurs TPanel dont certains ont un Style qui contiennent un élément nommé 'recred' voilà (à peu prés) comment ce serait codé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFrame2.OnCreate(Sender: TObject);  // nécessite une déclaration de Oncreate pour le frame 
    var APanel : TPanel
    begin
    for var  i:=0 to ComponentCount-1 do 
      begin
        if Components[i] is TPanel  then 
          if  Components[i].FindStyleResource<TPanel>('recRed',APanel)) then APanel.Onclick:=panclick;
      end;
    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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    J'ai 2 remarques:

    - "Components[i].FindStyleResource<TPanel>('recRed')" il me dit que ce n'est pas une valeur booléenne, donc je ne peux pas le mettre dans mon if!

    - Et une question: le APanel que tu définis, c'est pour lui attribuer l'événement? Est ce que je ne devrai pas mettre le nom du panel de mon style?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Oups désolé écrit à la va vite
    il fallait lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  Components[i].FindStyleResource<TPanel>('recRed',APanel)) then APanel.Onclick:=panclick;
    le APanel que tu définis, c'est pour lui attribuer l'événement?
    Oui
    Est ce que je ne devrai pas mettre le nom du panel de mon style?
    Non, enfin tout dépend de comment est écrit le style
    prenons cet exemple
    Nom : Capture.PNG
Affichages : 123
Taille : 22,9 Ko
    si je dois mettre un évènement panclick sur le rectangle rouge d'un panel nommé toto ayant un style 'paneldamier' et papanclick sur le vert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var ARect : TRectangle
    begin
    if  Toto[i].FindStyleResource<TRectangle>('RectRed',ARect)) then ARect.Onclick:=panclick;
    if  Toto[i].FindStyleResource<TRectangle>('RectGreen',ARect)) then ARect.Onclick:=panpanclick;
    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

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    merci pour toutes ces précisions!

    je commence à bien comprendre, mais il me reste un problème:
    Nom : Sans titre.png
Affichages : 115
Taille : 39,3 Ko

    D'aprés la doc de delphi cela doit retourner un booléan...

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Déjà il y a une première confusion entre le nom du style et le stylename à moins que les deux soit nommés pareil
    J'eusse aussi préféré un code qu'une image

    ensuite je suis relativement sûr de ma syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function FindStyleResource<T: TFmxObject>(const AStyleLookup: string; var AResource: T): Boolean; overload;
    sous cette forme cela renvoie bien un booleen donc il doit y avoir une erreur dans votre programme (ou dans le style)

    je ne comprends pas ce que vous essayez de faire et ait la forte impression que vous pataugez dans la semoule en mélangeant frame, style panel et objets dans le panel
    proposez moi/nous un programme simple permettant d'avoir une meilleure vision de ce que vous voulez faire
    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

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Je reprend:

    -Je créer ma forme principale qui sera composé de 6 frames, contenant 7 panels, dont 5 m’intéresse ici, car lorsque je clique sur un des 5, il doit m'ouvrir une autre forme!
    -Je rempli mes panel avec des valeurs.

    -Je cherche la valeur min et max entre les 5 panels d'une même frame, et je souhaite afficher mon panel avec des bordure, soit rouge, soit bleu (selon min ou max), grâce à un TRectangle.

    Or lorsque j'applique mon style, il faut que je réattribue mon événement au panel stylisé. D’où ta méthode que j'essaye d'adapter!


    voila le style que j'essaye d'appliquer, un panel pour lui mettre l'événement onclick, et un rectangle pour la bordure!
    Nom : Sans titre.png
Affichages : 118
Taille : 10,7 Ko

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    À mon avis le style ne va pas du tout !
    Un Layout et un Rectangle devrait suffire, pas besoin de Panel
    De même j'ai déjà écrit comment il était possible d'atteindre la propriété d'un élément de style je pense qu'il n'est donc pas la peine d'avoir deux Rectangles différents

    voici un petit projet qui montre comment j'affecte un onclick selon le style, initialise une couleur de bordure (on create) ou la change (colorcombobo1Change)
    Fichiers attachés Fichiers attachés
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Whaou!! merci pour ton aide!! ça marche... presque!

    Donc, un style ne change pas que la forme, il change la nature du composant et donc ses propriétés!
    Lorsque je lui applique le style, je pense qu'il oublie qu'il appartient au frame, car il ne retrouve pas la valeur "branche" de ma frame! Il affiche une valeur aléatoire!

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    C'est plus ou moins pour cela que j'avais écrit qu'il fallait choisir entre Frame et Style.

    Lorsque je lui applique le style, je pense qu'il oublie qu'il appartient au frame
    Non, il peut "oublier" des données de style
    exemple si je mets Panel1.StylesData['rectangle1Style.tag']:=1; pas de soucis , le panel quelques soit le style (PanelRond, PanelCarre) aura toujours le même tag
    si j'écris Panel1.StylesData['zoneclick.tagstring']:=' Hello ';
    alors les deux pour peu de changer mes showmessage en rajoutant ShowMessage( +Panel1.StylesData['ZoneClick.tagstring'].ToString); j'aurais bien le résultat suivi de Hello

    mais si tu changes de style et que les éléments n'ont pas le même nom

    de plus je ne comprends pas comment tu perds "cette branche" , normalement le code est dans la frame, mais je pense que tu utilises mal les frames n'ayant pas d'évènement onCreate je pense que tu utilises l'écran principal pour mettre l'écran du cadre à jour, je me trompe ?
    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

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2018
    Messages : 50
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    de plus je ne comprends pas comment tu perds "cette branche" , normalement le code est dans la frame, mais je pense que tu utilises mal les frames n'ayant pas d'évènement onCreate je pense que tu utilises l'écran principal pour mettre l'écran du cadre à jour, je me trompe ?

    au debut, oui!
    à l'heure actuel, tout les opérations sur les frames se passe sur la page de TFrame! Sauf la création dans la fiche principale!

    et j'utilise un timer dans mes frame pour mettre à jour mes valeurs!!


    Je viens de comprendre!!! Je modifier toute mes frame dans la page principale, et je continue à tout changer après avoir migré mes fonctions au lieu de modifier que mon frame!! (en fait je vois même pas comment ca peux compiler!! )

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/07/2009, 17h00
  2. Affecter un événement à un élément de menu
    Par DiverSIG dans le forum Débuter
    Réponses: 4
    Dernier message: 11/02/2009, 18h14
  3. Réponses: 6
    Dernier message: 05/08/2008, 08h22
  4. Réponses: 16
    Dernier message: 18/01/2007, 17h46
  5. Impossible d'affecter un événement
    Par Costello dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 16h18

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