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 :

TWebBrowser dynamique ne conserve pas le bon objet


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut TWebBrowser dynamique ne conserve pas le bon objet
    Bonjour à vous
    voila mon probleme pour lequel j'espere que vous m'apporterez une explication:

    j ai un objet quelconque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Ttruc = class(TObject)
        ID:integer;
        web:Twebbrowser;
        procedure WebDocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
    end;
    un tabeau de cet objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabTruc: array[0..10] of Ttruc
    j'initialise le tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i := 0 to 10 do begin
    tabTruc[i]:=Ttruc.create(nil);
    tabTruc[i].ID:=i;
    end;
    et j'appelle une page dans le webbrowser depuis l'objet 2 par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabtruc[2].web.navigate('www.google.com');
    Voici la question :
    Dans l'evenement onDocumentComplete, l'objet truc change, ce n'est plus le 2, mais le dernier à avoir été crée, soit ici le 10 ...

    un ex de l evenement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure Ttruc.webDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
    showmessage(inttostr(id));
    end;
    Pouvez vous me dire pkoi ??
    J'espere avoir été assez précis.
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Il me semble que lorsque tu crées ton objet TTruc, il faut aussi créer un TWebBrowser, et ne pas oublier de le détruite dans la méthode TTruc.Destroy...

    Ensuite, si tu utilises des objets créés dynamiquement, tu dois aussi créer les évènements, les assigner à des procédures. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabTruc[2].web.OnComplete:=tabTruc[2].webDocumentComplete;
    Mais ça, tu peux le faire dans le OnCreate de ton objet, ça t'évitera de devoir le spécifier dans le code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    web:=TWebBrowser.Create(Self); // <- je ne me souviens pas de la syntaxe exacte
    If (Assigned(web)) Then Begin
      web.OnComplete:=webDocumentComplete;
    End Else ShowMessage('Erreur de création de l''objet web');
    Conseils : Lorsque tu crées des objets dynamiquement, penser à vérifier qu'ils ont bien été créés avant de vouloir les utiliser, par exemple si il n'y a plus assez de mémoire disponible pour pouvoir créer l'objet. Donc attention aussi à la quantité de mémoire utilisée par un objet + son WebBrowser + sa page web, il ne faudrait pas que tu veuilles en créer trop non plus... En tous les cas, tu devras absolument prévoir la gestion d'erreur de mémoire surtout si tu comptes pouvoir charger des pages web volumineuses...
    De retour parmis vous après 10 ans!!

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ne serait il pas mieux de créer et détruire le Webbrowser dans l'objet TTruc ?

    Code Delphi : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Ttruc = class(TObject)
        private
          FId : integer;
          FWeb : TWebBrowser;
          procedure WebDocumentComplete(Sender: TObject;
            const pDisp: IDispatch; var URL: OleVariant);
        public
          property id : integer read FId Write FId;
          property Web : TWebBrowser read FWeb Write FWeb;
          constructor create; override;
          destructor Destroy; override;
    end;
     
    constructor TTruc.Create;
    begin
      inherited Create;
     
      FWeb := TWebBrowser.create(self);
      if Assigned(FWeb ) then
        FWeb.onDocumentComplete := WebDocumentComplete;
    end;
     
    destructor TTruc.destroy;
    begin
      FWeb .free;
     
      inherited;
    end;

    Comme cela on est sur que le WebBrowser est bien celui de l'objet.

    PS: il peut y avoir des erreurs dans le code (un override en trop au niveau du create par exemple)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci pour ces réponses, en fait j'avais deja mis en oeuvre la plupart de vos conseils, mais je n'avais pas jugé necessaire de mettre vraiment tout le code dans le 1er message, et j'aurais peut etre dû (je note pour plus tard).

    Le problème venait en fait d'une erreur de débutant (que je suis).
    dans le create de l'objet truc, je liais le composant web crée dynamiquement avec un autre composant web crée en "design-time" .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabtruc[2].web:=form1.web;
    En faisant celà je pensais juste récuperer les sorties des web dynamiques dans une seule fenetre web.

    Mais comme vous l'avez compris, l'effet n'était pas celui là, du coup tout les web dynamiques étaient une copie de form1.web... je le saurais pour la prochaine fois .

    Merci pour vos réponses !

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

Discussions similaires

  1. getParent() ne retourne pas le bon parent avec JMenuItem
    Par kesiahlex dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 20/04/2006, 15h19
  2. [UBUNTU] Ne conserve pas ma configuration ?
    Par vdumont dans le forum Ubuntu
    Réponses: 1
    Dernier message: 05/04/2006, 02h07
  3. conserver ma liste d'objets sans Pointeur Null ...
    Par comme de bien entendu dans le forum Général Java
    Réponses: 8
    Dernier message: 24/03/2006, 11h55
  4. Réponses: 16
    Dernier message: 30/01/2006, 21h00
  5. [VS2003] Un composant ActiveX ne peut pas créer un objet
    Par kendras dans le forum Framework .NET
    Réponses: 1
    Dernier message: 28/12/2005, 12h39

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