C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[54513] Re:Re:AccessViolation Error 조언 부탁드립니다(수정)
우오아항 [corea139] 1259 읽음    2008-09-08 13:33
우선 조언 감사해요~
앞->뒤 로 옮기는 걸 생각안했네요ㅎㅎ
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));
: :     }
: : }//여기서 에러납니다.
: : //---------------------------------------------------------------------------

+ -

관련 글 리스트
54509 AccessViolation Error 조언 부탁드립니다 우오아항 1087 2008/09/08
54511     Re:AccessViolation Error 조언 부탁드립니다 장성호 989 2008/09/08
54513         Re:Re:AccessViolation Error 조언 부탁드립니다(수정) 우오아항 1259 2008/09/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.