Page 1 of 1

Parentless TRichView control

Posted: Fri Sep 13, 2013 4:17 am
by dmitrys
I have an invisible TRichView control with no parent that I use to convert HTMLto RTF.
When RTF is saved, TRVWinGraphicInterface.GetDeviceCaps is called and accesses the Canvas property. The control has no parent, so the handle cannot be created and the calls fails with the following call stack.
Shouldn't the control be using the screen canvas in this case?

Thanks you!

Vcl.Controls.TWinControl.CreateWnd
RVScroll.TRVScroller.CreateWnd
Vcl.Controls.TWinControl.CreateHandle
Vcl.Controls.TWinControl.HandleNeeded
Vcl.Controls.TControlCanvas.CreateHandle
Vcl.Graphics.TCanvas.RequiredState([csHandleValid,csFontValid,csPenValid,csBrushValid])
Vcl.Graphics.TCanvas.GetHandle
RVWinGrIn.TRVWinGraphicInterface.GetDeviceCaps($17DB8660,88)
RVFuncs.RV_InfoAboutSaD($13E498,$17DB8660,$17E01210)
CRVFData.TCustomRVFormattedData.GetSADForFormatting($17DB8660,$13E498)
CRVFData.TCustomRVFormattedData.Format_(False,True,False,0,$17DB8660,False,False,False,False,False)
CRVFData.TCustomRVFormattedData.Format(False,False)
RVTable.TRVTableItemInfo.UpdateCellXCoords($17E0A0B0,False,False,False)
RVTable.TRVTableItemInfo.InternalOnDocWidthChange(600,$17E0A0B0,nil,False,False,False,$17E01210)
RVTable.TRVTableItemInfo.OnDocWidthChange(600,nil,False,nil,$188A8DB0,nil,0,0,False,False,False)
RVTable.TRVTableItemInfo.SaveRTF($17DF4A20,'',$188A8DB0,26,0,$17DFB1E8,$17DFADF8,$17DFB098,$17DFB518,False)
CRVData.TCustomRVData.SaveRTFToStream($17DF4A20,'',False,0,536870911,$17DFABD0,$17DFB1E8,$17DFADF8,$17DFB098,$17DFB518,True,False,nil,nil,nil,nil,nil,nil)
RichView.TCustomRichView.SaveRTFToStream($17DF4A20,False)

Posted: Fri Sep 13, 2013 6:17 am
by Sergey Tkachenko
Unfortunately, some operations cannot be made in parentless TRichView.
I suggest to use TRVReportHelper component instead, RVReportHelper.RichView can work without a parent.

Important note: if document contains tables, it must be formatted before saving to RTF (in your case, the component tries to format a table itself, and fails; RVReportHelper must be formatted too, but it is formatted by calling RVReportHelper.Init)

Posted: Fri Sep 13, 2013 5:35 pm
by dmitrys
It is the same problem - but now it is an access violation since Canvas being passed in is nil:


Vcl.Graphics.TCanvas.GetHandle
RVWinGrIn.TRVWinGraphicInterface.GetDeviceCaps(nil,88)
RVFuncs.RV_InfoAboutSaD($13E498,nil,$162D1220)
CRVFData.TCustomRVFormattedData.GetSADForFormatting(nil,$13E498)
CRVFData.TCustomRVFormattedData.Format_(False,True,False,0,nil,False,False,False,False,False)
CRVFData.TCustomRVFormattedData.Format(False,False)
RVTable.TRVTableItemInfo.UpdateCellXCoords($162DA0D8,False,False,False)
RVTable.TRVTableItemInfo.InternalOnDocWidthChange(600,$162DA0D8,nil,False,False,False,$162D1220)
RVTable.TRVTableItemInfo.OnDocWidthChange(600,nil,False,nil,$19CF8DB0,nil,0,0,False,False,False)
RVTable.TRVTableItemInfo.SaveRTF($162C49C0,'',$19CF8DB0,26,0,$162CB230,$162CAE40,$162CB0E0,$162CB560,False)
CRVData.TCustomRVData.SaveRTFToStream($162C49C0,'',False,0,536870911,$162CAC60,$162CB230,$162CAE40,$162CB0E0,$162CB560,True,False,nil,nil,nil,nil,nil,nil)
RichView.TCustomRichView.SaveRTFToStream($162C49C0,False)



Sergey Tkachenko wrote:Unfortunately, some operations cannot be made in parentless TRichView.
I suggest to use TRVReportHelper component instead, RVReportHelper.RichView can work without a parent.

Important note: if document contains tables, it must be formatted before saving to RTF (in your case, the component tries to format a table itself, and fails; RVReportHelper must be formatted too, but it is formatted by calling RVReportHelper.Init)

Posted: Sat Sep 14, 2013 6:59 am
by Sergey Tkachenko
Call RVReportHelper.Init before saving.