|
음....
1. 먼저 OnChange에서 Item을 Delete하는것이 적절한지 않을것 같습니다.
왜냐하면 OnChage이벤트는 Caption이 바뀔때 selected가 바뀔때 ImageIndex가 발뀔때 등 여러가지 경우에 발생하니까요
BeginUpdate , EndUpdate는 화면에 그려주는것만 하지 않을뿐입니다.
OnChage이벤트는 BeginUpdate 하더라도 발생합니다.
또 님의 코드에 ListView2Change에
pItem->Focused = true; //이부분에서
다시 ListView2Change함수가 호출됩니다.
2. ListView->Items->Insert 는 해당 Index 자리에 삽입하는것 아시죠?
만약 Caption이 5인 값을 6으로 바꿀경우 어떻게 되죠?
Caption을 "1"부터 넣었으므로 결국 자기자신의 위치가 됩니다.
그러므로 이경우는 Caption만 원래대로 해두고 아무 작업을 하지 않아도 되죠
3. 앞에서 뒤로 이동과 뒤에서 앞으로 이동
앞에서 뒤로 이동은 사이에 Item들의 Caption 숫자가 하나씩 줄어들것이고
뒤에서 앞으로 이동은 사이의 아이템 Caption 숫자가 하나씩 늘어나겠죠
4. 아이템의 Caption의 값을 마이너스(음수)로 입력하거나 , 또 아이템의 Count보다 큰값을 입력한 경우도 고려
5. 아이템의 Caption에 숫자가 아닌 문자가 포함되는경우도 고려
이상 여러가지 것들을 고려해야 할것입니다.
그럼..
우오아항 님이 쓰신 글 :
: 리스트뷰의 캡션에 순위를 매겨놨고(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));
: }
: }//여기서 에러납니다.
: //---------------------------------------------------------------------------
|