dynamic_cast Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

dynamic_cast

Post by Mojo » Sun Oct 03, 2010 10:43 am

Братва, че за хрень такая.....

В главном файле mainstuff.cpp я устанавливаю рендерер по умолчанию для грида:

Code: Select all

m_grid1->SetDefaultRenderer(new wxGridCellAutoWrapStringRenderer);
в myxmlstuff.cpp файле у меня есть функция:

Code: Select all

void FromGridToXml(wxXmlDocument& doc, wxGrid* grid)
{
    ..... bla...bla...

    wxString isWrapDefault;

    wxGridCellAutoWrapStringRenderer* defWrapRenderer = dynamic_cast<wxGridCellAutoWrapStringRenderer*>(grid->GetDefaultRenderer());    
    
    if (defWrapRenderer)
       isWrapDefault = wxT("1");
    else
       isWrapDefault = wxT("0");

    .... bla ...bla.... bla

}


Этот же самый код (но не ввиде функции) работает в главноем файле нормально, т.е. указатель defWrapRenderer получает не NULL значение, и я могу узнать, установлен ли wxGridCellAutoWrapStringRenderer рендерер в гриде или нет.

Но в myxmlstuff.cpp файле, тот же код (но уже в виде функции) не работает и defWrapRenderer указатель никогда не получает значение wxGridCellAutoWrapStringRenderer из грида, т.е. я все время получаю NULL-указатель, хотя, мой самопальный рендерер в myxmlstuff.срр файле все нормально кастится dynamic_cast-ом, Шо за хрень такая, прям колдовство какое-то?
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Mon Oct 04, 2010 4:51 am

скорее всего что-то не так с wxGrid* grid, который ты передаешь в ф-ю неплохо бы и этот grid проверить на существование сначала или может это вообще другой грид проверь по id или по имени.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Oct 04, 2010 7:53 am

borr_1 wrote:скорее всего что-то не так с wxGrid* grid, который ты передаешь в ф-ю неплохо бы и этот grid проверить на существование сначала или может это вообще другой грид проверь по id или по имени.
Даж не знаю.... прям полтергейст какой-то.....
Грид только один, другого сто пудов нет.... в этой же самой функцие, мой пользовательсткий рендерер работает отлично по этой же самой схеме.... может быть действительно проблема с передачей в функцию.... но тогда почему мой пользовательский рендерер определяется нормально..... кроме того в dynamic_cast мне нужно передавать только указатель, иначе я не получу NULL значение..... че такое не пойму..... попытаюсь ща в минимальной проге "погонять" dynamic_cast в увязке с wxGridCellAutoWrapStringRenderer может че всплывет.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Mon Oct 04, 2010 8:46 am

раз пошло такое шамаство с бубном пробуй тогда и wxDynamicCast
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Oct 04, 2010 9:13 am

borr_1 wrote:раз пошло такое шамаство с бубном пробуй тогда и wxDynamicCast
Нее с wxDynamicCast тем более работать не будет, wxDynamicCast работает только с объектами производными от wxObject а все рендереры в wxWidgets не являются дочерними от wxObject....

Я уже сталкивался с этой проблемой в этом посте: http://forums.wxwidgets.org/viewtopic.php?t=28288


Я тут погонял в минимальном приложении wxGridCellAutoWrapStringRenderer и пришел к выводу, что это глючит wxGridCellAutoWrapStringRenderer.

Расклад такой, сначала я сделал функцию в отдельном файле mystuff.cpp

Code: Select all



void CheckAutoWrap(wxGrid *grid)
{
    wxGridCellAutoWrapStringRenderer* defWrapRenderer = dynamic_cast<wxGridCellAutoWrapStringRenderer*>(grid->GetDefaultRenderer());
    //wxGridCellAutoWrapStringRenderer* defWrapRenderer = (wxGridCellAutoWrapStringRenderer*) grid->GetDefaultRenderer();
    if (defWrapRenderer)
        wxMessageBox( wxT("Автоперенос текста работает"), wxT("Автоперенос текста работает"), wxOK | wxICON_INFORMATION );
    else
        wxMessageBox( wxT("ШО ЗА ХРЕНЬ!! НИЧЕГО НЕ работает"), wxT("НИЧЕГО НЕ РАБОТАЕТ"), wxOK | wxICON_INFORMATION );
}
вызываю функцию в в обрабочтике кнопки:

Code: Select all

void MainFrame::OnButnClickOK( wxCommandEvent& event ) 
{ 
    CheckAutoWrap(m_grid1);    

}
Разумеется ничего не работает... затем я такую же функцию определи в mainframe.cpp но ток название CheckAutoWrap2(m_grid1) тоже ничего не работает.....

И наконец, просто вызываю код в обработчике другой кнопки:

Code: Select all

void MainFrame::OnBtnClickLoad( wxCommandEvent& event ) 
{ 
    
    wxGridCellAutoWrapStringRenderer* defWrapRenderer = dynamic_cast<wxGridCellAutoWrapStringRenderer*>(m_grid1->GetDefaultRenderer());
    //wxGridCellAutoWrapStringRenderer* defWrapRenderer = (wxGridCellAutoWrapStringRenderer*) grid->GetDefaultRenderer();
    if (defWrapRenderer)
        wxMessageBox( wxT("Автоперенос текста работает"), wxT("Автоперенос текста работает"), wxOK | wxICON_INFORMATION );
    else
        wxMessageBox( wxT("ШО ЗА ХРЕНЬ!! НИЧЕГО НЕ работает"), wxT("НИЧЕГО НЕ РАБОТАЕТ"), wxOK | wxICON_INFORMATION );
    
    //event.Skip(); 

}
И тоже ничего не работает, таким образом, получается, что wxGridCellAutoWrapStringRenderer вообще некастится никаким образом...... хотя тип полиморфный, сверху него аж два родителя wxGridCellStringRenderer и wxGridCellRenderer, че делать не знаю...

нужно каким-то образом узнать, установлен ли в гриде перенос по словам или нет......

Зашел в тупик.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Mon Oct 04, 2010 9:26 am

свят свят свят. тогда только переменную какую-то вводить вкл выкл какой-нибудь
и с include<wx/grid.h> поиграться еще можно попробовать повыше его поставить
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Oct 04, 2010 10:00 am

borr_1 wrote:свят свят свят. тогда только переменную какую-то вводить вкл выкл какой-нибудь
и с include<wx/grid.h> поиграться еще можно попробовать повыше его поставить
Не хочется переменную вводить... так все красиво... у меня всего две функции void GetDatasFromXml(const wxXmlDocument& doc, wxGrid* grid); и void PushDatasToXml(wxXmlDocument& doc, wxGrid* grid); и каждая принимает только 2 аргумента, красиво и изящно, добился того, что все данные передаю в xml через грид и теперь из-за одного автопереноса по словам, придется рушить такую красоту :)))) попытаюсь, на трак отправить баг, может кто, что подскажет.... или сам попытаюсь полазить в исходниках грида...... или даже попробую свой рендерер для автопереноса слепить.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Mon Oct 04, 2010 12:50 pm

Я полагаю, что тут конкретный баг в WX коде. Поскольку GetDefaultRenderer() возвращает не тот указатель, который был установлен в SetDefaultRenderer() (что должно быть, очевидно). Поэтому dynamic_cast и не работает. Попробуй пожаловаться на это в багтрекере.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Oct 04, 2010 1:15 pm

tan wrote:Я полагаю, что тут конкретный баг в WX коде. Поскольку GetDefaultRenderer() возвращает не тот указатель, который был установлен в SetDefaultRenderer() (что должно быть, очевидно). Поэтому dynamic_cast и не работает. Попробуй пожаловаться на это в багтрекере.
Думаю... баг даже не в WX коде, а конкретно в коде wxGridCellAutoWrapStringRenderer, потому, что мой пользовательский рендерер кастится отлично.....
Действительно нужно отправить тикет в багтрекер, вечерком займусь....

borr_1, tan, спасибо за помощь.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Tue Oct 05, 2010 1:00 pm

Эпопея получила новое продолжение.....
Копался и обнаружил, что проблема не в wxGridCellAutoWrapStringRenderer и даже не в dynamic_cast, дело в том, что если использвать функцию GetCellRenderer то бишь рендерер для ячейки, то кастится и wxGridCellAutoWrapStringRenderer и мой пользовательский рендерер, а если использовать функцию GetDefaultRenderer то бишь рендерер для всего грида, то не кастится ни wxGridCellAutoWrapStringRenderer ни мой пользовательский рендерер. Таким образом, проблема скорее всего в функции GetDefaultRenderer.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

Post Reply