AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gethtml in einem Delphi Thread?

Ein Thema von Prym · begonnen am 27. Jul 2005 · letzter Beitrag vom 28. Jul 2005
Antwort Antwort
Prym

Registriert seit: 20. Feb 2005
108 Beiträge
 
#1

Gethtml in einem Delphi Thread?

  Alt 27. Jul 2005, 23:17
Zitat von huberlix:
Oder, wenn du die Seite als Quelltext haben willst: Das folgende hab ich aus "Easy Delphi Helper" kopiert:

Zitat:
Den Inhalt einer HTML-Datei aus dem Internet downloaden


Wie kann ich eine HTML-Datei aus dem Internet downloaden und in einem Memofeld anzeigen.

Diese Lösung habe ich bei www.delphi3000.com gefunden. Damit die Funktion funktioniert muss noch eine Unit eingebunden werden:

Delphi-Quellcode:
uses WinInet;


Function GetHTML(AUrl: string): string;
var
  databuffer : array[0..4095] of char;
  ResStr : string;
  hSession, hfile, hRequest: hInternet;
  dwindex,dwcodelen,datalen,dwread,dwNumber: cardinal;
  dwcode : array[1..20] of char;
  res : pchar;
  Str : pchar;
begin
  ResStr:='';
  if pos('http://',lowercase(AUrl))=0 then
     AUrl:='http://'+AUrl;
  hSession:=InternetOpen('InetURL:/1.0',
                         INTERNET_OPEN_TYPE_PRECONFIG,
                         nil,
                         nil,
                         0);
  if assigned(hsession) then
  begin
    hfile:=InternetOpenUrl(
           hsession,
           pchar(AUrl),
           nil,
           0,
           INTERNET_FLAG_RELOAD,
           0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile,
                  HTTP_QUERY_STATUS_CODE,
                  @dwcode,
                  dwcodeLen,
                  dwIndex);
    res := pchar(@dwcode);
    dwNumber := sizeof(databuffer)-1;
    if (res ='200') or (res ='302') then
    begin
      while (InternetReadfile(hfile,
                              @databuffer,
                              dwNumber,
                              DwRead)) do
      begin
        if dwRead =0 then
          break;
        databuffer[dwread]:=#0;
        Str := pchar(@databuffer);
        resStr := resStr + Str;
      end;
    end
    else
      ResStr := 'Status:'+res;
    if assigned(hfile) then
      InternetCloseHandle(hfile);
  end;
  InternetCloseHandle(hsession);
  Result := resStr;
end;
So erfolgt der Aufruf:

Delphi-Quellcode:
procedure TForm1.MultilineButton1Click(Sender: TObject);
begin
  Memo1.Text:=GetHTML('http://localhost/index.htm');
end;
--
Homepage: http://www.delphi3000.com
also ich wollte fragen wie man die obige gethtml funktion in einen thread tun kann ich habe da nicht viel ahnung weil zb kann ich in der unit beim thread oder muss ich da die funktion einfach so reinklopen usw?

und kann ich die funktion überhaupt darein tun weil ich schon was mit fehlern wegen irgend welchen sachen die da nicht kompatiobel sind usw?

[edit=alcaeus]Delphi-Tags eingefuegt. Bitte in Zukunft selbst machen, Danke. Mfg, alcaeus[/edit]
Kodex & FAQ :: Index:
2.3.3.1 - Bitte nicht vom Thema abschweifen
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#2

Re: Gethtml in einem Delphi Thread?

  Alt 27. Jul 2005, 23:56
du machst dir das Leben reichlich schwer. Probier es mal damit:
Delphi-Quellcode:
function getHTML(const url: string):string;
var idhttp :Tidhttp;
begin
    idhttp :=Tidhttp.Create(Form1);
    result :=idhttp.Get(url);
    idhttp.Free;
end;
nicht vergessen:
Delphi-Quellcode:
uses IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP;
einfach oben ergänzen *fg*

Warum sollte man das nicht in Threads ausführen können? Probier's doch einfach aus!
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Prym

Registriert seit: 20. Feb 2005
108 Beiträge
 
#3

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 01:05
und wo bekomme ich die komponenten her?
Kodex & FAQ :: Index:
2.3.3.1 - Bitte nicht vom Thema abschweifen
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 01:10
Zitat von Prym:
und wo bekomme ich die komponenten her?
was hast du für eine Delphi-Version? *kopfkratz*
Also eigentlich ist die immer vorinstalliert und bei Delphi direkt dabei. Schau einfach mal unter "Indy clients"
Anosnsten:
http://www.indyproject.org/download/Files/Indy9.html
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 05:07
Zitat von Prym:
also ich wollte fragen wie man die obige gethtml funktion in einen thread tun kann ...
Delphi-Quellcode:
unit UDemo2;

interface

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

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

  TMyThread = class(TThread)
  private
     FMemoHandle : THandle;
     FUrl : String;
  protected
     procedure Execute; override;
  public
    constructor Create(MemoHandle: THandle; AUrl: String);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses WinInet;

Function GetHTML(AUrl: string): string;
var
  databuffer : array[0..4095] of char;
  ResStr : string;
  hSession, hfile, hRequest: hInternet;
  dwindex,dwcodelen,datalen,dwread,dwNumber: cardinal;
  dwcode : array[1..20] of char;
  res : pchar;
  Str : pchar;
begin
  ResStr:='';
  if pos('http://',lowercase(AUrl))=0 then
     AUrl:='http://'+AUrl;
  hSession:=InternetOpen('InetURL:/1.0',
                         INTERNET_OPEN_TYPE_PRECONFIG,
                         nil,
                         nil,
                         0);
  if assigned(hsession) then
  begin
    hfile:=InternetOpenUrl(
           hsession,
           pchar(AUrl),
           nil,
           0,
           INTERNET_FLAG_RELOAD,
           0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile,
                  HTTP_QUERY_STATUS_CODE,
                  @dwcode,
                  dwcodeLen,
                  dwIndex);
    res := pchar(@dwcode);
    dwNumber := sizeof(databuffer)-1;
    if (res ='200') or (res ='302') then
    begin
      while (InternetReadfile(hfile,
                              @databuffer,
                              dwNumber,
                              DwRead)) do
      begin
        if dwRead =0 then
          break;
        databuffer[dwread]:=#0;
        Str := pchar(@databuffer);
        resStr := resStr + Str;
      end;
    end
    else
      ResStr := 'Status:'+res;
    if assigned(hfile) then
      InternetCloseHandle(hfile);
  end;
  InternetCloseHandle(hsession);
  Result := resStr;
end;

constructor TMyThread.Create(MemoHandle: THandle; AUrl: String);
begin
  FMemoHandle := MemoHandle;
  FUrl:= AUrl;
  FreeOnTerminate := True;
  inherited Create(True);
end;

procedure TMyThread.Execute;
begin
  inherited;
  SendMessage(FMemoHandle, WM_SETTEXT, 0, Integer(@GetHTML(FUrl)[1]));
end;

procedure TermThread;
begin
   Form1.Button1.Enabled := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var thGetHTML : TMyThread;
begin
  Button1.Enabled := False;
  thGetHTML := TMyThread.Create(Memo1.Handle, 'www.delphipraxis.net');
  with thGetHTML do begin
     @OnTerminate := @TermThread;
     Suspended := False;
  end;
end;

end.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 05:32
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  inherited;
  SendMessage(FMemoHandle, WM_SETTEXT, 0, Integer(@GetHTML(FUrl)[1]));
end;
Warum so umständlich? Warum übergibst du nicht eine Variable vom Typ TStrings, dann kannst du es in ein TMemo, ein TRichEdit oder in eine TStringListe laden, je nach belieben wie du willst.

Desweiteren greifst du auf ein VCL Kontroll außerhalb einer Synchronize Methode zu, was potentiel gefährlich ist. Nicht umsonst schreibt der Assistent in jede neue TThread Unit:
Delphi-Quellcode:
{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TTest.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 12:23
Moin moin,
Zitat von Luckie:
Desweiteren greifst du auf ein VCL Kontroll außerhalb einer Synchronize Methode zu, was potentiel gefährlich ist.
Aus diesem Grunde habe ich SendMessage genommen, bzw. wo greife ich überhaupt auf die VCL zu?
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 13:21
Ich nehme mal an, dass er wohl ein TMemo aubenutzt. Du benutzt zwar keine VCL methode, um in das Memo zuschreiben, erstmal nicht, aber wie kommt denn das TMemo zu seinen Lines? Doch wohl über eine VCL Methode.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Gethtml in einem Delphi Thread?

  Alt 28. Jul 2005, 13:39
Zitat von Luckie:
aber wie kommt denn das TMemo zu seinen Lines? Doch wohl über eine VCL Methode.
Mag sein, der Text wird dann aber vom Hauptthread in das Memo eingefügt, somit kann es doch
nicht zu Problemen führen...
(Nach meinem Wissensstand ist SendMessage Thread sicher, ich lasse mich aber auch eines besseren belehren)
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz