[vtk-developers] recent Solution: Bug in SetRenderWindow(NULL)=> still a bug?

Dean Inglis dean.inglis at camris.ca
Wed Dec 10 10:38:44 EST 2003


Hi Charl,

>fail.  Does vtkBorlandRenderWindow simply inherit from
>vtkWin32OpenGLRenderWindow?

No, it inherits from one of the Borland C++ Builder VCL components
and maintains protected ivars:

vtkWin32OpenGLRenderWindow      *FRenderWindow;
vtkRenderer                     *FRenderer;
vtkWin32RenderWindowInteractor  *FInteractor;

which one can access through pointer by Get methods (no Set).

<destroy it...>
//--------------------------------------------------------------------------
-
__fastcall TvtkBorlandRenderWindow::~TvtkBorlandRenderWindow()
{
    // Delete this first because Renderwindow has a hold on it too
  if (FInteractor)
    {
    FInteractor->Delete();
    FInteractor = NULL;
    }
  if (FRenderer)
    {
    if(FRenderWindow) { FRenderWindow->RemoveRenderer(FRenderer); }
    FRenderer->Delete();
    FRenderer = NULL;
    }
  if (FRenderWindow)
    {
    FRenderWindow->RemoveObserver(FAbortCallback);
    FRenderWindow->Delete();
    FRenderWindow = NULL;
    }
   FAbortCallback->Delete();
}

<create it when needed...>
//--------------------------------------------------------------------------
-
vtkWin32OpenGLRenderWindow * __fastcall
TvtkBorlandRenderWindow::GetRenderWindow(void)
{
  if (!FRenderWindow)
    {
    //stuff the renderwindow into our window
    FRenderWindow = vtkWin32OpenGLRenderWindow::New();
    FRenderWindow->AddObserver( vtkCommand::AbortCheckEvent,
FAbortCallback);
    FRenderWindow->SetParentId(Parent->Handle);
    FRenderWindow->SetWindowId(Handle);
    FRenderWindow->DoubleBufferOn();
    FRenderWindow->SwapBuffersOn();
    // Clean and Frame to avoid unsightly garbage during initial
    // display which may be long when a complex scene is first rendered
    FRenderWindow->Clean();
    FRenderWindow->Frame();
    this->Invalidate();
    }
    // We create the interactor here because it makes maintenance better
  if (!FInteractor)
    {
    FInteractor = vtkWin32RenderWindowInteractor::New();
    FInteractor->SetRenderWindow(FRenderWindow);
    FInteractor->SetInstallMessageProc(false);
    this->SetInteractorMode(FInteractorMode);
    FInteractor->UpdateSize(Width,Height);
    FInteractor->Initialize();
    }
  return FRenderWindow;
}


Dean


>> The error does not occur in a Borland C++ Builder (5 or 6) app having
only one
>> vtkBorlandRenderWindow component.  In the case of an app with two such
>> components, when the app destroys the components, the first internal
render window
>> successfully completes its Delete() while the second produce the above
errors.
>> I'm unsure how to fix this for Borland users (including myself!).

>Urgh... unless my memory is playing tricks again, each RenderWindow
>should have a valid context, so that MakeCurrent should actually never
>fail.  Does vtkBorlandRenderWindow simply inherit from
>vtkWin32OpenGLRenderWindow?





More information about the vtk-developers mailing list