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 :

Access violation sur FindComponent


Sujet :

Langage Delphi

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut Access violation sur FindComponent
    Bonjour à tous,

    Curieux, mais dans mon projet j'obtiens un access violation lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (TForm(Application.Findcomponent('frmListe')).FindComponent('edSuffixe') as TMemo).Color:=clRed;
    je dis curieux parce que ca marche dans un autre projet vide pour tester la meme instruction .
    Auriez-vous SVP un idée d'ou cela peut provenir ?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    et pourquoi diable n'utilises tu pas simplement frmListe.edSuffixe.Color := clRed, voir edSuffixe.Color := clRed si le contexte le permet ?!

  3. #3
    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 614
    Points
    3 614
    Par défaut
    Les violations d'accès se produisent lorsqu'on tente d'accéder à des espaces mémoires par l'intermédiaire d'objets alors qu'ils ne sont pas initialisés ou ne correspondent pas à ce que l'on veut y prendre.

    Dans ton cas, avec cette ligne, il y a au moins trois raisons pour lesquelles ça peut se produire :
    - Application.Findcomponent('frmListe') peut renvoyer nil, l'utiliser sans vérifier peut générer une violation d'accès si le composant frmListe n'existe pas (ou que ta fiche n'existe pas).
    - ...FindComponent('edSuffixe') peut également retourner nil et planter
    - pour finir si le premier n'est pas un TForm ou que le second n'est pas un TMemo, ça ne passera pas correctement à l'exécution même si le compilateur est susceptible de laisser passer à cause des transtypages.

    Mon conseil pour éviter les mauvaises surprises : découpe ta ligne en plusieurs blocs et teste systématiquement le résultat des affectations. En plus, si tu es sous Delphi 10.3 ou une version ultérieure tu peux le faire en limitant les appels sans trop te prendre la tête sous la forme suivante (non testée, saisie directement ici, donc à tester) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var c1 := Application.Findcomponent('frmListe');
    if assigned(c1) and (c1 is TForm) then begin
      var c2 := (c1 as TForm).FindComponent('edSuffixe');
      if assigned(c2) and (c2 is TMemo) then begin
        (c2 as TMemo).Color := clRed;
      end;
    end;
    Si tu n'es pas sous la 10.3 ou après, il te faut déclarer c1 et c2 en début de procédure/fonction ou code et te contenter des affectations là où je les ai mises ci-dessus.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    un site qui demande d'info perso ça m'énerve
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : un site qui demande d'info perso ça m'énerve

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par freud Voir le message
    Bonjour à tous,

    Curieux, mais dans mon projet j'obtiens un access violation lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (TForm(Application.Findcomponent('frmListe')).FindComponent('edSuffixe') as TMemo).Color:=clRed;
    je dis curieux parce que ca marche dans un autre projet vide pour tester la meme instruction .
    Auriez-vous SVP un idée d'ou cela peut provenir ?
    Merci
    Bonjour,

    La ligne d'instruction en elle-même n'est pas fausse, même si pour ma part j'aurai fait des tests, pour voir d'abord si je récupère bien la form, un autre test pour être certains d'avoir la main sur le memo, avant d'assigner une valeur à une propriété du memo.

    Vous-dites que cela fonctionne sur un autre projet, tout dépend à quel moment cette instruction est appelée.

    Êtes-vous certain que la form recherchée a bien été créée au moment d'appeler votre instruction ?

  5. #5
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Re tout le monde et merci pour vos réponses.

    Citation Envoyé par Paul TOTH
    et pourquoi diable n'utilises tu pas simplement frmListe.edSuffixe.Color := clRed, voir edSuffixe.Color := clRed si le contexte le permet ?!
    Parce que le contexte ne le permet pas etant donnée que je faire ca dans plusieurs fiches avec du code supplémentaire de controle des zones (zone vide, à zéro, le tag etc.). Alors j'ai une routine dans une unité dédiée aux routines. Il suffit de l'appeler en lui passant une table et l'objet form.

    Citation Envoyé par vendomele
    Êtes-vous certain que la form recherchée a bien été créée au moment d'appeler votre instruction ?
    Sur et certain mais comme vous dites tout dépend du moment de l'appel parce que le projet test est vide mais aussi cela dépendra peut-être de la version de delphi j'ai un vieux D7 sous XP pro

    pprem ---->> ton conseil est méthodique mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var c1 := Application.Findcomponent('frmListe');
    renvoi nil, c1 contient nil

    Bref, j'avais penser qu'avec 2 instructions je vous pouvais régler le problème et pour ne pas vous embetter en evitant de trainer la déssus j'ai opter pour un autre code repris depuis mon unité et qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For i:=0 to oForm.ComponentCount-1 do
      Begin
       if oForm.Components[i] Is TMemo then
       Begin
       If (oForm.Components[i] as TMemo ).Name=CompoName then
        Begin
         (oForm.Components[i] as TMemo ).Color:=clRed;
        end;
       end;
      end;
    Merci tout le monde pour vos interventions.

  6. #6
    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 614
    Points
    3 614
    Par défaut
    Citation Envoyé par freud Voir le message
    pprem ---->> ton conseil est méthodique mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var c1 := Application.Findcomponent('frmListe');
    renvoi nil, c1 contient nil
    D'où l'intérêt du test Assigned() qui vérifie s'il est exploitable.

    Citation Envoyé par freud Voir le message
    Bref, j'avais penser qu'avec 2 instructions je vous pouvais régler le problème et pour ne pas vous embetter en evitant de trainer la déssus j'ai opter pour un autre code repris depuis mon unité et qui marche:
    Que tu utilises des boucles "à la main" ou le FindComponent n'oublie pas que c'est quand même chronophage, donc fais tout ce que tu peux pour limiter cette utilisation et surtout ne pas les faire plusieurs fois si tu as trouvé les composants qui t'intéressent.

  7. #7
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Citation Envoyé par pprem
    ....donc fais tout ce que tu peux pour limiter cette utilisation et surtout ne pas les faire plusieurs fois si tu as trouvé les composants qui t'intéressent.
    Je tâcherais, merci pour ton conseil.

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

Discussions similaires

  1. Access violation sur une string
    Par Nekkro dans le forum C++
    Réponses: 11
    Dernier message: 23/01/2012, 08h41
  2. Access violation sur dsnap140.bpl
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2011, 20h06
  3. Réponses: 5
    Dernier message: 27/01/2009, 10h58
  4. Access Violation sur un delete
    Par devroot dans le forum C++
    Réponses: 11
    Dernier message: 29/09/2007, 23h22
  5. Access violation sur un new
    Par cedekasme dans le forum C++Builder
    Réponses: 16
    Dernier message: 23/01/2007, 14h32

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