Print Page | Close Window

Moving rows

Printed From: Codejock Forums
Category: Codejock Products
Forum Name: Report Control
Forum Description: Topics Related to Codejock Report Control
URL: http://forum.codejock.com/forum_posts.asp?TID=4558
Printed Date: 21 November 2024 at 8:21pm
Software Version: Web Wiz Forums 12.04 - http://www.webwizforums.com


Topic: Moving rows
Posted By: rock
Subject: Moving rows
Date Posted: 07 July 2006 at 4:58pm
I have a dialog box that contains a Report Control and a CSpinButtonCtrl.  I use the spin control to successfully move rows up or down within the Report control.  However, when I exit the dialog box I get an assertion error in the CXTPReportRows destructor during the call to CXTPReportRows::Clear().  Specifically to the line pRow->InternalRelease();

My code for moving rows is:

void CSortReportDlg::OnDeltaposReportSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;

    int number_rows = wndReport.GetRows()->GetCount();
    int cur_item = wndReport.GetFocusedRow();
    if (pNMUpDown->iDelta > 0 && cur_item >= 0)  // Move Up
        {
        if (cur_item == 0 || cur_item >= number_rows)
            return;

        CXTPReportRow *pRow = wndReport.GetRows()->GetAt(cur_item);
        if (pRow)
            {
            wndReportGetRows()->RemoveAt(cur_item);
            wndReportGetRows()->InsertAt(cur_item - 1, pRow);
            }
        }
    else if (pNMUpDown->iDelta < 0 && cur_item >= 0 && cur_item < (number_rows - 1))  // Move Down
        {
        if (number_rows == 0 || cur_item == number_rows || cur_item >= number_rows-1)
            return;

        CXTPReportRow *pRow = wndReport.GetRows()->GetAt(cur_item);
        if (pRow)
            {
            wndReportGetRows()->RemoveAt(cur_item);
            wndReportGetRows()->InsertAt(cur_item + 1, pRow);
            }
        }

    *pResult = 0;
}

Have I missed some other function call I must make after moving the rows?



Replies:
Posted By: sserge
Date Posted: 09 July 2006 at 8:57am
Hi,

RemoveAt calls InternalRelease for a removed row, unlike InsertAt, which assumes recently created row object. So far, it looks like you have to add pRow->InternalAddRef(); as a first operation in if (pRow) {...

--
WBR,
Serge


Posted By: rock
Date Posted: 10 July 2006 at 11:58am
Serge,

That appears to have done it.  It works fine now.

Thanks



Print Page | Close Window

Forum Software by Web Wiz Forums® version 12.04 - http://www.webwizforums.com
Copyright ©2001-2021 Web Wiz Ltd. - https://www.webwiz.net