[Delphi] TWebBrowser - zapis obrazka na dysk

0

Witam w Nowym Roku 2008 ;-P

Prosiłbym bardzo o pomoc i odpowiedź na kilka moich pytań dotyczących WebBrowser'a, a dokładniej OleOject. Szukałem na ten temat w sieci i nie mogę nic konkretnego znaleźć...

Problem polega na tym, że chciałbym, aby moja przeglądarka umożliwiała zapisywanie obrazków (JPG, GIF, itp.) znajdujących się na stronie WWW. Coś na wzór przeglądarki np. FireFox, w której po kliknięciu prawym klawiszem myszki na dowolnym obiekcie graficznym pojawia się PopUp Menu z którego można wybrać opcję Zapisz obrazek lub podobną. W związku z tym mam kilka pytań:

  1. Jak odwołać się do poszczególnego elementu graficznego na stronie, np. po jego kliknięciu prawym klawiszem myszy ?

  2. Jak pobrać adres obrazka znajdującego się na stronie WWW po kliknięciu na nim prawym klawiszem myszy ?

  3. Czy znacie może jakąś stronę z pełnym opisem dostępnych funckji dla OleObject ?

Próbowałem zmodyfikować poniższy kod tak, żeby po kliknięciu na obiekcie graficznym, obrazek został zapisany na dysk, ale niestety nie mogę sobie z tym poradzić. Oto ten kod:

//...save all images of a TWebbrowser?

uses
  UrlMon;

function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
  try
    Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  k, p: Integer;
  Source, dest, ext: string;
begin
  for k := 0 to WebBrowser1.OleObject.Document.Images.Length - 1 do
  begin
    Source := WebBrowser1.OleObject.Document.Images.Item(k).Src;
    p := LastDelimiter('.', Source);
    ext := UpperCase(Copy(Source, p + 1, Length(Source)));
    if (ext = 'GIF') or (ext = 'JPG') then
    begin
      p  := LastDelimiter('/', Source);
      dest := ExtractFilePath(ParamStr(0)) + Copy(Source, p + 1,
        Length(Source));
      DownloadFile(Source, dest);
    end;
  end;
end;

Za wszelką pomoc bardzo dziękuję
[browar]

0

Ludzie!
Nie wierzę, żeby nikt nie wiedział jak to zrobić. Nie chodzi mi tu o napisanie gotowego programu, ale na podaniu instrukcji, która odwołuje się do elementu (na stronie WWW) wybranego myszką (np. przez kliknięcie lewym bądź prawym klawiszem myszy)... Proszę o pomoc.

0

Ale ten temat jest bez sensu. ;-( Przeciez jak klikniesz na w webbrowserze na obrazek to sie pojawia menu kontekstowe. I co w nim jest? ZAPISZ OBRAZ JAKO :-D

P.S. Tu jest coś o oleobcject

http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_oleobject.htm

0

Gladiatus, nie tak do końca bez sensu, bo okazuje się, że nie zawsze to działa. Otóż, np. testowałem to na serwisie www.gry-online.pl i niektórych adresów obrazków po prostu nie idzie skopiować. Albo w menu kontekstowym nie pojawia się możliwość zapisania adresu (czy też obrazka na dysk), albo wyskakuje okienko: "Please don't steal or link the images. Thank you.". Dzieje się tak w IE natomiast w FireFox'ie nie ma tego problemu. A jak wiesz komponent TWebBrowser bazuje na nieszczęsnym IE. ;p
Jeśli nie wierzysz, że tak jest, to sam sprawdź... ;)

No ale ślicznie dziękuję, że chociaż Ty mi próbujesz pomóc. Jak do tej pory nikt nie znalazł się odważny do podania choćby namiastki informacji... :P
Za informacje o OleObject też BigThx! Mam nadzieję, że mi pomogą w rozwiązaniu problemu, a jeśli nie... to dalej będę męczył... :)

Pozdrawiam
RYGAR

0

U mnie w WebBrowser nie ma takiego problemu. Próbowałem ściągnąć kilka obrazków i wszystko działa. może coś jest nie tak, bo jest taki skryptcik co zdaje się blokuje możliwość zapisywania obrazków. Gdzieś coś takiego widziałem. A jak już znajdziesz sposób jak to zrobić to daj znać. Też się chętnie dowiem jak to zrobić. :-)

0

A to mnie teraz zaskoczyłeś.. Nie przypominam sobie, żebym instalował jakieś sktypty pod IE (tym bardziej, że korzystam z FireFox'a) ;)
Tajemnicza to sprawa, bo gdy klikam na małym obrazku ze strony www.gry-online.pl (tym obok ocen), to mi wyskakuje zawsze wcześniej wspomniane okienko i nic nie można zrobić. Natomiast, gdy kliknę na jakimś większym screen'ie z gry, to wyskakuje mi menu kontekstowe i mam możliwość zapisania obrazka na dysk, ale nie ma możliwości skopiowania adresu do tego obrazka... :P
Choćby przykładowo mały kwadratowy obrazeczek ze strony: http://www.gry-online.pl/S024.asp?ID=712

W zasadzie nie napisałem, że zależy mi na zrobieniu własnego menu kontekstowego wywoływanego po kliknięciu prawym klawiszem myszy, w którym byłyby dostępne dwie funkcje: ZAPISZ OBRAZEK... oraz SKOPIUJ ADRES OBRAZKA... Tylko to mnie interesuje :)

Oczywiście jak uda mi się ten problemik rozwiązać (chociaż nie bardzo w to wierzę :P) to napiszę tu o tym...

Czekam również na inne wskazówki... xD

Pozdrowionka

0

Nieeee, no nie mogę sobie z tym wszystkim poradzić... ;-( Pomocy [!!!]
Nie wiem, czy to jest, aż takie trudne do zaprogramowania?

Wyjaśnijcie mi proszę, jak pobrać index wybranego obrazka ? Szukałem chyba już wszędzie na ten temat i nie mogę nic znaleźć.
Chodzi mi tu o zmodyfikowanie tej linijki: WebBrowser1.OleObject.Document.Images.Item(k).Src; tak, aby zamiast zmiennej k była instrukcja zwracająca index zaznaczonego obrazka na stronie WWW. Powyższa instrukcja działa, gdy np. w miejsce zmiennej podamy wartość 0, ale wówczas program zwraca adres pierwszego dostępnego na stronie obrazka. A mi przecież zależy na tym, żeby program zwracał adres wybranego przeze mnie obrazka... (np. po kliknięciu na obrazku).
Błagam, pomóżcie... [???]

PS. A może istnieje inna metoda (prostsza), która zwraca adres zaznaczonego obiektu na stronie ?

0

Nie wiem czy cie zadowole, ale mam coś dla CIebie. Nie jest na webbrowserze ale komponent TFrameViewer ma opcje View image :) klikasz na obrazek, dajesz tą opcję i.... w okienku pojawia sie obrazek :D

0

Witam
Nie wiem czy dobrze cię zrozumiałem.
pewnego czasu oprogramowywałem program na WebBrowserze
ma to ogromne możliwości, robiłem tam coś takiego że po kliknięciu na dany obrazek, zwracało mi jego parametry, poedzimy class, id, href, innerhtml czy InnerText

niestety czytam to na szybko i teraz już mi się nie chce tego szukać jak to szło, a od tego czasu już mineła chwile wiec nie pamietam co i jak, ale nie ma problemu np. pokazać parametry obiektu nad ktorym mamy myszkę czy też na który klikliśmy, nie da się tego poblokować być może przeglądarki różnie to wyłapują ale w źrodle i parserze zawsze jest jak być powinno, jak byś chciał, to poszukam mniejwiecej do czego trzeba się odwołać i w jaki sposób, w innym języku niż delphi ale temat powinien cię nakierować i nie powinno być problemu z odnaleźieniem tego :)

No Wiec Jeśli ci o to chodzi to napisz, a odszukam kod i w jakiś sposób ci to objaśnie.

Pozdrawiam

P.S - Błędy ort. popełniłem specjalnie by się wam trudniej czytało :)

0

Właściwie, to nie jestem pewien, czy o to mi chodzi... (nie znam się na programowaniu tak dobrze) :-) Aczkolwiek, sądząc po wymienionych przez Ciebie parametrach które są zwracane przez funkcję oraz to, że wśród nich znajduje się href - jest duże prawdopodobieństwo, że właśnie o to mi chodzi... ;-P
Bo jak wiadomo href jest powiązany z odnośnikiem do strony lub adresem jakiegoś elementu graficznego, a właśnie mi o to chodzi, żebym po kliknięciu na elemencie graficznym otrzymał informację o jego faktycznym adresie... :d Innymi słowy - znając jego adres będę mógł zachować taki obrazek na dysku... ;]
Tak więc, byłbym niezmiernie wdzięczny, gdybyś jednak zechciał poszukać tych informacji i - o ile to możliwe - podał kod w Delphi... [wstyd]

Pozdrawiam
RYGAR

0

no wiec tak musisz zkożystać z biblioteki dll o nazwie mshtml.dll lub juz samego tlb o tej samej nazwie, powinien standardowo znajowac sie w katalogu systemowym system32<b>mshtml.tlb</b>

jeśli masz już cały dokument browsera
to deklarujesz sobie powiedzmy zmienna doc jako klasa HTMLDocument ktora znajduje sie w tej dllce.
i po zadeklarowaniu przypisujesz do tej klasy obiekt WebBrowser1.Document
później masz dostep do wszystkich tagów html
jeśli chcesz zczytać wszystkie obrazki z strony to kożystasz z klasy HTMLImg

przeszukujesz obiekt petla each lub jak wolisz, doc.All.tags("IMG")
i szukasz w nim tagu HTMLImg
po znalezieniu masz do wszystkiego dostep, i do href i do innych parametrów, technicznie to nie jest trudna sprawa, ale nie znam delphi,
na tej zasadzie możesz zrobić sobie powiedzmy uchwyty do wszystkich obrazków i jeśli klikniesz w jakiś to coś się wykona zamierzonego, ale jeśli zależy ci tylko na obrazkach, to po prostu wyszukaj przeglądarki pracujące w tle niestety IE i pobierz z nich wszystkie tagi img i masz wszystko czego potrzebujesz, lub z wykożystaniem swojego proramu przeszukaj sekcje document i masz dostep do wszystkich danych
PAMIETAJ natomiast by przypisywać Webbrowser.document do Klasy HTMLDocument dopiero jak skończy załadowywanie kontrolka czyli jeśli osiągnie WebBrowser1.Busy == False;

Przykładu ci nie napisze w Delphi
ale może koledzy z kojarzą o co mi chodzi i znają delphi to ci dadzą przykład, bo ja niestety w tym języku nie potrafię ci napisać.

jak by coś to pisz na pw, jak byś miał jakieś pytania.
Poniżej przedstawiam stronę, z przykładem w Delphi do wyszukiwania linków podobnie jest z obrazkami, na pewno ci ten kod wiele wytłumaczy.
http://dn.codegear.com/article/26574

1 użytkowników online, w tym zalogowanych: 0, gości: 1