안녕하세요..
이번 여름은 많이 덥네요..
질문은요...
1) 콤보박스를 동적생성하여 데이터를 불러왔습니다. 그런데 저장을 할려고 하니 널값으로 들어갑니다.(name값으로 저장할려고 합니다.)
//-------------------------동적생성부분 -------------------------//
sgrdFloors_1.objects[2,i+1] := Tcombobox.create(sgrdFloors_1); //////
with Tcombobox(sgrdFloors_1.objects[2,i+1]) do begin
parent := sgrdFloors_1; ////
Rect := sgrdFloors_1.cellrect(2,i+1);
name := 'cb_sil'+'00'+IntToStr(i);
if (Rect.Top<=0)then
Visible := False;
boundsrect := Rect;
width := sgrdFloors_1.colwidths[2] ; //CBpart_state.//
height := sgrdFloors_1.rowheights[3];
Style := csDropDownList;
ClientHeight:=100;
with FMain.QryCode do begin
Close;
SQL.Clear;
SQL.Add(' Select c_Big, c_Middle,c_Name ');
SQL.Add(' From code ');
SQL.Add(' Where c_Big=''07'' ');
SQL.Add(' Order by c_name ');
Open; First;
while not EOF do begin
items.add(FieldByName('c_name').AsString);
next;
end;
end;
end;
//-------------------------저장하는부분 -------------------------//
ParamByName('C_NAME').AsString := (FindComponent('cb_sil00' + IntToStr(i)) as TComboBox).Text;
//--------------------------------------------------------------//
읽어주셔서 고맙습니다..
즐거운 하루 되세요..
님이 하신것의 문제는 FindComponent 함수의 기능을 조금 잘못쓰신것이라고 생각되네요.
답은 생성하실때
Tcombobox.create(sgrdFloors_1); -> TCombobox.Create( self )
이렇게만 해주시면 잘 작동될껍니다.
그렇지 않으면
sgrdFloors_1.FindComponent(....); 이렇게 쓰셔도 되구요..
두개중 아무거나 해주시면 됩니다.
조금 설명을 드리면
FindComponent는 TComponent 클래스의 FComponents 로 작동되는겁니다. 이 리스트에 존재 해야만 작동하는 것이죠..
그런데 이 리스트에 들어가는 타이밍은 TComboBox.Create( 이놈 ) <--
이놈의 값으로 들어갑니다.
소스를 보면
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self); <-- 여기있죠?
end;
자신의 오너의 콤포넌트 리스트에 넣도록 되어있죠..
따라서 윈도우즈의 계층(Parent)과는 별도로 콤포넌트의 계층이 만들어지는 겁니다.
FindComponent라는 것이 여기서 추가한 값이 fComponents에 들어가게 되는데 이 TList의 값으로 그냥 찾아주는 역활 뿐입니다. ( 소스보시면 그냥 for문으로 해서 찾도록 되어잇죠. ㅎㅎ )
이놈은 하위계층의 것은 찾지 못합니다. 오너의 입장에서 자신의 하위만 찾도록 되어있죠..
FindGlobalComponent라는것도 있긴한데 ㅎㅎ 이것의 역활은 약간 다르구요
디버깅을 하시고 또 개발을 하실때 델파이에 포함된 아주 좋은 소스들을 보는걸 게을리 하지 마시기 바랍니다. 아주 좋은소스들이구요 배울점이 많은것이니까요
또 델파이 VCL의 계층과 클래스를 이해하면 자신이 어떤 콤포넌트를 만들때도 상당한 도움이 됩니다.
윈도우즈의 api를 그냥 연결시켜놓은 함수들도 많지만 이것처럼 구현되어있는것들은 짬짬이 소스들을 들여다 보는것도 상당히 좋겠죠. 그럼.. 도움이 되셧기를..
즐코하시길...
좀더 자세히 말