Violation d'adresse avec un TWebBrowser

Signaler
Messages postés
74
Date d'inscription
vendredi 6 juin 2008
Statut
Membre
Dernière intervention
26 février 2012
-
 Utilisateur anonyme -
Salutations,
Voila, de retour avec un problème surlequel je traine depuis ce matin:
L'erreur en debug mode:
Access violation at address 004D3E61 in module 'Launch.exe'. Read of address 00000000'

Voila le code:
function VerifVersion(MemoTest: TMemo; Browser: TWebBrowser): String;
var
  i: Integer;
  der_version: String; //Code inutile pour l'instant
  tableau: array[0..20] of String;
begin
  Browser.Navigate('http://lien.com');
  for i:=0 to 19 do
    tableau[i] := Browser.OleObject.Document.Links.Item(i);
    MemoTest.Lines.Add(Browser.OleObject.Document.Links.Item(i));

  //Encore quelques opérations à faire toujours pas codées
  Result:= der_version; //Code inutile pour l'instant
end;

procedure TMaJForm.DebugButton1Click(Sender: TObject);
begin
  VerifVersion(DebugMemo1, MajBrowser);
end;


Je cherche tout simplement à recupérer des liens d'une page et les mettre dans un tableau (et dans un memo pour voir si ça prend).

Si quelqu'un à une idée, je le remercie d'avance.

4 réponses


Salut,

Ton code ne peut pas fonctionner quoi qu'il arrive. Il admet deja une grosse erreur au niveau de la boucle : Il manque un BEGIN END pour prendre en compte le TMemo

Pour en dire un peu plus sur les erreurs :

1)Déjà ton code beugue dès le départ puisque ton TWebBrowser n'a pas le temps de se charger que la boucle se lance : Bilan gros plantage d'entrée de jeu. Donc première chose à inclure

  Browser.Navigate('http://lien.com');
  while Browser.ReadyState < READYSTATE_INTERACTIVE do
  Application.ProcessMessages;


2)Ensuite ta boucle n'est pas bonne :

for i:=0 to 19 do
    tableau[i] :=...;
    Memo..... ;


3)Troisième erreur : la propriété Link n'est pas un string mais un record donc de toute façon ca n'ira pas. C'est un chouilla plus compliqué que cela

Tout est expliqué ici. Avec même un exemple en prime (Faut il encore chercher).

A toi de te débrouiller maintenant : tu as tout entre les mains pour réussir

Etant dans un bon jour, voila ce que tu cherches à faire (Normalement il n'y a pas d'erreurs) :

{Dans l'absolue on évite de passer des objets en paramètres (Constante, Variable)
dans une procédure/fonction pour des questions d'optimisation. Par exemple à la
place du TMemo on utilisera donc plutot un TStringList dont le contenu sera assigné
ensuite au TMemo. Pour répondre textuellement à ta demande :}

function VerifVersion(MemoTest: TMemo; Browser: TWebBrowser): String;
var
  Index,CountLinks: Integer;
  LinksArray: array of String; //Attention il faut penser à la maintenance de son code
                               //De plus la page peut changer => On ne prédéfinit donc
                               //pas la taille du tableau.
begin
  //On récupère les données dans le TWebBrowser
  Browser.Navigate('http://www.google.com');
  //Tant que le TWebBrowser est en phase de travail
  while Browser.ReadyState < READYSTATE_INTERACTIVE do
  //On défreeze l'application
  Application.ProcessMessages;
  //On définit le nombre de liens présent dans la page récupérée
  CountLinks:=Browser.OleObject.Document.links.length;
  //On définit la taille de son tableau
  SetLength(LinksArray,CountLinks-1);
  //Si la page contient des liens alors
  if CountLinks>0 Then
  //On parcourre le tableau. Pour chaque entrée faire
  for Index:=Low(LinksArray) to High(LinksArray)-1 Do
    Begin
      //On récupère le lien numéro Index et on le place à la position Index dans le tableau
      LinksArray[index]:=Browser.OleObject.Document.links.item(index).href;
      //On rajoute le lien récupéré précédemment dans le MemoTest
      MemoTest.Lines.Add(LinksArray[index]);
    End;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //On appelle lafonction VerifVersion
  VerifVersion(Memo1,WebBrowser1);
end;


Trois remarques si je peux :

1)Un code se commente .

2)Delphi contient un debeugueur : Il faut penser à l'utiliser car

Access violation at address 004D3E61 in module 'Launch.exe'. Read of address 00000000'


Ne veut rien dire : par contre le débeugueur te permet de savoir ou ca plante et donc d'identifier le problème

3)Il faut penser à chercher : On trouve quasiment tout sur la toile. J'avais quasiment jamais utilisé cette usine à gaz qu'est le TWebBrowser. En moins de 10 minutes de recherche j'ai réçu à te pondre un code opérationnel : Donc google google google

Oupssss moi avoir eu un doute sur SetLength et pas eu le courage de vérifier => Boulette de ma part (8 mois sans toucher Delphi ca vous rouille un homme )

function VerifVersion(MemoTest: TMemo; Browser: TWebBrowser): String;
var
  Index,CountLinks: Integer;
  LinksArray: array of String; //Attention il faut penser à la maintenance de son code
                               //De plus la page peut changer => On ne prédéfinit donc
                               //pas la taille du tableau.
begin
  //On récupère les données dans le TWebBrowser
  Browser.Navigate('http://www.google.com');
  //Tant que le TWebBrowser est en phase de travail
  while Browser.ReadyState < READYSTATE_INTERACTIVE do
  //On défreeze l'application
  Application.ProcessMessages;
  //On définit le nombre de liens présent dans la page récupérée
  CountLinks:=Browser.OleObject.Document.links.length;
  //On définit la taille de son tableau
  SetLength(LinksArray,CountLinks);
  //Si la page contient des liens alors
  if CountLinks>0 Then
  //On parcourre le tableau. Pour chaque entrée faire
  for Index:=Low(LinksArray) to High(LinksArray) Do
    Begin
      //On récupère le lien numéro Index et on le place à la position Index dans le tableau
      LinksArray[index]:=Browser.OleObject.Document.links.item(index).href;
      //On rajoute le lien récupéré précédemment dans le MemoTest
      MemoTest.Lines.Add(LinksArray[index]);
    End;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  //On appelle lafonction VerifVersion
  VerifVersion(Memo1,WebBrowser1);
end;