Ich kaue es dir jetzt vor und nehme für dich den Quelltext auseinander. Das mach ich genau
einmal!
In der
Unit gibt es 4 Funktionen/Prozeduren:
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
procedure TForm3.ListBox1Click(Sender: TObject);
procedure TForm3.Button1Click(Sender: TObject);
function GetURLCacheFile(AURL : String; const AData : TMemoryStream) : Integer;
1.
Beim Erstellen des Formulars wird die Prozedur "FormCreate" aufgerufen. In ihr passiert nichts spektakuläres, außer, dass die TWebBrowser-Komponente, die während der Entwicklung auf das Formular gezogen wurde, eine Webseite über den
.Navigate()-Befehl aufruft:
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://commons.wikimedia.org/w/index.php?title=Special%3ASearch&search=png&go=Go');
end;
Das war ja nicht weiter schwer....
2.
Nachdem die Seite erfolgreich geladen wurde (in der linken Hälfte zu sehen) kannst du auf Button1 klicken. Dabei wird die Prozedur "Button1Click" aufgerufen:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
doc : IHTMLDocument2;
img : OleVariant;
images : IEnumVARIANT;
Fetched : Cardinal;
begin
ListBox1.Clear;
if Supports(WebBrowser1.Document, IHTMLDocument2, doc) and
Supports(doc.images._newEnum, IEnumVARIANT, images) then
begin
images.Reset;
while images.Next(1, img, Fetched) = S_OK do
begin
ListBox1.Items.Add(img.src);
end;
end;
end;
Was macht diese Prozedur? Zuerst wird die Listbox geleert (da vielleicht noch Einträge vom ersten Durchlauf drin stecken). Die if-Abfrage ist etwas spezifischer, da reicht es erstmal, wenn du sie zur Kenntnis nimmst und weißt: "Brauch' ich".
Images: IEnumVARIANT ist ein sogenannter Enumerator. Stell es dir einfach als Array vor, in dem etwas gespeichert ist. Als bildliche Vorstellung für den Anfang reicht das allemal.
Sehr interessant dürfte für dich dieser Teil sein:
Delphi-Quellcode:
while images.Next(1, img, Fetched) = S_OK do
begin
ListBox1.Items.Add(img.src);
end;
Hier wird nämlich solange die
URL des jeweils aktuellen Bildes (
img.src) in die Listbox geschrieben, bis
images.Next(1, img, Fetched) = S_OK nicht mehr gegeben ist. Und das passiert genau dann, wenn alle Bilder, die in dem Dokument über das <img>-Tag eingebunden sind, abgearbeitet sind.
Frage: Wie oft wird die Schleife bei einem Bild wiederholt? Wird sie überhaupt ausgeführt?
3.
Ok, jetzt wurden alle Adressen der Bilder in die Listbox geladen. Was nun? Jetzt zeigt ein Klick auf den Eintrag in der Listbox ein Bild in einem TImage an. Wie wurde das realisiert?
Dazu werden jetzt die beiden letzten Funktionen benötigt. Fangen wir zuerst mit dem
OnClick-Ereignis der Listbox an:
Delphi-Quellcode:
procedure TForm3.ListBox1Click(Sender: TObject);
var
ms : TMemoryStream;
FName : String;
begin
if ListBox1.ItemIndex > -1 then
begin
ms := TMemoryStream.Create;
GetURLCacheFile(ListBox1.Items[ListBox1.ItemIndex], ms);
FName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) +
'test' + ExtractFileExt(ListBox1.Items[ListBox1.ItemIndex]);
ms.SaveToFile(FName);
ms.Free;
Image1.Picture.LoadFromFile(FName);
DeleteFile(FName);
end;
end;
Zu Beginn wird geprüft, ob wir nicht außerhalb der Items geklickt haben. Denn es kann ja auch sein, dass nur ein Bild gefunden wird. Würden wir dann auf die freie weiße Fläche klicken, bekämen wir keinen Eintragsindex zurück, sondern nur die "-1". Dann wird ein
TMemoryStream erstellt. Die nächste Funktion,
GetURLCacheFile, werde ich jetzt nicht auseinanderpflücken. Aber soviel sei gesagt: Der erste Parameter gibt die
URL des Bildes an, der zweite den Memorystream. Die Funktion holt jetzt aus dem Cache des Internet Explorers (denn nichts anderes ist die
TWebBrowser-Komponente) die zu dieser
URL passende Datei (in unserem Falle also das ausgewählte Bild) und speichert sie in den
TMemoryStream. Von dort wird sie als temporäre datei namens "Test" in dem Ordner der Anwendung gespeichert. Anschließend wird die Datei in das
Image1 geladen, und kann nun wieder aus dem Programmordner gelöscht werden.
Du müsstest jetzt also folgendes tun: Den Wert von
Image.src (es handelt sich ja deiner Aussage nach nur um ein Bild) an die Funktion
GetURLCacheFile() übergeben. Dann mit
ms.SaveToFile die Datei temporär speichern und mit
Image1.Picture.LoadFromFile wieder laden. Der nächste Schritt wäre dann, auf die temporäre Datei zu verzichten. Vista mag es zum Beispiel gar nicht, wenn ein Programm im Ordner "Programm" Dateien anlegt. Dafür dürfte die Funktion
Image1.Picture.LoadFromStream interessant sein.
Viel Erfolg beim Probieren.