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

WebBrowser z zasobów (Builder XE)

Nowy postNapisane: czwartek, 30 stycznia 2014, 19:01
przez Mironas
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?

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: czwartek, 30 stycznia 2014, 19:42
przez Cyfrowy Baron
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!

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: piątek, 31 stycznia 2014, 11:11
przez Mironas
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;
}
 

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: poniedziałek, 3 lutego 2014, 11:47
przez Mironas
A jak wczytaną w ten sposób treść przewinąć na sam dół?

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: wtorek, 4 lutego 2014, 09:45
przez Cyfrowy Baron
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ł.

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: wtorek, 4 lutego 2014, 11:27
przez Mironas
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 :(

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: wtorek, 4 lutego 2014, 11:35
przez Cyfrowy Baron
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();
   }
  }
}

Re: WebBrowser z zasobów (Builder XE)

Nowy postNapisane: wtorek, 4 lutego 2014, 12:59
przez Mironas
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.