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 :

Perte de gestionnaire d'événements dans une fenêtre


Sujet :

Composants VCL Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut Perte de gestionnaire d'événements dans une fenêtre
    Bonjour,

    J'arrive actuellement à la fin d'un projet.

    Celui-ci utilise 25 Forms différentes, un module de données et quelques unité supplémentaire.

    Ce logiciel est de type MDI.
    En ce qui concerne les Forms, il existe deux class : TFrmStd et TFicheStd. Elles ne sont jamais intanciées mais dérivées en TFrmA, TFrmB ...

    Dans les classes TfrmStd et TficheStd, plusieurs événements sont implémenté (OnCreate, OnClose, OnShow et OnHide principalement).
    Dans les classes dérivées des précédentes, certains des événements sont surchargés (ex pour OnClose -> inherited OnClose(...)).
    Tout cela c'est fait de manière automatique par Delphi.

    Le problème :
    Depuis peu, lors de la compilation, les liaisons aux événements OnClose et OnShow (dans l'inspecteur d'objets) des forms dérivées et ancêtres disparraissent.
    Du coups, les procédures attachées ne sont jamais exécutés.

    Sauf, si on réétablit les liaisons de charques Forms avant chaque compilation, le logiciel est inutilisable.

    : Savez-vous d'ou viens ce problème ?

    Une réinstallation total de l'ordinateur n'a pas solutionné le problème...

    [Edit] Delphi 7 Entreprise - WinXP [/Edit]

    [Titre modifié par Bloon]
    [Ancien titre : Problème delphi]

  2. #2
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    J'imagine que tu as deja recherché ce qui a pu etre modifié entre le moment 'ça marche' et le moment 'ça marche pas'.
    installation de composants, modifs de code (ordre des uses?), ... ?

    En attendant de trouver, un truc un peu bourrin : dans le onCreate, réaffecter les evenements. Et si le onCreate est "squeezé" par le même phenomene, essayes en surchargeant le créateur.

  3. #3
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par gord's
    J'imagine que tu as deja recherché ce qui a pu etre modifié entre le moment 'ça marche' et le moment 'ça marche pas'.
    installation de composants, modifs de code (ordre des uses?), ... ?
    Rien que le fait d'ouvrir le projet pour le compiler retire toutes les liaisons dans l'inspecteur d'objet.

    Citation Envoyé par gord's
    En attendant de trouver, un truc un peu bourrin : dans le onCreate, réaffecter les evenements. Et si le onCreate est "squeezé" par le même phenomene, essayes en surchargeant le créateur.
    Le gros problème est que la commercialisation doit avoir lieu la semaine prochaine. Et cela m'oblige à passer en revue pas mal de code ...
    J'y ai pensé mais je préfèrerai éviter ...

    merci

  4. #4
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par yobenzen
    Rien que le fait d'ouvrir le projet pour le compiler retire toutes les liaisons dans l'inspecteur d'objet.
    Sans le moindre message ?

    Et si tu compiles en batch ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cd <le répertoire du bpg et des dpr à compiler>
    // on suppose que le chemin vers delphi/bin est dans le path
    MAKE -B -f MesProjets.bpg

  5. #5
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par gord's
    Sans le moindre message ?
    J'aurais bien aimé mais non, rien du tout, c'est à l'exécution de l'exécutable que l'on se rend compte que certaines fonctions ne marche plus. lors du retour sous l'ide, on constate que quelques fonctions ont disparu (sont laissées pour vide) dans l'inspecteur d'objet.

    Citation Envoyé par gord's
    Et si tu compiles en batch ?
    C'est une bonne question.
    Cependant cela empêche toute modification du source.
    Le logiciel a passé une phase de test ou j'avais repéré plusieurs fautes d'orthographe.

    pour l'héritage de mes TFrmStd et TFicheStd, j'ai utilisé Fichier -> Nouveau -> Autres ...
    puis j'ai choisi sur l'onglet de mon projet tour à tour ces deux classes afin d'obtenir des fenetres dérivée.
    Il y a un mois, j'ai du faire une modification dans les deux classes ancêtres, et je pense que le problème à surgit depuis.

    Je ne sais pas si cette façon de faire est à éviter et est responsable de tout ce désordre...

    J'ai encore besoin de rajouter un SplashScreen et deux autres forms responsables des changements de mots de passes.
    C'est pourquoi je souhaite résoudre le problème rapidement afin de remplir cette tache sans risquer de perdre les liaisons des évenements.

  6. #6
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par yobenzen
    Il y a un mois, j'ai du faire une modification dans les deux classes ancêtres, et je pense que le problème à surgit depuis.
    tu as une trace des modifs ? Est-ce que tu utilises un gestionnaire de sources? Ou as-tu une sauvegarde ?

  7. #7
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par gord's
    tu as une trace des modifs ? Est-ce que tu utilises un gestionnaire de sources? Ou as-tu une sauvegarde ?
    une trace des modifs ... heu non, de tête j'ai remplacé des TButton par des TBitBtn (les petites images ca fait toujours mieux), et mes procedures de positionnement de fenêtre par un composant (plsu facile à gérer).
    (D'ailleurs à la suite de cela, j'avais du visualiser mes .dfm hérités pour retirer des objets n'existant plus)

    un gestionnaire de sources ... non, pas du tout (et la est ma grande erreur), le quel me recommandes-tu ? (enfin pour les projets a venir).

    une sauvegarde ... concours de circonstance, mon serveur a décidé de cramer vendredi dernier(innondation) et l'installation étant très fastidieuse, je préfère remettre ca a plus tard (De plus je n'ai toujours pas le matériel de rechange). Quant a savoir si le disque fonctionne encore ...

    Je dirais que c'est pas de chance mais ... c'est ca aussi l'informatique.

  8. #8
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Vérifie que les propriétés OnClose et OnShow sont toujours renseignées dans les classes de base. Car même si tu le redéfinis dans les classes dérivées, c'est dans le .DFM des classes de base que sont stockés les gestionnaires d'événements.

    Fais aussi un p'tit Projet / Construire, ça ne fait jamais de mal

    Bloon

  9. #9
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Même dans les classe de base, les propriétés OnClose, OnShow, et OnHide ont tendance à disparraitre ... curieusement.

    le projet/construire est fais régulièrement...
    Je suis même passé à Construire tous les projets et Compiler tous les projets. mais pareil...

    Je pensais aussi peut être à un problème de composant, il y en a un que j'ai fais pour redimensionner les fenetres automatiquement. Celui-ci est positionné sur les classes ancêtre TFrmStd et TFicheStd.
    Ce composant comporte dans son create :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      FFormOwner := TForm(AOwner);
      FOldFormClose := FFormOwner.OnClose;
      FOldFormShow := FFormOwner.OnShow;
     
      FFormOwner.OnClose := FOnClose;
      FFormOwner.OnShow := FOnShow;
    ainsi que dans ses gestionnaire d'événements :
    FOnClose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      if assigned(FOldFormClose) then FOldFormClose(Sender,Action);
    et FOnShow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      if assigned(FOldFormShow) then FOldFormShow(Sender);
    mais tout cela me semble correcte ...
    les fenetres hérités lanceront leurs gestionnaires qui par le biais d' "hinerited ..." accède à ceux de leur ancetre qui sont en fait dans le composant pour enfin utiliser ceux défnit dans l'ancetre...
    Enfin il me semble.

    [Edit]
    Merci d'avoir changé le titre Bloon...
    désolé, j'ai manqué d'inspiration.
    Mais le sujet parrait maintenant plus pertinent.
    désolé et merci encore
    [/Edit]

  10. #10
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    J'ai suivi l'évolution du fichier .dfm de ma MDIForm (mère).
    Je constate que lorsque je réaffecte le OnClose dans l'inspecteur d'objet, celui-ci s'inscrit bien dans le dfm mais lorsque je ferme le projet et que je le réouvre, alors que la ligne est ecore présente dans le dfm, l'inspecteur d'objet ne semble pas en tenir compte et donc remet à jours le dfm sans la ligne.
    Curieux ...

  11. #11
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Et si tu regardes le DFM après avoir réaffecté la propriété et quitté Delphi ? le fichier est pas en lecture seule par hasard ?

    Bloon

  12. #12
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    non, non ... (le seul attribut activé est Archive)
    En fait, il semblerait que Delphi n'arrive pas à lire le Dfm correctement.
    Mais l'information reste dans le Dfm jusqu'a la sauvegarde de celui-ci.

    par exemple :
    j'ouvre delphi, je charge le projet et je réaffecte le OnClose.
    je sauvegarde et je ferme le projet.
    avec WordPad, j'ouvre le dfm et je trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
      OldCreateOrder = False
      Position = poDefault
      OnClose = FormClose
      OnCreate = FormCreate
      OnPaint = FormPaint
      OnResize = FormResize
      PixelsPerInch = 96
      TextHeight = 13
    ...
    maintenant je réouvre le projet sous delphi.
    Le contenu du dfm n'a pas changé mais l'inspecteur d'objet n'a pas pris en compte le OnClose.
    Si maintenant je sauvegarde.
    alors en visualisant de la meme manière le dfm la ligne a disparru :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
      OldCreateOrder = False
      Position = poDefault
      OnCreate = FormCreate
      OnPaint = FormPaint
      OnResize = FormResize
      PixelsPerInch = 96
      TextHeight = 13
    ...
    bizarre...

  13. #13
    Membre habitué Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Points : 127
    Points
    127
    Par défaut
    certains evenements sont gardés d'autre pas.
    Un lien probable avec le composant que tu utilises pour gérer le redimensionnement.
    l'EDI ne verrait plus les onClose onShow à cause de la manip faite dans le create du composant.
    Une solution peut être : encadrer tout ce traitement par un test sur componentState, pour n'effectuer les modifs d'event qu'au runTime

  14. #14
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par gord's
    l'EDI ne verrait plus les onClose onShow à cause de la manip faite dans le create du composant.
    Une solution peut être : encadrer tout ce traitement par un test sur componentState, pour n'effectuer les modifs d'event qu'au runTime
    Je n'y avais pas pensé, mais c'est surement la solution à mon problème. J'essaie tout de suite.

  15. #15
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    L'idée me parrait vraiment bonne mais ... (encore une surprise) ComponentState est completement vide !
    Du coups le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (csDesigning in componentState) then
    n'est jamais vrai...
    Pourtant mon composant dérive de TComponent ...

    C'est a en devenir fou (ou alors je le suis déjà et c'est pourquoi ca ne marche pas... )

    Je vous tiens informé dès que j'aurais réussit à faire fonctionner ce #(@ç:!&# de ligne de code...

    merci

  16. #16
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Bon je ne sais pas trop si c'est mon portable qui fait des siennes ou quoi ...
    mais après un redémarrage, cela fonctionne impeccable !!!

    Merci gord's !!!
    plus de problème avec les gestionnaires d'événement. de plus Delphi à remis à toutes les fenetres (enfin j'en ai vérifié quelques unes) leurs événements.
    Je ne pouvais pas espérer mieux.
    Merci encore

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

Discussions similaires

  1. [Toutes versions] Intercepter l'évènement Scroll dans une fenêtre?
    Par NVCfrm dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/06/2013, 01h16
  2. [WD15] Gestion des événements clavier dans une fenêtre.
    Par dvdbly dans le forum WinDev
    Réponses: 3
    Dernier message: 20/09/2010, 09h58
  3. Trapper les événements clavier dans une fenêtre
    Par NicoV dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/03/2008, 11h28
  4. Réponses: 0
    Dernier message: 29/08/2007, 18h36
  5. [JDialog] Modification dans une fenêtre
    Par cefabien dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 01/10/2003, 14h18

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