Entwickler-Ecke

Internet / Netzwerk - Quelltext einer html Seite auslesen (ohne Indy?)


musiktiger - Fr 14.03.03 23:39
Titel: Quelltext einer html Seite auslesen (ohne Indy?)
Hallo,

kann mir jemand sagen wie man den Quelltext einer Webseite z.B. in ein Memo einlesen kann, ohne die Indy Komponente IDHttp zu benutzen. Ich hab da was mit NMHttp gefunden. Allerdings weiß ich nicht so ganz wie ich das initialisieren soll. Beim Code

Quelltext
1:
NMHttp1:= TNMHttp.create(owner);                    

und z.B. bei owner parent oder self eingesetzt kommt immer wieder eine Fehlermeldung. So kann ich das gar nicht erst initialisieren und dann damit auch nicht arbeiten.

Ich bin am verzweifeln bitte bitte helft mir! :cry:

Gruß,
musiktiger

Moderiert von user profile iconTino: Code-Tags hinzugefügt.


bis11 - Sa 15.03.03 12:29

Hi und willkommen im Delphi-Forum,

ich habe da den folgenden Link bei den Schweizern entdeckt :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// You need a TMemo, a TButton und a NMHTTP 
// Man braucht ein TMemo, einen TButton und eine TNMHTTP 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  NMHTTP1.Get('www.swissdelphicenter.ch'); 
  memo1.Text := NMHTTP1.Body 
end;


Vielleicht hilft er Dir ja.

Moderiert von user profile iconTino: Code-Bespiel von SwissDelphiCenter eingefügt.


musiktiger - Sa 15.03.03 13:57

Hi bis11,

genau die Seite hatte ich auch gefunden. Als ich das aber ausprobiert hatte kommt bei mir immer folgende Fehlermeldung:
Zitat:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 0044FDCE in module 'Project1.exe'. Read of adress FFFFFFFF'. ...

Dabei habe ich genau die Anweisungen befolgt. Ach ja, die Fehlermeldung tritt dann in folgender Zeile auf:

Quelltext
1:
NMHTTP1.Get('www.delphi-forum.de');                    

Kannst du mir da noch weiterhelfen?

Vielen Dank aber schon mal für die Bemühungen!

Moderiert von user profile iconTino: Code- & Quote-Tags hinzugefügt.


Savage - Sa 15.03.03 14:38

Hi,

schau dir mal den Beitrag an, das könnte dir evtl. helfen
http://www.delphi-forum.de/viewtopic.php?p=37871#37871
(in der Mitte der Beitrag von AndyB)

MfG
Savage[/url]


musiktiger - Mo 17.03.03 23:28

Vielen Dank für den Tip Savage,

aber irgendwie schmiert mir das Programm jetzt immer ab, wenn ich den Text laden will. Vielleicht kann mir jemand sagen, was ich falsch gemacht habe? Ich poste einfach mal den ganzen Quellcode, den ich mir so zusammenkopiert habe:

Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NMHttp, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  NMHttp1: TNMHttp;
begin
NMHttp1 := TNMHttp.Create(nil);
NMHTTP1.Get('www.e-bay.de');
memo1.Text:=NMHttp1.Body;
end;

end.


Moderiert von user profile iconTino: Code-Tags hinzugefügt.
Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Savage - Di 18.03.03 00:10

hmm, ich kann es zwar nicht testen, weil ich die FastNet Kompos net habe, aber probier das mal:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject); 
var 

 NMHttp1: TNMHttp; 

begin 

 NMHttp1 := TNMHttp.Create(self);  {dadurch wird es (glaub ich) zum bestandteil der Form (Form ist eigentümer)}
 NMHTTP1.Get('www.e-bay.de');  
 memo1.Text:=NMHttp1.Body; 
 nmhttp1.free;

end;


MfG
Savage

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Alibi - Di 18.03.03 00:44

Hi,
ich hatte mal vom Auftraggeber aus die Vorgabe, dass das Programm maximal 20kb groß sein soll und auch was aus dem Netz runterladen soll.
Also war ich gezwungen, was komplett ohne Komponenten zu machen. Ich hatte dann eine Funktion gefunden, die ich umschreiben konnte um so diverse Downloadfunktionen zu haben:

Delphi-Quelltext
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 GetHTTPString(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen(INETNAME, INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);

  if Assigned(NetHandle) then 
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then
      { UrlHandle valid? Proceed with download }
    begin
      FillChar(Buffer, SizeOf(Buffer), 0);
      repeat
        Result := Result + Buffer;
        FillChar(Buffer, SizeOf(Buffer), 0);
        InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
      until BytesRead = 0;
      InternetCloseHandle(UrlHandle);
    end
    else
      { UrlHandle is not valid. Raise an exception. }
    InternetCloseHandle(NetHandle);
  end;
end;

und

Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
function DownloadFile(const Url: string;Target:String; sd:string): bool;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024of Char;
  BytesRead: dWord;
  TargetFile:File;
  dwBufLen, dwIndex: DWord;
  Buf: Pointer;
  fsize,GotData,Position:real;
  Temp,Code:Integer;
begin
  ProcessMessages(WINDOW);
  NetHandle := InternetOpen(INETNAME, INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);
  ProcessMessages(WINDOW);
  UpdateWindow(WINDOW);
  if Assigned(NetHandle) then
  begin

    ProcessMessages(WINDOW);
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil0, INTERNET_FLAG_RELOAD, 0);
    ProcessMessages(WINDOW);
    UpdateWindow(WINDOW);

    if Assigned(UrlHandle) then begin
      AssignFile(TargetFile, Target);
      Rewrite(TargetFile, 1);
      dwIndex  := 0;
      dwBufLen:=1024;
      GotData:=0;
      GetMem(Buf, dwBufLen);

      HttpQueryInfo(UrlHandle, HTTP_QUERY_CONTENT_LENGTH,
                              Buf, dwBufLen, dwIndex);
      val(StrPas(Buf),Temp,Code);
      fSize:=Temp;
      SendMessage(Progress, PBM_SETPOS, round(GotData), 0);


      repeat

       If EndDownload then begin
         InternetCloseHandle(UrlHandle);
         InternetCloseHandle(NetHandle);
         CloseFile(TargetFile);
         DeleteFile(PChar(Target));
         result:=false;
         Exit;
       end;

       ProcessMessages(WINDOW);
       InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
       UpdateWindow(WINDOW);
       BlockWrite(TargetFile, Buffer, BytesRead);

       GotData:=GotData+BytesRead;
       Position:=PROGRESSMAX / fsize * GotData;
       SendMessage(Progress, PBM_SETPOS, round(Position), 0);

      until BytesRead = 0;

      CloseFile(TargetFile);
      ShellExecute(hInstance, 'open', PChar(Target), PChar(sd), nil, SW_ShowNormal);

      InternetCloseHandle(UrlHandle);
      result:=true;

    end else begin
      result:=false;
      MessageBox(WINDOW,CONNECTIONERROR,ERRORCAPTION,MB_APPLMODAL OR MB_ICONERROR OR MB_OK);
    end;
      InternetCloseHandle(NetHandle);
  end
  else begin
    MessageBox(WINDOW,CONNECTIONERROR,ERRORCAPTION,MB_APPLMODAL OR MB_ICONERROR OR MB_OK);
    result:=false;
  end;
end;

Du musst dann noch die WinInet Unit einbinden.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


inselberg - Do 20.03.03 01:19

f1: twebbrowser


chritzl - Do 20.03.03 20:53

hallo!

TO/ ALIBI

Mit welchem Delphi hast du den geschrieben?

ich habs vierer. Hab deine src kopiert usw.


Quelltext
1:
NetHandle := InternetOpen(INETNAME, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);                    


bei mir läufts net... Fehlermeldung is:
"INETNAME" sei undefiniert...


bis11 - Do 20.03.03 22:28

@musiktiger

Also das Beispiel von den Schweizern funktioniert bei mir mit den FastNet-Kompos. Der einzigste Hacken dabei ist, das Du nocch in den String bei http://www.swissdelphicenter.ch noch das http:// eintragen musst. Dann funktioniert es.


Alibi - Fr 21.03.03 00:34

Hast du WinInet in den Uses stehen? Die Funktionen machen keine Probleme hier, Delphi 6.


chritzl - Fr 21.03.03 13:57

Yo, "WinInet" steht... vielleicht liegts an der Version...?!?!

..wird zeit für was aktuelleres!


musiktiger - Sa 22.03.03 13:12

Vielen Dank euch allen!

@savage (vom 17.03.)
genau das habe ich ausprobiert, aber das Programm scheint irgendwie abzuschmieren. Ich kann dann zwar nochmal den Button drücken, aber ich kann das Programm nicht mal mehr schließen geschweige denn, dass irgendein Quellcode angezeigt wird.

@bis11
leider funzt es auch nicht mit 'http://' davor.
Wegen FastNet: Eigentlich dürfte es doch ausreichen, wenn in NMHttp im uses stehen habe, oder?


musiktiger - Sa 22.03.03 13:18

Oh man, ich bin auch ganz schön blöd! :oops:
Ich war immer zu ungeduldig und habe nicht lange genug gewartet, dabei klappt es doch wunderbar wenn man ein bissel Gedult hat. :D

Also vielen Dank nochmal,
vor allem bis11 und savage!

Gruß,
musiktiger