CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - WebBrowser z zasobów (Builder XE)

WebBrowser z zasobów (Builder XE)

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

WebBrowser z zasobów (Builder XE)

Nowy postprzez Mironas » czwartek, 30 stycznia 2014, 19:01

Wczytanie treści HTML z zasobów do WebBrowsera.
Przykład z porady Wczytywanie do kontrolki TCppWebBrowser dokumentów z zasobów świetnie działa dla BCB 6, ale pod C++Builder XE już nie.

Konkretnie to
psi->Load(...);
Oczekuje podania strumienia IStream a nie TStreamAdapter.

Czy ktoś wie jak przerobić ten przykład dla XE?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Cyfrowy Baron » czwartek, 30 stycznia 2014, 19:42

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <memory>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  CppWebBrowser1->Navigate(L"about꞉blank"); /* przepisz ten fragment nie kopiuj to co wygląda jak dwukropek nie jest w rzeczywistości dwukropkiem, musiałem tak zrobić bo się mi źle kod parsował */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 HRSRC rsrc = FindResource(HInstance, L"ID_DOC", RT_HTML);
 if(!rsrc)
 {
  Application->MessageBox(L"Nie można przeprowadzić operacji. Taki zasób nie istnieje!", L"BŁĄD!", MB_OK | MB_ICONSTOP);
  return;
 }

 DWORD Size = SizeofResource(HInstance, rsrc);
 HGLOBAL MemoryHandle = LoadResource(HInstance, rsrc);

 if(MemoryHandle == NULL) return;

 BYTE *MemPtr = (BYTE *)LockResource(MemoryHandle);

 TMemoryStream *stream = new TMemoryStream;
 stream->Write(MemPtr, Size);
 stream->Position = 0;


 IPersistStreamInit *psi;
 stream->Seek(0, 0);


  _di_IStream sa(*(new TStreamAdapter(stream, soReference)));


 if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit, (void **)&psi)))
        psi->Load(sa);

 delete stream;
}
//---------------------------------------------------------------------------


Teraz zadziała!

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Mironas
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Mironas » piątek, 31 stycznia 2014, 11:11

Wielkie dzięki!

Przy okazji (dla potomnych) wstawiam lekko zmodyfikowany kod wczytujący dane HTML z TStrings a nie z zasobów programu (Resources):
KOD cpp:     UKRYJ  
void TForm1::WczytajHTML(TStrings* danehtml)
{
  // Wczytanie danych HTML z TStrings do WebBrowser1
  TMemoryStream* stream = new TMemoryStream;
  danehtml->SaveToStream(stream);
  stream->Position = 0;

  IPersistStreamInit* psi;
  _di_IStream sa(*(new TStreamAdapter(stream, soReference)));

  if ( SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IPersistStreamInit, (void **)&psi)) )
    psi->Load(sa);

  delete stream;
}
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Mironas » poniedziałek, 3 lutego 2014, 11:47

A jak wczytaną w ten sposób treść przewinąć na sam dół?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Cyfrowy Baron » wtorek, 4 lutego 2014, 09:45

Za pomocą suwaków lub przycisku [ Page Down ]. Kodem się nie da, bo ta kontrolka nie posiada takiej funkcji, no chyba, że zamieścisz na stronie jakiś skrypt, który będzie to robił.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Mironas » wtorek, 4 lutego 2014, 11:27

No właśnie próbowałem symulować wciśnięcie klawisza END na WebBrowser ale ta kontrolka jest wyjątkowo oporna. Znalazłem poradę jak wstawić fokus na nią fokus. Ale nie wiem jak skutecznie wysłać komunikat o wciśnięciu klawisza :(
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Cyfrowy Baron » wtorek, 4 lutego 2014, 11:35

Symulowanie wciśnięcia klawisza jest możliwe, ale nie zawsze działa. Musisz umieścić na formularzu komponent TApplicationEvent, albo stworzyć własną obsługę komunikatów.
Przykład z TApplicationEvents i klawiszem ENTER = VK_RETURN

KOD cpp:     UKRYJ  
void __fastcall TEdytorMainForm::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
 if(Msg.message == WM_KEYUP && Msg.wParam == VK_RETURN)
  {
   IOleInPlaceActiveObject* pIOIPAO;
   HRESULT hr = WebBrowser1->Document->QueryInterface(
                              IID_IOleInPlaceActiveObject, (void**)&pIOIPAO);

   if(SUCCEEDED(hr))
   {
    pIOIPAO->TranslateAccelerator(&Msg);
    pIOIPAO->Release();
   }
  }
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Mironas
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: WebBrowser z zasobów (Builder XE)

Nowy postprzez Mironas » wtorek, 4 lutego 2014, 12:59

Jeszcze raz wielkie dzięki.

Dokładnie to chodziło mi nie o przechwycenie komunikatu o wciśnięcie klawisza i przekazanie go do WebBrowsera tylko o programowe przewinięcie WB na dół w dowolnym momencie. Ale na bazie Twojego przykładu było już to proste:
KOD cpp:     UKRYJ  
  // Przewinięcie zawartości WebBrowser-a na dół
  tagMSG Msg;
  Msg.message = WM_KEYDOWN;
  Msg.wParam  = VK_END;

  IOleInPlaceActiveObject* pIOIPAO;
  HRESULT hr = WB1->Document->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&pIOIPAO);

  if( SUCCEEDED(hr) )
  {
    pIOIPAO->TranslateAccelerator(&Msg);
    pIOIPAO->Release();
  }
 


Dodatkowo zauważyłem u siebie, że bezpośrednio po wczytaniu treści HTML do WB i natychmiastowym wykonaniu powyższego kodu treść kontrolki przewija się na dół i natychmiast powraca na górę (tak jakby najpierw była przewinięta a potem wczytana). Pomogło dodanie pomiędzy wczytaniem kodu a przewinięciem:
KOD cpp:     UKRYJ  
  Application->ProcessMessages();
 


Jeszcze raz dzięki za pomoc.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron