Q&A

  • 답이 없어 질문다시 올립니돠..아시는분 안계신가요~~ 체크박스관련...
<체크박스 입력시>
  repeat

     sId := FrmDM.qryTmp.FieldByName('id').AsString;   ---->1
     //sId := '11111';                                                      ---->2

     sName := FrmDM.qryTmp.FieldByName('name').AsString;

     checkbox.AddItem( sName, TObject(PChar( sId )));

  until FrmDM.qryTmp.FindNext() <> true;

<체크박스 조회시>
    PChar(checkbox.Items.Objects[0])  를 보여줌...



체크박스에 access db에서 값을 읽어와서 넣어줍니다.

그런데 문제는  입력시에 1번과 같이 하면 조회때 이상한 쓰레기 값들이 나오고
2번과 같이 하면 11111로 제대로 나옵니다.

포인터가 잘못지정되는지 null 값과 관련이 있는건지....
암튼 1번 방법이 뭐가 잘못됐는지요...
한수 가르침을.....
2  COMMENTS
  • Profile
    황준동 2006.11.07 01:00

    우선 체크 박스가 아니라 CheckListBox에 넣으시는것 같구요.

    AddItem(Item: String; AObject: TObject);

    의 형태의 메소드인데, AObject는 TObject 형태 입니다.

    즉, 포인터라는 것이지요. TObject 형태의 객체를 생성해서  Create 해서 사용하던지,

    아니면 메모리를 직접 할당해 준 다음에 그 포인터를 TObject 형태로 변환해서 저장한다던지

    하셔야 하는데 메모리 할당한 부분도 없고 단지 TObject(PChar(sId)) 와 같은 형태로만 하시면

    안되요..

    특히 sId가 Local 변수일 경우에는 나중에 그 값이 뭐가 나올지 장담할 수 없어요.

    2번처럼했을때 제대로 나온다는것은 sId가 로컬변수가 아니라면 제대로 나오겠지요.

    즉 sId 가 메모리의 일정 부분을 계속 차지하고 있으니....

    ^^;



  • Profile
    김현주 2006.11.07 20:48
    제가 질문을 잘못했네요.. 체크박스가 아니고 콤보박스였습돠 ^^

    답변감사드립니다.