hello,
also, es ist nun halb 3 und ich komm ne mehr weiter...
folgendes problem: per timer hole ich mir von einer website den kompletten quelltext. dies geschieht alle 0,5 sek...
dies ist für mich wichtig, da ständig neue daten darüber kommen.
diese daten sind insofern bereits ausgewertet und lade diese in ein memo.
dies passiert mit diesen 3 proceduren:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var
SList1, SList2 : TStringList;
IpStream: IPersistStreamInit;
AStream: TMemoryStream;
iw: IWebbrowser2;
i : integer;
begin
SList1 := TStringList.Create;
SList2 := TStringList.Create;
iw := GetFrame(1);
AStream := TMemoryStream.Create;
try
IpStream := iw.document as IPersistStreamInit;
if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then
begin
AStream.Seek(0, 0);
SList1.LoadFromStream(AStream);
SList2.Text := HtmlToText(SList1.Text);
Memo1.lines.Clear;
Memo1.Lines.Add(slist2.text);
end;
except
end;
AStream.Free;
SList1.Free;
SList2.Free;
end;
//-------------------------------------------------
function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
var
OleContainer: IOleContainer;
enum: IEnumUnknown;
unk: IUnknown;
Fetched: PLongint;
begin
if Assigned(Webbrowser1.document) then
begin
Fetched := nil;
OleContainer := Webbrowser1.Document as IOleContainer;
OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
Enum.Skip(FrameNo);
Enum.Next(1, Unk, Fetched);
Result := Unk as IWebbrowser2;
end
else
Result := nil;
end;
//-------------------------------------------------
function TForm1.HtmlToText(const _html: string): string;
var WebBrowser: TWebBrowser;
Document: IHtmlDocument2;
Doc: OleVariant;
v: Variant;
Body: IHTMLBodyElement;
TextRange: IHTMLTxtRange;
begin
Result := '';
WebBrowser := TWebBrowser.Create(nil);
webbrowser.Silent := true;
try
Doc := 'about:blank';
WebBrowser.Navigate2(Doc);
Document := WebBrowser.Document as IHtmlDocument2;
if (Assigned(Document)) then
begin
v := VarArrayCreate([0, 0], varVariant);
v[0] := _html;
Document.Write(PSafeArray(TVarData(v).VArray));
Document.Close;
Body := Document.body as IHTMLBodyElement;
TextRange := Body.createTextRange;
Result := TextRange.text;
end;
finally
WebBrowser.Free;
end;
end;
das klappt wunderbar. nur hab ich das problem, das, wenn ich mit der maus über das memo control geh, flackert der mauszeiger. des weiteren verliert mein control, was zur befehlssteuerung dient(ein tedit), sofort den focus, was eine befehlseingabe schlichtweg unmöglich macht.
desweiteren ist es, so scheint es mir, eine recht resourcenfressende angelegenheit. kann ich da noch was rausholen an leistungsfähigkeit bezüglich dieser 3 proceduren?
oder hat jemand eine idee, die mir gar nicht geläufig ist?
mfg matthias