Hi David,
the problem is due to the fact that when after the slot methods are executed
(which do a "delete this"). The button objects are still referenced internally
in the signal handling code. However these buttons have just been deleted.
A fix is the following:
in AcceptInput() do:
void TStringInputDialog::AcceptInput()
{
cerr << "AcceptInput()" << endl;
if (fReturnValue) {
const char* value = fTextEntry->GetBuffer()->GetString();
*fReturnValue = new char[strlen(value) + 1];
strcpy(*fReturnValue, value);
}
//delete this;
fDialog->SendCloseMessage();
}
and add a new DoCancel method that should be bound to the Cancel button
instead of binding CloseWindow() directly to the Cancel button:
void TStringInputDialog::DoCancel()
{
fDialog->SendCloseMessage();
}
To see other examples look at $ROOTSYS/tutorials/guitest.C and search for
SendCloseMessage().
Cheers, Fons.
> Hi,
> In trying to create a simple input dialog, I've encountered a problem
> I don't understand. If the user presses return in the dialog's input
> field or clicks the dialog box, everything works as expected. But if the
> user clicks either of the two buttons (OK and cancel), after the dialog
> disappears, and it's dtor is called, ROOT complains of a segmentation
> violation.
> My code is based on the dialogs.C tutorial. The main difference is
> that I'm using the signal/slot mechanism in place of ProcessMessage (and
> interpreted code).
> Since the code is rather long, I've posted it in
> http://www.public.iastate.edu/~dfaden/root/TStringInputDialog.cc and
> http://www.public.iastate.edu/~dfaden/root/TStringInputDialog.hh
> I'm running this code under ROOT 3.01/05 9 June 2001 under RedHat 6.1
> i386.
> I've stuck a few cerrs into the code to try to see what's going on.
> Here's the output from first closing a dialog by hitting return in the
> dialog's input field, and then closing a dialog by clicking the OK button:
>
> root [0] char* storage;
> root [1] new TStringInputDialog("My dialog","Give me input",&storage);
> AcceptInput()
> Destructor #1
> #2
> #3
> root [2] storage
> (char* 0x93e8470)"soup"
> root [3] new TStringInputDialog("My dialog","Give me input",&storage);
> AcceptInput()
> Destructor #1
> #2
> #3
>
> *** Break *** segmentation violation
>
>
>
> I suspect that the problem is mine but am mystified as to why closing
> the dialog through its input field or dialog box works fine, while
> closing it through the buttons leads to a seg fault. Any insight would be
> much appreciated.
> Thank you.
>
> David
--
Org: CERN, European Laboratory for Particle Physics.
Mail: 1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7677910
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:53 MET