|
우선 조언 감사해요~
앞->뒤 로 옮기는 걸 생각안했네요ㅎㅎ
Delete하는 코드를 OnChange에서 다시 OnEdited 로 옮기고
음수, 문자, 공백 등의 예외처리도 했고
앞->뒤, 뒤->앞 으로 옮기는 것도 처리했습니다.
그런데 역시나 같은 오류가 발생하는데
도대체 왜 이런건지...
아무래도 OnEdited 함수 내에선 삭제를 못 할거 같은데...
더블클릭한 아이템의 캡션을 수정하도록 하는데
원래는 다음 코드와 같이 더블클릭 이벤트 함수에다 삭제하는 코드를 넣었습니다
void __fastcall TCxBosuPriorF::ListView2DblClick(TObject *Sender)
{
ListView2->ItemFocused->EditCaption();
ListView2->Items->Delete(ListView2->ItemFocused->Index);
}
//--------------------------------------------------------------------------
void __fastcall TCxBosuPriorF::ListView2Edited(TObject *Sender,
TListItem *Item, AnsiString &S)
{
...
}
제 생각으로는 삭제되기 전에 EditCaption함수에서 OnEdited 이벤트가 먼저 발생할거라고 생각했거든요
그런데 위 코드와 같이 하면 캡선 수정은 건너뛰고 바로 삭제가 되더라구요
(캡션 수정하는 에디트박스가 아예 안 나옵니다.)
해결방법이 있을까요?
그런데 오류창이 뜨긴하지만 제대로 동작은 하네요 ^^;;
장성호 님이 쓰신 글 :
: 음....
:
: 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));
: : }
: : }//여기서 에러납니다.
: : //---------------------------------------------------------------------------
|