Q&A

  • [질문] cxGrid에서 OnContextPopup 이벤트 처리시
기존에 AdvStringGrid를 사용해서 만든걸 cxGrid로 변환 작업 중에 있습니다.
(코드를 못 알아보면 가르쳐 달라던가 할것이지... 쩝... 망할 20년차 코볼 실장...ㅡ_ㅡ)

처음 접하다 보니 영 적응이 안되서 헤메다가 일단 처리는 다해놨는데

좀 찝찝한 부분이 하나 남아서 문의 드립니다.

cxGrid에서 팝업메뉴를 띄우면 GridDBTableView의 OnCellClick 이벤트를 태우고

그에 따라서 팝업메뉴의 아이템에 Caption을 변경해서 보여주도록 할려고 합니다.

헌데... OnContextPopup 이벤트 중에 마우스 위치에 따른 cxGrid의 Row 혹은 Record 값을 지정하는게

어떤건지 모르겠습니다.

TcxGridDBTableView.GetHitTest에 나오는 ViewInfo에 뭔가 있을 줄 알았는데 안보이고...;

cxGrid의 OnContextPopup 이벤트에서

마우스가 눌러진 위치의 RowIndex나 RecordIndex를 알 수 있는지요?

조언 좀 부탁 드립니다.

현재는 꽁수로 아래와 같이 해결해 놨습니다.

<!--CodeS-->
procedure TfrmTest.cxGrid1ContextPopup(Sender: TObject;
  MousePos: TPoint; var Handled: Boolean);
begin
  Handled := True;
end;

procedure TfrmTest.tvcxGrid1CellClick(Sender: TcxCustomGridTableView;
  ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
  AShift: TShiftState; var AHandled: Boolean);
var
  PMousePos: TPoint;
begin
  try
    { 이것 저것 께작 께작...}

    GetCursorPos(PMousePos);
    if GetAsyncKeyState( VK_RBUTTON ) = 1 then
      pmMain.Popup(PMousePos.X, PMousePos.Y);
  except
  end;
end;
<!--CodeE-->
2  COMMENTS
  • Profile
    phono 2009.03.06 23:08
    퀀텀 cxDBGrid를 사용하셨다면..

    어짜피 그리드 조작시 DataSource에 연결된 DataSet이 갱신되므로..

    이것을 직접 핸들링 하면 됩니다. ^^
  • Profile
    소울해커 2009.03.06 23:46
    음... 순서를 말씀드리자면

    마우스오른쪽 클릭 -> 그리드 레코드 값 컨트롤에 표시(셀클릭 이벤트) -> 팝업메뉴 캡션 변경 -> 팝업메뉴보이기 -> 팝업메뉴닫힘

    이렇게 진행하고자 합니다.

    헌데 ContextPopup 이벤트를 통해서 처리할려고 하니

    마우스오른쪽 클릭 -> 팝업메뉴보이기 -> 팝업메뉴닫힘 -> 그리드 레코드 값 컨트롤에 표시(셀클릭 이벤트) -> (팝업메뉴 캡션 변경 - 다음번 팝업시에 변경된 캡션 보임)

    이렇게 처리가 되더라구요.

    즉, 그리드에 ContextPopup이벤트에선 마우스오른쪽클릭이 되면 셀클릭 이벤트가 먼저 진행되지 않고 팝업이 열리고 닫힌 후에야 진행이 된다는 겁니다.

    그래서 그리드에 마우스 눌려졌을 때 코딩으로 셀크릭이벤트를 먼저 진행시키기 위해 마우스 위치 만으로 레코드인덱스나 로우인덱스 값을 알고자 했습니다.

    그냥 MouseDown에서 처리해 버려도 되겠지만 ContextPopup 이벤트에서 처리했으면 하는 바램이 있어서요. ㅎㅎ