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

Delphi Discussion :

Comment récupérer la sélection dans une page web externe ?


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 45
    Points : 41
    Points
    41
    Par défaut Comment récupérer la sélection dans une page web externe ?
    Bonjour à tous.

    Je recherche comment récupérer la sélection (le texte sélectionné) dans une page web externe à mon application (laquelle s'éxécute en tache de fond).
    En sachant que je connais :
    1- La classe du contrôle ("Internet Explorer_Server").
    2- Le Handle du contrôle.

    Quel(s) message(s) puis-je lui envoyer pour récupérer la sélection (sous forme de string ou de TStringList) ?

    Toute aide sera la bienvenue..
    D'avance merci.
    Amicalement,
    Claude.

    Ps: J'aurais la même question pour les documents Word, Pdf, et Delphi :-).

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Suggestion : Le texte étant sélectionné sur la page manuellement à la souris, poursuivre avec la combinaison de touches-clavier Ctrl+C qui envoie la sélection dans le presse-papier puis récupérer le contenu du presse-papier d'une manière ou d'une autre.

    Exemple 1 : Après sélection et envoi dans le presse-papier je réactive Word et avec Ctrl+V ou le bouton correspondant je colle le pp dans Word ce qui permet de récupérer le texte ET les images.

    Exemple 2 : Après sélection et envoi dans le presse-papier je réactive mon appli Delphi et avec Ctrl+V ou un bouton(*) correspondant je colle le pp dans un TRichEdit et cela me récupère le texte sans les images mais au format RTF ce qui est bigrement mieux qu'une string ou une TStringList.

    (*): avec RichEdit1.PasteFromClipboard;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 45
    Points : 41
    Points
    41
    Par défaut Merci...
    Merci de ta réponse, Gilbert Geyer.
    Utiliser le presse-papier est une chose à laquelle j'avais pensé, mais cela impliquait de créer un ersatz de Clipboard afin de mettre temporairement son contenu avant de la restituer une fois le traitement des informations terminé (et ce quelque soient les données qui y seraient contenues).
    De plus, mon application ne comporte pas de Forme ou de composants, seulement des fonctions de comparaisons de chaines ou de listes de chaines.
    Je pense qu'on doit pouvoir utiliser une API afin de demander au contrôle focalisé le texte sélectionné en cours (comme doit le faire Windows JUSTE AVANT de la transférer dans le presse-papier).
    Si quelqu'un a déjà travaillé sur ce problème, toute indication serait la bienvenue.
    Amicalement,
    Claude.

  4. #4
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Apparement si je comprend bien tu veux récupérer la selection faite sur une page web d'un internet explorer.

    Je trouve ton problème interessant et c'est pourquoi je t'expose mon approche.

    résumé des étapes (3) de mon approche:
    Dans un premier temps, je récupère toutes les fenêtres dispo et je m'interesse au fenêtre Internet Explorer.
    une fois trouvée je récupère son document et je renvois la selection dans son document si il y en a une et on l'affiche dans un memo

    Citation Envoyé par ARDILLER
    ...mon application (laquelle s'éxécute en tache de fond)
    pour simplifier on va coller un simple TTimer plutot qu'un thread


    Allez go: nouvelle application avec un timer et un memo

    on aura besoin des unités SHDocVw et MSHTML dans notre clause uses.

    1) on doit récupérer les fenetres d'IE.

    pour ca on declare une variable du type IShellWindow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TForm1 = class(TForm)
     (...)
      private
        SW: IShellWindows;
    et evidement on l'instancie de le create de la form et on la vire dans le destroy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SW := CoShellWindows.Create;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      SW := nil;
    end;

    a ce stade on a toutes les fenetre du Shell tanpis on prendra la 1ere IE trouve dans le timer

    2) une fois que l'on a la fenetre on recupere la selection via son document html
    et on renvoi cette selectin dans une stringlist.

    c'est précisement l'objet de cette fonction

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    function TForm1.RecupSelection(const Disp: IDispatch): TStrings;
    var
      WB: IWebBrowser2;
      lHtml: IHTMLDocument2;
      lSel: IHTMLSelectionObject;
      lRange: IHTMLTxtRange;
    begin
      Result := TStringList.Create;
      if Disp <> nil then
      begin
        if not Supports(Disp, IWebBrowser2) then Exit;
        WB := Disp as IWebBrowser2;
     
        if not Supports(WB.Document, IHTMLDocument2) then Exit;
        lHtml := WB.Document as IHTMLDocument2;
     
        lSel := lHtml.selection;
     
        if lSel <> nil then
        begin
          if lSel.type_ = 'Text' then
          begin
            lRange := lSel.createRange as IHTMLTxtRange;
            if (lRange <> nil) and (Length(Trim(LRange.text)) > 0) then
              Result.Text := LRange.text;
          end;
        end;
      end;
    end;
    elle est assez explicite je pense.

    3) ok c'est cool maintenant on va afficher la selection en temps reel sur le memo
    avec un rafraichissement à chaque seconde du timer

    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
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i: integer;
      WB: IWebBrowser2;
    begin
      WB := nil;
      for i := 0 to SW.Count - 1 do
      begin
        if Supports(SW.Item(i), IWebBrowser2) then
        begin
          WB := SW.Item(i) as IWebBrowser2;
          mmoSelect.Lines := RecupSelection(WB);
        end;
      end;
    end;
    en fait ici on regarde toutes les fenetres et on prend la selection de la 1ere IE
    on recupere la selection et on l'affiche dans memo.

    voila c'est fini :mouarf:

    pour tester: lancer le prog, avec une instance d'ie et faite une selection sur ie et comme par magie :mouarf: la selection apparait dans le memo

    amélioration possible:
    coller la liste des fenetre du shell dans une listbox afin de selection celle que l'on veut traiter. et pleins d'autres encore ;)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 45
    Points : 41
    Points
    41
    Par défaut test du code de Kaféine...
    Merci, Kaféine.
    Je viens de tester ton code, et j'obtiens le message d'erreur suivant à la création de la Form (ligne: "SW := CoShellWindows.Create;"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CoInitialize n'a pas été appelé, ClassID: {...Nombres ici...}.
    Saurais-tu d'où cela pourrait venir ?
    Coinitialize n'est pas dans les untiés courantes d'un projet, ni dans les deux qui ont été rajoutées.
    Amicalement,
    Claude.

    EDITION: Solution trouvée, il suffit d'ajouter l'Unité "ActiveX" dans la clause Uses de l'unité.
    Soultion trouvée ici:

    http://www.developpez.com/delphi/faq/?page=ado

    Le code de Kaféine fonctionne parfaitement.
    Merci à toi, Kaféine, et à vous tous pour votre interêt.
    Amicalement,
    Claude.

  6. #6
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Bizarre j'ai pas ce probleme

    ajoute dans les uses : Activex

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    initialization
      CoInitialize(nil);

  7. #7
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    ok cool

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 45
    Points : 41
    Points
    41
    Par défaut Solutionné ...
    Merci encore et timing parfait ... :-).
    Amicalement,
    Claude.

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

Discussions similaires

  1. [XL-2010] VBA : comment récupérer valeur contenue dans une page web?
    Par pegase33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2012, 00h39
  2. Récupérer des valeurs dans une page WEB
    Par megamario dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2011, 14h05
  3. [RegEx] Récupérer des données dans une page Web
    Par Pragmateek dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2006, 19h44
  4. [Sécurité] comment récupérer le subject dans une page jsp?
    Par lalakers dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 13/07/2005, 11h42

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