Q&A

  • 스트링그리드에 콤보박스 넣기
스트링그리드에 콤보를 넣고 싶으데 어떻게 하나요.
12  COMMENTS
  • Profile
    홍성락 2009.10.06 23:14
    '스트링 그리드 콤보 박스' 검색해도 많이 나오는데요....자료실에 제가 예전에 올린 테스트 소스도 있습니다
    방법에 따라 여러가질 생각해볼수 있습니다
    1. 여러줄에 동시에 콤보객체를 생성해서 그려 넣기
    2. 선택시에만 해당 셀에만 콤보객체를 생성해서 그려 넣기
    3. 실제 콤보박스하나가 있고, 선택시에만 해당 셀에 살짝 올려 놓기
    ...등등입니다
  • Profile
    강중규 2009.10.07 05:45
    답변 감사합니다.
    그런데, 버튼을 하나 만들고, 버튼을 누르면 쇼메시지에 보이게는 어떻게 하죠.
    showmessage(test_grkd.objects[1,test_gred.row]);
  • Profile
    홍성락 2009.10.07 18:20
    객체를 Tcombobox형으로 해서 읽어보세요
    showmessage( Tcombobox(test_gred.objects[1,test_gred.row]).Text );
  • Profile
    강중규 2009.10.07 18:54
    감사합니다.

    그건 해결을 했습니다.
    그런데, 콤보박스의 목록중 하나를 선택하면, 그리드의 콤보박스가 사라지고 현재 선택한 내용을 셀에 저장하려고 하는데 영 안되내요.

    *** 소스 ***

    procedure TForm1.test_gridClick(Sender: TObject);
    var
    Rect: TRect;
    begin
    test_grid.Objects[1,test_grid.Row] := Tcombobox.Create(test_grid); //////
    with Tcombobox(test_grid.objects[1,test_grid.Row]) do
    begin
    parent := test_grid; ////
    Rect:=test_grid.cellrect(1,test_grid.Row);
    if (Rect.Top<=0)then
    Visible := False;
    boundsrect := Rect;
    width := test_grid.colwidths[2]; //CBpart_state.//
    height := test_grid.rowheights[2];
    Style := csDropDownList;

    ClientHeight:=100;
    //=====================================================================
    items.add('첫번째 자료');
    items.add('두번째 자료');

    end;
    test_grid.cells[1,test_grid.row] := Tcombobox(test_grid.objects[1 ,test_grid.Row]).Text
    end;


    test_grid.cells[1,test_grid.row] := Tcombobox(test_grid.objects[1 ,test_grid.Row]).Text
    위의 코딩을 넣어서 할려고 하는데......
  • Profile
    홍성락 2009.10.07 22:18
    조금 수정했습니다
    1. 한번만 생성되도록
    2. 동적 콤보박스 생성시 부모가 윈도우 클래스냐에 따라 이벤트가 되고 안되고 하므로 폼을 부모로함
    3. 스트링그리드에 넣기위해 체인지 이벤트 사용
    procedure TForm1.test_gridClick(Sender: TObject);
    var
    Rect: TRect;
    i : integer;
    gridOriginXY: TPoint;
    begin
    //나머지는 안보이게함
    for i := 1 to test_grid.RowCount-1 do
    if (test_grid.Objects[1,i] is TComboBox) then
    TComboBox(test_grid.Objects[1,i]).Visible := False;

    if test_grid.Col = 1 then begin
    //한번만 생성하도록합니다
    if (test_grid.Objects[1,test_grid.Row] is TComboBox = False) then begin
    //test_grid.Parent가 윈도우상속인걸 선택 여기선 메임폼으로함
    //(동적 생성 콤보박스의 OnChange이벤트를 위하여)
    test_grid.Objects[1,test_grid.Row] := Tcombobox.Create(Form1);
    with Tcombobox(test_grid.objects[1,test_grid.Row]) do
    begin
    OnChange := MyComboBoxChange;
    parent := Form1;
    Style := csDropDownList;
    //=====================================================================
    items.add('첫번째 자료');
    items.add('두번째 자료');
    end;

    end;
    if (test_grid.Objects[1,test_grid.Row] is TComboBox = True) then begin
    with Tcombobox(test_grid.objects[1,test_grid.Row]) do
    begin
    Rect:=test_grid.cellrect(1,test_grid.Row);
    if parent <> test_grid then begin
    gridOriginXY := test_grid.ClientToParent( Point(Rect.Left, Rect.Top) );
    Left := gridOriginXY.X + GetSystemMetrics(SM_CXEDGE);
    Top := gridOriginXY.Y + GetSystemMetrics(SM_CYEDGE);
    end
    else begin
    boundsrect := Rect;
    end;
    width := test_grid.colwidths[2]; //CBpart_state.//
    height := test_grid.rowheights[2];
    ClientHeight:=100;
    //먼저 선택된 텍스트를 선택하게함
    ItemIndex := Items.IndexOf(test_grid.Cells[test_grid.Col, test_grid.Row]);
    if (Rect.Top<=0)then
    Visible := False
    else
    Visible := True;
    end;
    end;
    end;
    end;
    //동적 생성 콤보박스의 OnChange이벤트
    //메인폼 class에 설정을 하세요
    procedure TForm1.MyComboBoxChange(Sender: TObject);
    begin
    test_grid.Cells[test_grid.Col, test_grid.Row] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex];
    TComboBox(Sender).Visible := false;
    end;
  • Profile
    강중규 2009.10.08 05:24
    답변 감사합니다.
    procedure TForm1.MyComboBoxChange(Sender: TObject);
    begin
    test_grid.Cells[test_grid.Col, test_grid.Row] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex];
    TComboBox(Sender).Visible := false;
    end;
    위와 같이 코딩을 하고 하니 되내요. 그런데 콤보박스 사라지지 않고, 다음 행으로 가니 그재서야 사라지내요.
  • Profile
    홍성락 2009.10.08 05:54
    스트링 그리드의 OnClick에서 처리하신다고 하지 않나요. OnClick이라면 MyComboBoxChange 이후 사라질거고, 마약 마우스 MOVE시 사라지게 할려면 MOVE이벤트에서 자동으로 Visible := False 하도록 하시면 됩니다.
    OnDrawCell이라면 포커스가 있는 동안 계속 그리니 Visible := True를 별도 니벤트에서 처리하던가 MyComboBoxChange 이후 다른 셀로 이동시키는 소스를 추가 해보세요.
  • Profile
    강중규 2009.10.08 06:32
    콤보박스의 목록에서 하나를 선택하면 콤보박스가 사라져야 하는데 사라지지 안내요.
    TComboBox(Test_grid.Objects[1,Test_grid.row]).Visible := True;
    이면 될것 같은데 아무리해도 ......
  • Profile
    홍성락 2009.10.08 20:53
    OnChange이벤트를 타는지 확인해보세요....동적으로 생성한 콤보는 위 처럼 부모가 달라야합니다.
    그리고 스트링 그리드의 OnDrawCell에 코딩하셨는지 확인해보세요....위 처럼하면 저는 되던데...아니면 간단히 소스 실행 가능하게 올려보세요
  • Profile
    강중규 2009.10.09 04:58
    소스와 실행화일을 올렸습니다.
  • Profile
    홍성락 2009.10.09 05:12
    제 말이 맞는거 같은데요. 스트링 그리드의 OnDrawCell에도 2중 코딩이 되어 있네요....
    Rate_GridDrawCell에서 Tcombobox에 관한 불필요(OnClick과 중복된) 소스는 정리하시면 됩니다. 특히 다시 보인다는 건 Tcombobox(Rate_grid.objects[0 ,Rate_grid.Row]).Visible := True; 부분의 소스를 제거 하시면 됩니다.
    스트링 그리드의 OnClick은 말 그대로 클릭시만 발생하지만, OnDrawCell는 열과 컬럼, 그리고 계속 변환를 다시 그릴때 계속 반복해서 도는겁니다. 즉 콤보에서 OnChange후 자신이 보이지 않게하고 잘 끝냈는데 그리드의 OnDrawCell는 계속 다시 표시하는거네요...
  • Profile
    강중규 2009.10.09 05:40
    감사합니다.
    Tcombobox(Rate_grid.objects[0 ,Rate_grid.Row]).Visible := True;이 부분을 삭제하니 되내요.
    즐거운 밤 되새요.

    • cdrd
    • 2009.10.14 18:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 아르스
    • 2009.10.13 19:57
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 초보임당
      2009.11.10 05:34
      흠...저도 그문제 때문에 골치가 좀 아팠는데요.. 리모트 데이터모듈 소스 보시면 updateRegistry ...
    • 초보임당
      2009.11.18 18:20
      리모트데이터모듈 을 등록하는 방법을 알아냈네요.. 그냥 exe 화일을 실행하지 마시고.. 실행시 실...
    • 아르스
      2009.11.27 22:51
      감사합니다 ^^ 레지스트리에 강제로 등록하는 프로그램을 만들어서 등록을 했었는데 /regserver ...
    • 강중규
    • 2009.10.13 18:49
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2009.10.16 19:45
      TMemo 의 OnMouseUp 이벤트에서 마우스 우클릭이 일어났을때 캐럿의 위치를 저장하고, 숨겨두었던 TStri...
    • 강중규
      2009.10.17 02:39
      procedure TSangSik_Get.ContentMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState...
    • 구창민
      2009.10.20 03:21
      메모장에서 우클릭시 컨텍스트 메뉴가 안나오게 하고 싶단 의미라면.. 아래처럼 TMemo 의 ContextPopup...
    • 강중규
      2009.10.20 07:11
      감사합니다. 컨텍스트 메뉴가 안나오게 하고 싶었거든요. 그런데, 우클릭시 스트링그리드가 나오고, 그...
    • 강중규
      2009.10.20 16:18
      Content.SetSelTextBuf()를 사용하니 되내요. 그런데, 스트링그리의 목록중 하나를 했을때의 코딩 Cont...
    • 구창민
      2009.10.20 18:22
      델파이 7 버전이신가봐요? SetSelTextBuf 는 아마도 인자가 PAnsiChar 이어서 그럴겁니다. code_grid....
    • 강중규
      2009.10.21 16:37
      답변 감사합니다. 위와 같이 하니 되내요. 즐거운 하루 되세요.
    • 이강석
    • 2009.10.13 02:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2009.10.16 03:51
      관련 내용을 팁게시판에 올려둘께요 참고하시기 바랍니다. 그럼 즐거운 프로그래밍 하시구요~
    • 백록화
      2009.10.13 18:55
      해당 url을 호출하고 완료되는 시점을 확인하실려는것인가요? 아님 그 결과값을 알고자 하시는것인지?? ...
    • ▷◁병부잡이
      2009.10.13 19:52
      var s : string; begin s := IdHTTP1.Get('http://222.122.111.123/pb_reg.jsp?aid=abc&pwd=1234'...
    • phono
      2009.10.10 02:50
      단순히 시간을 클라이언트에 set 하는 방법은 NET TIME \\서버명 /SET /YES 로 하시면 되는데 ...
    • 윤중현
      2009.10.10 03:19
      와우~ 저희 회사에도 도움이 되겠는데요~ 저도 플리즈~~ 헬 ~~ 프~~ 미~~ ^^;; 도움이 안되는 댓글 죄송...
    • 강중규
    • 2009.10.07 22:02
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박종철
    • 2009.10.07 19:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박종철
      2009.10.07 19:21
      어이쿠 자답입니다. ISNULL에다가 ''만 넣었네요... ㅠ_ㅠ 왜 이런 실수를 했을까... ''''로 변경...
    • 강중규
    • 2009.10.06 20:22
    • 12 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2009.10.06 23:14
      '스트링 그리드 콤보 박스' 검색해도 많이 나오는데요....자료실에 제가 예전에 올린 테스트 소스도 있습...
    • 강중규
      2009.10.07 05:45
      답변 감사합니다. 그런데, 버튼을 하나 만들고, 버튼을 누르면 쇼메시지에 보이게는 어떻게 하죠. show...
    • 홍성락
      2009.10.07 18:20
      객체를 Tcombobox형으로 해서 읽어보세요 showmessage( Tcombobox(test_gred.objects[1,test_gred.row])...
    • 강중규
      2009.10.07 18:54
      감사합니다. 그건 해결을 했습니다. 그런데, 콤보박스의 목록중 하나를 선택하면, 그리드의 콤보박스...
    • 홍성락
      2009.10.07 22:18
      조금 수정했습니다 1. 한번만 생성되도록 2. 동적 콤보박스 생성시 부모가 윈도우 클래스냐에 따라 이...
    • 강중규
      2009.10.08 05:24
      답변 감사합니다. procedure TForm1.MyComboBoxChange(Sender: TObject); begin test_grid.Cell...
    • 홍성락
      2009.10.08 05:54
      스트링 그리드의 OnClick에서 처리하신다고 하지 않나요. OnClick이라면 MyComboBoxChange 이후 사라질거...
    • • • •
    • 최용일
      2009.10.06 04:18
      그냥 정수로 바꾸시면 될듯하네요. ...+#$30+#$ㅁㅁ+#$67+... ...+#$30+Char(StrToInt(Edit1.Text))+...
    • 오델로
      2009.10.06 17:39
      답변과 관심 감사드리구요 제가 생각하는건 만약 13을 입력하면 1과3으로 분리한후 ...+#$ㅅㅅ+#$...
    • 홍성락
      2009.10.06 21:01
      # 는 ASC코드로, $ 는 16진수를 10진수로.... #$20는 $20(16진수 20을 10진수값 32)의 아스키코드...
    • 오델로
      2009.10.07 03:27
      최용일님 말씀처럼 해보면 ...+#$30+Char(StrToInt(Edit1.Text))+#$67+... 요부분에서 [Pascal ...
    • 최용일
      2009.10.07 03:59
      1의 헥사값 31이 mm에들어가고 3의 헥사값 34이 ss자리에 들어가도록 하고싶습니다.... 위 질문대로라...
    • 홍성락
      2009.10.07 04:09
      mm은 Char형이구요. 1과 3의 헥사를 구해 넘긴다면 Chr와 StrToint와 '$' + IntToHex() 등등을 사용하겠...
    • 김홍균
      2009.10.07 14:27
      보낼 때 var ss : word; H_ss, L_ss : word; begin ss :=strtoint('$'+(Edit1.Text)); // ...
    • • • •
    • 배경
    • 2009.10.02 00:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Elpira
    • 2009.10.01 21:13
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정경철
    • 2009.10.01 16:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 오병주
      2009.10.14 01:55
      미들웨어는 그냥 CORBA로 사용해도 충분히 될것은데요 그리고 데몬프로그램은 소켓통신을 이용하는게 제...
    • cdrd
    • 2009.10.01 01:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • cdrd
      2009.10.01 20:15
      아래와 같이 함수를 수정하였습니다. 결국 유니코드 문제였습니다. <!--CodeS--> function IP...
    • 김동원
    • 2009.09.30 08:11
    • 3 COMMENTS
    • /
    • 0 LIKES
    • phono
      2009.09.30 22:12
      procedure DB_Open(adoConnect: TADOConnection; CONNECT_ADDR: string); var DBPW: string; i...
    • 김동원
      2009.10.05 22:49
      대단히 감사합니다. 정말 귀한 정보 감사드립니다.
    • phono
      2009.10.05 23:54
      GetDBCONNID, GetDBCONNDB, GetDBCONNPW는 제가 임의 사용하는 함수 입니다. SQL서버에 등록한 ID, 생...
    • 한만희
    • 2009.09.30 02:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 엽기블랙
      2009.09.30 18:59
      DoubleBuffered := TRUE; 델파이에서는 하시면 대부분 해결됩니다.