|
리스트뷰의 캡션에 순위를 매겨놨고(1, 2, 3 ... 식으로)
캡션을 수정하면, 예를 들어 원래 5 이었던 놈을 2로 바꾸는... , 바뀐 캡션 번호의 자리로 위치 이동이 되는 코드를 만들고 있습니다.
제 방식은 이동할 자리에 새로운 아이템을 Insert 하고 Insert 된 아이템에 기존 아이템의 데이타를 다 복사합니다.
그 후에 기존 아이템을 삭제합니다.
새로운 아이템을 Insert 하고 복사하는 코드는 OnEditd 이벤트 함수 내에 만들었고
삭제하는 코드는 OnChange 이벤트 함수 내에 있습니다.
그런데 삭제 후에 함수를 빠져나가는 순간에 AccessViolation Error 가 발생하는데 왜 에러가 나는지 도무지 모르겠네요.
원래는 삭제하는 함수를 OnEditd 함수 끝단에 위치시켰었는데 AccessViolation Error 가 발생해서 OnChange 함수로 옮겨본겁니다. 결과는 같구요...
flag 를 두어서 OnChange 함수를 들어가도 OnEdited 함수를 거쳐야지만 아이템이 삭제되도록 했구요.
함수를 빠져나가는 순간에 삭제되는 아이템에 접근하는거 같은데 왜 접근하는지도 모르겠네요.
아시는 분 제발 답변 부탁드려요~ ^---^
코드도 첨부합니다~
void __fastcall TCxBosuPriorF::ListView2Edited(TObject *Sender,
TListItem *Item, AnsiString &S)
{
TListItem* pItem;
int nRecsCnt;
//요기서부터~
//m_strBeforePrior과 S는 1부터 시작
//m_strBeforePrior는 수정되기 전 캡션의 내용입니다.
nRecsCnt = StrToInt(m_strBeforePrior)-1;
ListView2->Items->BeginUpdate();
for(int i = StrToInt(S)-1 ; i < nRecsCnt; i++)
{
pItem = ListView2->Items->Item[i];
pItem->Caption = IntToStr(StrToInt(pItem->Caption) + 1);
}
ListView2->Items->EndUpdate();
//요기까지는 아이템이 중간에 삽입되기 때문에 삽입되는 다음 아이템들의 캡션을 하나씩 증가시켜주는 부분입니다.
//삽입하고
ListView2->Items->Insert(StrToInt(S)-1);
//pItem은 삽입된 아이템
pItem = ListView2->Items->Item[StrToInt(S)-1];
pItem->Caption = S;
nRecsCnt = Item->SubItems->Count;
for(int i = 0 ; i < nRecsCnt-1; i++)
pItem->SubItems->Add(Item->SubItems->Strings[i]);//내용 다 복사하기
//OnChange 함수에서 삭제 조건으로 사용될 flag 변수
m_bEdited = true;
}
//---------------------------------------------------------------------------
void __fastcall TCxBosuPriorF::ListView2Change(TObject *Sender,
TListItem *Item, TItemChange Change)
{
TListItem* pItem;
if(m_bEdited)
{
m_bEdited = false;
//삽입되는 아이템에 포커스 주기
pItem = ListView2->Items->Item[StrToInt(m_strBeforePrior)];
pItem = ListView2->Items->Item[StrToInt(pItem->Caption)-1];
pItem->Focused = true;
//삭제
ListView2->Items->Delete(StrToInt(m_strBeforePrior));
}
}//여기서 에러납니다.
//---------------------------------------------------------------------------
|