콤보박스에 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;
수고하세요..
위처럼 콤보박스에 추가하게 되면 약간의 문제가 생깁니다..
현재 님께서 하고자 하는게 콤보리스트의 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]