Strona 1 z 1

Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 18:08
przez Darek_C++
Witam ponownie,

Jak po kliknięciu buttona utworzyć nową zakładkę na PageControl, a w niej WebBrowser? Jak się odwoływac do tego komponentu?
Czy jest to w praktyce możliwe ?

Pozdrawiam ALL

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 18:29
przez Cyfrowy Baron
Nie jestem tego całkowicie pewien, ale gdzieś kiedyś czytałem, że kontrolki TCppWebBrowser i TWebBrowser nie da się tworzyć dynamicznie, ale mogę się mylić.

Co do tworzenia czegokolwiek dynamicznie i wrzucania tego na PageControl, no to robi się to tak samo jak z każdym innym komponentem, tylko jako rodzica ustawiasz takiemu dynamicznemu obiektowi zakładkę obiektu PageControl, poprzez funkcję Parent, np:

Kod: Zaznacz cały
TPanel *MyPanel = new TPanel(this);
MyPanel->Parent = TabSheet1; // TabSheet1 to zakładka obiektu PageConotrl


Co do odwoływania sie do takiego obiektu, to nic się tutaj nie zmienia, nie ma znaczenia, że jest on na zakładce PageControl, to identycznie jak gdyby był na obiekcie Panel czy dowolnym innym obiekcie.

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 18:57
przez Darek_C++
Czyli mam na formie komponent PageControl1 i jak po kliknięciu w button tworzyć na min panele ?
Czyli tak jak tu: http://forum.4programmers.net/viewtopic.php?id=70066

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 19:08
przez Darek_C++
Wygoglałem jak tworzyć:
Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{

   TTabSheet *pTabSheet = new TTabSheet(PageControl1);
   pTabSheet->PageControl = PageControl1;
   pTabSheet->Caption = "New Tab";

   TWebBrowser * MyWebBrowser = new TWebBrowser(pTabSheet);
   pTabSheet->InsertControl(MyWebBrowser);
   TWinControl(MyWebBrowser).Parent = PageControl1;
   MyWebBrowser->Align = alClient;
   MyWebBrowser->Visible = true;
   MyWebBrowser->Navigate("http://www.google.co.uk");
}

http://www.[spam]/viewthread.cfm? ... 659&page=1
Ale jak się odwoływać do poszczególnych dynamicznie utworzonych okien WebBrowser1 i ich zdarzeń np:
Kod: Zaznacz cały
void __fastcall TForm1::WebBrowser1DocumentComplete(TObject *ASender,     const IDispatch *pDisp, OleVariant &URL)

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 21:33
przez Cyfrowy Baron
Zadajesz zbyt ogólne pytania. Do obiektów dynamicznych zawsze odwołujesz się tak samo. Do zdarzeń obiektu dynamicznego nie możesz się odwołać, musisz je utworzyć, np:

plik nagłówkowy:
Kod: Zaznacz cały
private:
        void __fastcall MyButtonClick(TObject *Sender);


Kod: Zaznacz cały
TButton *MyButton = new TButton(this);
MyButton->Parent = this;
MyButton->Left = 8;
MyButton->Top = 100;

MyButton->OnClick = MyButtonCLick;
//-------------------------------------------
void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
// jakieś zadanie do wykonania...
}

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 21:48
przez Darek_C++
Cyfrowy Baron napisał(a): Do obiektów dynamicznych zawsze odwołujesz się tak samo. Do zdarzeń obiektu dynamicznego nie możesz się odwołać, musisz je utworzyć
Tylko, że w tym wypadku to nie działa, bo zgłaszany jest błąd:
Kod: Zaznacz cały
//w Unit1.h
private:   // User declarations
   void __fastcall MyWebBrowser1DocumentComplete(TObject *ASender,const IDispatch *pDisp, OleVariant &URL); // Skaldnia jak z metody w Events

///w Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TTabSheet *pTabSheet = new TTabSheet(PageControl1);
   pTabSheet->PageControl = PageControl1;
   pTabSheet->Caption = "New Tab";

   TWebBrowser * MyWebBrowser = new TWebBrowser(pTabSheet);
   pTabSheet->InsertControl(MyWebBrowser);
   TWinControl(MyWebBrowser).Parent = PageControl1;
   MyWebBrowser->Align = alClient;
   MyWebBrowser->Visible = true;
   MyWebBrowser->Navigate("http://www.google.co.uk");

   MyWebBrowser->OnDocumentComplete = MyWebBrowser1DocumentComplete; // Przypisanie do zdarzenia
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWebBrowser1DocumentComplete(TObject *ASender,const IDispatch *pDisp, OleVariant &URL)
{
   // Jakies dzialanie
}

I mamy niestety error :(

[C++ Error] Unit1.cpp(29): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *,const IDispatch *,OleVariant &))(TObject *,const IDispatch *,OleVariant &)' to 'TWebBrowserDocumentComplete'

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 21:52
przez Cyfrowy Baron
Bo jak pisałem w swoim pierwszym wątku, gdzieś czytałem, ze nie można tworzyć kontrolek ActiveX dynamicznie, tzn. dają się utworzyć dynamicznie, ale nie można dodać obsługi zdarzeń, gdyż to nie są komponenty lecz kontrolki bazujące na gotowych bibliotekach chyba OCX i DLL.

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: środa, 14 października 2009, 22:01
przez Darek_C++
:) Rozwiązanie jest tutaj: http://www.[spam]/3/3/5270.html
----
A jak mogę zamknąć dynamicznie otwartą zakładkę ?

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: czwartek, 15 października 2009, 00:10
przez Witold
Darek_C++ napisał(a):A jak mogę zamknąć dynamicznie otwartą zakładkę ?


Próbowałeś przez: delete wsk_TTabSheeta; ?
Można by jeszcze utrzymywać zawsze pewną pulę zakładek, a niepotrzebne w danym momencie ustawiać na jako niewidoczne.

TWinControl(MyWebBrowser).Parent = PageControl1;


O co w tym chodzi ?

Re: Dynamicznie tworzenie TWebBrowser na PageControl

Nowy postNapisane: czwartek, 15 października 2009, 15:12
przez wargo
Lepszym pomysłem na tworzenie zakładek z tą samą zawartością byłoby użycie komponentu TabControl