Q&A

  • combobox에 2개의 컬럼 값넣기...
콤보박스에 db에서 가져온 코드성 자료를 넣을려고 합니다.

    코드    코드명
  ===============
      01     코드명1
      02     코드명2
      03     코드명3

사이트를 뒤져보니.. AddObject를 사용하라구 나오던데.. 실제로 사용하니깐

이상한 값이 나타납니다...  왜그런가요..?

일반적으로 이러한 처리는 어케 하는지 궁금합니다...  고수님들 조언바랍니다.

제가 작성한 코드는 아래에.. (개략적은 방법이므로.. 참조만..)

procedure DeviceList
var
  Query : TADOQuery;
  AList : TStringList
begin
   Query := TADOQuery.Create(Self);
   AList  := TStringList.Create;
   //DB에 연결후에

   try
     with Query do
     begin
         SQL.Clear
         .......//SQL을 날리고...
         Open;

        if not IsEmpty then
          while not EOF do
          begin
            AList.AddObject(FieldByName('코드명').AsString,
                                    TObject(FieldByName('코드').AsString);
            Next;
          end;
          ComboBox.Items := AList;
      end;
   finally
      Query.Free;
      AList.Free;
   end;
end;















수고하세요..

2  COMMENTS
  • Profile
    윤병진 2004.06.02 23:21

    위처럼 콤보박스에 추가하게 되면 약간의 문제가 생깁니다..
    현재 님께서 하고자 하는게 콤보리스트의 Items에 코드명을
    넣고 Object 항목에 해당 코드를 넣을려고 하는게 맞지여..

    그렇다면 이거에 맞추어서 설명드리겠습니다.

    위처럼 데이터셋을 바로 Items.Object에 추가를 하게 되면
    이것이 Items.Object에 실제로 값이 저장되는 것이 아니라 해당
    리퍼런스만 저장이 됩니다..(실제로.. 해당 오브젝트를 Add후에.. 수동으로
    해당 오브젝트를 Free 시킨다음.. Items.Objects[Index] 이렇게 접근하면
    Access Violation Error가 발생하져..)

    그러니까.. 실제 데이터셋에 있는 필드를 배열로 참조하게 되는거죠..
    (데이터셋이 열려 있을때.. 확인할 방법 : 콤보박스에 OnClick 이벤트에

    Table1.RecNo := ComboBox1.ItemIndex; // 테이블이 배열형태이므로..
    Label1.Caption :=
    TField(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).AsString;

    이렇게 넣어서 확인해보세여... 이렇게 하면.. 현재 콤보박스에 해당하는
    인덱스와 동일한 테이블의 필드를 참조하게 되죠..
    )

    이렇게

    만약 데이터셋이.. Close되면.. Items.Strings[Index]는 참조할 수 있지만..

    Items.Objects[Index]는 참조 하지 못하겠져..

    그니까.. 만약에.. 이것을 코드참조를 위해서 사용하실 목적이라면..

    차라리.. 자료실에 있는 코드콤보박스를 이용하시거나..

    Hidden  속성의 콤보박스(Cmb_Hidden)를 하나 만들어서.. 코드부분을 여기에 넣고..

    보이는 콤보박스(Cmb_CodeName)에 보여지는 코드명을 넣습니다.

    글구..  참조는 다음과 같이 하면 되겠져..

    FCodeStr := Cmb_Hidden.Items.Strings[Cmb_CodeName.ItemIndex]
  • Profile
    최용일 2004.06.02 19:11
    안녕하세요. 최용일입니다.

    이런 식의 콤보박스는 Custom Draw로 직접 그려주시는것이 가장 좋은 방법이구요... (참고로 님이 쓰신 코드에는 그리는 부분이 빠져있네요...)

    코드가 일정한 자리수의 숫자라면 간단히 될 수도 있을듯한데...

    그냥 Format함수 써서 자릿수를 구분해주셔도 될거 같은데요... 글씨 위치가 안맞으면 굴림체, XXX체 등의 고정폭 글꼴을 사용하시면 예쁘게 될겁니다...

    ComboBox.Items.Add(Format('%4s  %s', [FieldByName('코드명').AsString, FieldByName('코드').AsString]);

    ^^ 항상 즐코하세요...