[Delphi] TWebBrowser - zapis obrazka na dysk

[Delphi] TWebBrowser - zapis obrazka na dysk
Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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:

Kopiuj
//...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]

Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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.

GL
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 14 lat
  • Postów:54
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


Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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

GL
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 14 lat
  • Postów:54
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ć. :-)


Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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

Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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 ?

GL
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 14 lat
  • Postów:54
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


S1
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Nowy Sącz
  • Postów:46
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 :)

Rygar
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 13 lat
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

S1
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Nowy Sącz
  • Postów:46
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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)