CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - CppWebBrowser1 - problem z ponownym wyświetleniem zawartości
Strona 1 z 1

CppWebBrowser1 - problem z ponownym wyświetleniem zawartości

Nowy postNapisane: niedziela, 21 października 2012, 12:47
przez LiMeS
Witam.

Mam taki problem - w TMemo mam wprowadzony kod HTML. Za pomocą CppWebBrowser wyświetlam zawartość tego kodu HTML. Problem pojawia się w tym momencie, kiedy klikam ponownie na przycisk wywołujący poniższą funkcję.
Pojawia się biały ekran i... nic więcej. Gdzie jest popełniony błąd ?

KOD cpp:     UKRYJ  
void __fastcall TOkno_glowne::Button1Click(TObject *Sender)
{
CppWebBrowser1->Navigate(WideString("about :blank")); // wypełnienie kontrolki pustą stroną.
 TMemoryStream *stm = new TMemoryStream();
 Memo8->Lines->SaveToStream(stm);

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

 TStreamAdapter *sa = new TStreamAdapter(stm, soReference);

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

 delete stm;
}
//---------------------------------------------------------------------------
 

Re: CppWebBrowser1 - problem z ponownym wyświetleniem zawartości

Nowy postNapisane: niedziela, 21 października 2012, 13:20
przez Cyfrowy Baron
Wypełnij kontrolkę pustą stroną tylko na starcie programu. Nie musisz jej wypełniać ponownie przy zmianie zawartości. Poza tym usuwasz obiekt stm, ale obiektu sa nie usuwasz, a przecież po wypełnieniu kontrolki nie jest już potrzebny.

Re: CppWebBrowser1 - problem z ponownym wyświetleniem zawartości

Nowy postNapisane: niedziela, 21 października 2012, 16:25
przez Cyfrowy Baron
Przeprowadziłem testy i winne jest oczywiście to, że wielokrotnie wywołujesz pustą stronę przed wczytaniem zasobów ("about:blanc"). Możesz oczywiście robić to tak jak robiłeś, ale przed załadowaniem strony z zasobów - tutaj z pamięci - musisz zatrzymać ładowanie, czyli po wczytaniu pustej strony musisz wywołać funkcję Stop():

KOD cpp:     UKRYJ  
 WebBrowser1->Navigate( L"about :blank" );
 WebBrowser1->Stop();
 TMemoryStream *stm = new TMemoryStream();
...




Przy okazji podam jeszcze kod na ładowanie strony z zasobów - tutaj z pamięci - dla środowiska XE2, gdyż kontrolka uległa nieznacznej zmianie i robi się to nieco inaczej. Poza tym ten sposób powinien też zadziałać w starszych wersjach.

KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  WebBrowser1->Navigate( L"about :blank" ); // wypełnienie kontrolki pustą stroną.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMemoryStream *stm = new TMemoryStream();
 Memo1->Lines->SaveToStream(stm);

 IPersistStreamInit *psi;
 WebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi);

 stm->Seek(0, 0);

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

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

  psi->Release();
 }

 delete stm;
}

Re: CppWebBrowser1 - problem z ponownym wyświetleniem zawartości

Nowy postNapisane: poniedziałek, 29 października 2012, 13:09
przez LiMeS
No - nareszcie mam chwilkę czasu :/

Serdecznie dziękuję za odpowiedź.
Rzeczywiście ładowanie pustej strony jest zdecydowanie niepotrzebne.