Q&A

  • 동적생성 콤보박스의 값 저장하기..
안녕하세요..
이번 여름은 많이 덥네요..
질문은요...

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;    
//--------------------------------------------------------------//

읽어주셔서 고맙습니다..
즐거운 하루 되세요..
3  COMMENTS
  • Profile
    하얀까마귀 2004.07.26 19:57
    안녕하세요 하얀까마귀 입니다.

    님이 하신것의 문제는 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를 그냥 연결시켜놓은 함수들도 많지만 이것처럼 구현되어있는것들은 짬짬이 소스들을 들여다 보는것도 상당히 좋겠죠. 그럼.. 도움이 되셧기를..

    즐코하시길...





    좀더 자세히 말

  • Profile
    정성헌 2004.07.26 21:26
    먼저 답변주셔서 감사합니다.
    프로그램을 시작한지 얼마 되지않아서 조금힘드네요..^^;
    상세하게 설명을 해주셨는데도 말이에요...^^;

    생성시 하얀까마귀님이 말씀하신대로 작성을 했는데도 저장이 되지 않습니다.

    동적생성부분에서 name값이 동적생성된 폼name으로 들어갑니다. 이거 때문이 아닐까요?

    번거롭게 해드린거 같아 죄송합니다.

  • Profile
    하얀까마귀 2004.07.28 01:08
    안녕하세요 하얀까마귀 입니다.

    무슨말씀이신지 잘모르겠네요..

    음. 그러니까..
    동적생성하실때 주신이름 그러니까..
    name := 'cb_sil'+'00'+IntToStr(i); <-- 이넘이
    cb_sil001 이라고 하면 폼이 이이름으로 바뀐다는건가요?

    ㅎㅎ 아마 그런것 같은데.. 제 말이 맞다면..

    당연히 안되는게 맞죠.. 동적생성한 콤포넌트의 이름이 안들어가 있는데
    해당 이름으로 찾아봐야 제대로 찾아지지 않겟죠..

    with 구문을 쓰실때 조심해야 되는게 이런부분 입니다.

    그리고 가급적이면 중첩된 with문은 안쓰시는게 좋구요..

    왜냐면 지금 처럼 name 라고 했을때..
    self.name 인지 아니면 동적생성한 놈인지 컴파일러가 잘 모르니까요
    원래는 with 구문 내의것을 먼저 첵크하는게 맞는데. ㅎㅎ

    좀 귀찮더라도 다 써주시는게 좋을듯 하네요. 가끔 이런 버그가 발생을
    하거든요..

    위에서 말한 부분도 문제가 되니까 고쳐주시고 이름이 그렇게 들어간다면
    with 를 빼버리고 다시 작성하시면 되겠네요. 그럼..





    • 최용일
      2004.07.28 19:14
      안녕하세요. 최용일입니다. MDI Application을 만들때 메인폼은 반드시 FormStyle속성이 fsMDIForm인 MD...
    • 2004.07.27 22:26
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 미러
      2004.07.27 23:54
             query1.ParambyName('ymd1').AsString := ymd1;   &...
    • 2004.07.28 02:03
      혹시 쿼리의 insert부분이나 맨 마지막 부분에 파라메터에 값을 넣는부분이 잘못된건 없나요? 고치고 실행...
    • 유동기
      2004.07.28 03:25
        가능합니다. -> 아래처럼 변경해야될 거 같은데요 (:cn1, :cn2, :na, :te, :zi, :a...
    • ㉳㉥ㅗ㉣ㅐ㉧ㅛ
      2004.07.27 22:42
      옵션에 보면 멀티실렉트라는 것이 있습니다. True로 고쳐서 하면 됩니다.
    • 심윤섭
      2004.07.28 05:53
      멀티실렉트가 없네요....ㅡㅜ 다른 방법은 없는건가요.... 고수님들~~좋은 방법좀 가르쳐주십시오~
    • 최용일
      2004.07.28 19:17
      안녕하세요. 최용일입니다. 멀티셀렉트는 안되고 범위를 지정해서 하는 레인지셀렉트만 됩니다. Opti...
    • 하얀까마귀
      2004.07.28 00:50
      안녕하세요 하얀까마귀 입니다. 스트림으로 저장된걸 타입을 바꾼다고 되진 않습니다. 이건 다른거니까...
    • 이경록
      2004.07.27 22:16
      자답입니다. 볼랜드포럼의 C++ Q/A에서 찾았습니다. 파일을 올릴때 OnWorkBegin, OnWork, OnWorkEnd를 ...
    • 김양훈
    • 2004.07.27 19:45
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김진국
    • 2004.07.27 18:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김용덕
      2004.07.28 00:36
      안녕하세요. 델파이에서 함수 선언할 때 Calling Conversion이 안맞는것 같네요. export 될 때는 stdcall...
    • 전덕성
    • 2004.07.27 17:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.07.28 01:20
      안녕하세요 하얀까마귀 입니다. 프리뷰를 사용해본지 너무 오래되어서 ㅎㅎ 아마 퀵리포트사나 델파...
    • 전덕성
      2004.07.28 04:25
      답변에 감사드립니다.
    • 김진국
    • 2004.07.27 03:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.07.27 03:53
      안녕하세요. 최용일입니다. C는 대소문자를 구분합니다. 델파이에서 선언한 함수는 Read_PSN에서 psn...
    • 김진국
      2004.07.27 04:18
      정말 감사합니다. ^^ 정말 생각지도 못했는데,..  이런곳에 실수가 있었다니.. 더이상...
    • 2004.07.27 02:50
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2004.07.28 01:41
      이건 이종쿼리로 해결하면, 한방 SQL로 해결이 될 듯 한데.. 이종쿼리 사용법에 대해서 한번 조회를 해보...
    • 김기원
      2004.07.27 06:59
      그냥 a에 값을 select 해서 건건히 insert 하시는게 좋을것 같은데요.. ^^ 물론..노가다이긴 하지만... ㅡ...
    • 장덕곤
      2004.07.27 09:31
      a테이블을 스트링그리드로 조회한다음에 값을 조합하여 For 문을 돌려서 insert로 하면될거같은데요... ...
    • 김기원
      2004.07.27 07:02
      Query1.Sql.Add('insert ~ ') 이렇게 사용 하실때에는... Query1.Sql.Clear 를 앞에서 먼저 해주셔야합니...
    • 빈곤클럽야수
      2004.07.27 17:24
      여러 쿼리중...클리어를 안해준 곳이 있더군요... 감사합니다...
    • 김지훈
    • 2004.07.26 20:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Gnoses
    • 2004.07.26 19:58
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Gnoses
      2004.07.27 02:29
      TPanel 을 상속받아 Package를 만들고 그 위에 코딩으로 툴바를 올려줘야 하는군요. 헌데 문제가 하...
    • KDDG_BaSTaD
      2004.07.27 06:35
      ==> 원래 디자인 타임에 컴포넌트를 올려놓고 프로퍼티를 설정하게 되면요 폼파일에 저장되죠. DFM 글...
    • 하얀까마귀
      2004.07.26 20:02
      안녕하세요 하얀까마귀 입니다. 실행파일의 실행단계에서 그런에러가 난다면 런타임 패키지 설정을 하신...
    • 술한잔기울이며
      2004.07.26 22:50
      답변 진심으로 감사드립니다. 그런데 제가 지금 만지고 있는 프로그램이 저희 프로그램의 작은 부분을 차...
    • 하얀까마귀
      2004.07.28 01:03
      안녕하세요 하얀까마귀 입니다. 말씀대로. 런타임패키지는 용량을 줄일수 있기 때문에 꼭 필요한 경우에...
    • 정성헌
    • 2004.07.26 19:17
    • 3 COMMENTS
    • /
    • 1 LIKES
    • 하얀까마귀
      2004.07.26 19:57
      안녕하세요 하얀까마귀 입니다. 님이 하신것의 문제는 FindComponent 함수의 기능을 조금 잘못쓰신것이...
    • 정성헌
      2004.07.26 21:26
      먼저 답변주셔서 감사합니다. 프로그램을 시작한지 얼마 되지않아서 조금힘드네요..^^; 상세하게 설명을 ...
    • 하얀까마귀
      2004.07.28 01:08
      안녕하세요 하얀까마귀 입니다. 무슨말씀이신지 잘모르겠네요.. 음. 그러니까.. 동적생성하실때 주...
    • 최두승
    • 2004.07.26 08:20
    • 0 COMMENTS
    • /
    • 0 LIKES