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 :

Pourquoi Free fonctionne dans un cas et pas dans l'autre


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut Pourquoi Free fonctionne dans un cas et pas dans l'autre
    Bonjour à tous.

    J'ai besoin de comprendre pourquoi Delphi refuse cette procédure
    (cela me génere une erreur de type : Access violation adresse xxxxx....
    si je persiste j'ai une Abstract error)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
      if (Sender is TShape) then TShape(Sender).Free;
    
    // .. suite du programme
    end;
    alors que cette fonctionne marche trés bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFormPrincipal.Supprimer1Click(Sender: TObject);
    begin
     
      PopupMenu1.PopupComponent.free;
    // .. suite du programme
     
    end;
    Dans le 1ere Cas lorsque je double clique sur mon composant je souhaiterais supprimer/liberer le shape sachant qu'il peux y avoir plusieur shapes

    Dans le 2ème Cas je passe par un clique Droit sur le shape et là aucun probleme de suppression/libération du Shape

    Je sais que l'on doit supprimer les composants dans le sens inverse de leur création.
    Mais j'ai besoin de pouvoir supprimer n'importe que de mes composants. Le pire c'est que par le popupmenu je n'ai aucun probleme.

    Avez vous une explication ?

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Moi je dirais que c'est par ce que tu es dans un événement de ton TShape et que tu essayes de le détruire !!

  3. #3
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    petite explication possible :
    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 TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
      if (Sender is TShape) then 
        TShape(Sender).Free; // ici tu liberer le sender
     
    // .. suite du programme
    end;
     
    procedure TShape.DblClick;
    begin
      if Assigned(OnDblClick) then
        OnDblClick(Self); // = appel de ta procedure "ShapeDblClick"
     
      // a partir d'ici, Self est detruit. Donc tout le code qui suivera qui fera reference a self plantera, comme par exemple:
      Self.Invalidate; // self a ete detruit ->pointeur dans l'espace
     
    end;

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    et plus exactement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TControl.WMLButtonDblClk(var Message: TWMLButtonDblClk);
    begin
      SendCancelMode(Self);
      inherited;
      if csCaptureMouse in ControlStyle then MouseCapture := True;
      if csClickEvents in ControlStyle then DblClick;
      DoMouseDown(Message, mbLeft, [ssDouble]);
    end;
    après le DblClick tu as scié la branche sur laquelle tu étais et DoMouseDown se plante

    voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
      if (Sender is TShape) then 
        PostMessage(Handle, WM_USER, Integer(Sender),0); 
    // .. suite du programme
    end;
     
    procedure TFormPrincipal.WMUser(var Msg:TMesage); // message WM_USER
    begin
      TObject(Msg.wParam).Free;
    end;
    en voici une autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
      if (Sender is TShape) then 
        Garbage.Add(Sender);  // Garbage : TObjectList créé dans le OnCreate
    // .. suite du programme
    end;
     
    procedure TFormPrincipal.OnIdle(..); // Application.OnIdle := OnIdle;
    begin
       Garbage.Clear; // ce qui détruit les objets
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Même s'il s'agit d'un PostMessage, je le mettrais à la fin de la procédure dans le cas où un Application.ProcessMessages traînerait dans Suite du programme.

    Qu'en penses-tu Paul ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
    // .. suite du programme
      if (Sender is TShape) then 
        PostMessage(Handle, WM_USER, Integer(Sender),0); 
    end;

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Je comprends mieux mon erreur, je vais tester vos diverses solutions et je reviens pour vous dire.

    Merci encore.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Même s'il s'agit d'un PostMessage, je le mettrais à la fin de la procédure dans le cas où un Application.ProcessMessages traînerait dans Suite du programme.

    Qu'en penses-tu Paul ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    begin
    // .. suite du programme
      if (Sender is TShape) then 
        PostMessage(Handle, WM_USER, Integer(Sender),0); 
    end;
    oui c'est vaguement pour cela que j'ai pensé à l'idée du Garbage

    sinon l'événement MouseUp est peut-être plus indiqué, car il n'y a pas de traitement après coup
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/08/2011, 17h19
  2. pourquoi cela fonctionne dans un cas et pas dans l'autre ?
    Par Attila54 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 01/10/2010, 15h40
  3. Classement qui ne fonctionne pas dans certains cas
    Par Furious68 dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/05/2010, 16h47
  4. Réponses: 1
    Dernier message: 10/12/2009, 22h26
  5. Réponses: 9
    Dernier message: 13/03/2008, 01h34

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