Q&A

  • dbgrid에서 특정키가 눌리면 색 바꾸기
수고하십니다. *^^*



dbgrid에서 특정키가 눌리면 현재 줄 전체를 바탕색 or 글자색을 바꾸고 싶습니다.



DrawDataCell이벤트를 이용해서 바꾸면 될것 같은데...



KeyDown이벤트에서는 DrawDataCell에서 필요로 하는 파라미터를 얻을 수 없잖아여.

(ex. Rect, Field, State)



KeyDown이벤트에서 DrawDataCell이벤트를 어떻게 호출하져?

파라미터 주는것을 모르겠음



KeyDown이벤트에서...

if 특정키 then

begin

DrawDataCell(nil, nil, nil, nil);

end;

했더니 안되더라구여... 쩝



이 방법이 아니면, KeyDown이벤트에서 직접 색을 바꿀 수 있나여?



있다면 방법좀....

4  COMMENTS
  • Profile
    홍성락 2001.08.21 01:21
    irookie wrote:

    > 수고하십니다. *^^*

    >

    > dbgrid에서 특정키가 눌리면 현재 줄 전체를 바탕색 or 글자색을 바꾸고 싶습니다.

    >

    > DrawDataCell이벤트를 이용해서 바꾸면 될것 같은데...

    >

    > KeyDown이벤트에서는 DrawDataCell에서 필요로 하는 파라미터를 얻을 수 없잖아여.

    > (ex. Rect, Field, State)

    >

    > KeyDown이벤트에서 DrawDataCell이벤트를 어떻게 호출하져?

    > 파라미터 주는것을 모르겠음

    >

    > KeyDown이벤트에서...

    > if 특정키 then

    > begin

    > DrawDataCell(nil, nil, nil, nil);

    > end;

    > 했더니 안되더라구여... 쩝

    >

    > 이 방법이 아니면, KeyDown이벤트에서 직접 색을 바꿀 수 있나여?

    >

    > 있다면 방법좀.

    /////////////////////////////////////////////////////////////////////////

    아래와 같은방법도 있습니다 조금 수정해가며 사용해보세요

    예로 'Alt+A'를 누를때입니다.

    ---------------------------------------

    //DrawDataCell이벤트

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    Field: TField; State: TGridDrawState);

    begin

    with TDBGrid(Sender) do begin

    if SelectedRows.CurrentRowSelected then begin //현선택된줄만 색칠하기

    Canvas.Brush.Color := clRed;

    Canvas.Font.Color := clWhite;

    Canvas.FillRect(Rect);

    canvas.TextRect(Rect, Rect.Left, Rect.Top, Field.AsString);

    end;

    end;

    end;

    ---------------------------------------------------------------------

    //KeyDown이벤트

    //멀티선택안되며

    //Options에는 현재선택한것중 dgRowSelect와 dgEditing의 교체가 가장중요함

    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    DBGrid1.SelectedRows.Clear; //선택된 줄 초기화(따라서 멀티선택은 안됨)

    if (Key = 65) and (Shift = [ssAlt]) then begin

    DBGrid1.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgConfirmDelete,dgCancelOnExit];

    DBGrid1.SelectedRows.CurrentRowSelected := True;

    end

    else begin

    DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    end;

    end;

    -------------------------------------------------------

    //CellClick이벤트, 이는 마우스로 다른곳 클릭시 원상복귀임

    procedure TForm1.DBGrid1CellClick(Column: TColumn);

    begin

    DBGrid1.SelectedRows.Clear;

    DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    end;

  • Profile
    irookie 2001.08.21 02:43
    아래 홍성락님이 가르쳐주신데로 하면 현재의 row는 색이 바뀝니다.



    그러나, 커서를 이동하면 색이 원래대로 돌아오더군요.... ㅎㅎㅎ



    커서의 이동이 있어도 바꾼색으로 그대로 있었으면 합니다. ESC를 누르기 전까지...



    예를들어, (레코드번호로 하겠습니다.)



    1번, 5번, 9번에서 특정키를 눌렀으면 1,5,9번의 색은 무슨짓을 해도 다른곳과 색이 달라야 합니다.

    ESC가 눌리기 전까지...



    가능한 기능 이겠지요?



    제가 구현을 못하는것 뿐이겠지요?



    한수만 가르쳐 주십시요.



    그럼, 20000



    DrawDataCell이벤트는 계속 발생을 하나봐여. 아무짓도 안하고 있어도...ㅡ-;





    홍성락 wrote:

    > irookie wrote:

    > > 수고하십니다. *^^*

    > >

    > > dbgrid에서 특정키가 눌리면 현재 줄 전체를 바탕색 or 글자색을 바꾸고 싶습니다.

    > >

    > > DrawDataCell이벤트를 이용해서 바꾸면 될것 같은데...

    > >

    > > KeyDown이벤트에서는 DrawDataCell에서 필요로 하는 파라미터를 얻을 수 없잖아여.

    > > (ex. Rect, Field, State)

    > >

    > > KeyDown이벤트에서 DrawDataCell이벤트를 어떻게 호출하져?

    > > 파라미터 주는것을 모르겠음

    > >

    > > KeyDown이벤트에서...

    > > if 특정키 then

    > > begin

    > > DrawDataCell(nil, nil, nil, nil);

    > > end;

    > > 했더니 안되더라구여... 쩝

    > >

    > > 이 방법이 아니면, KeyDown이벤트에서 직접 색을 바꿀 수 있나여?

    > >

    > > 있다면 방법좀.

    > /////////////////////////////////////////////////////////////////////////

    > 아래와 같은방법도 있습니다 조금 수정해가며 사용해보세요

    > 예로 'Alt+A'를 누를때입니다.

    > ---------------------------------------

    > //DrawDataCell이벤트

    > procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    > Field: TField; State: TGridDrawState);

    > begin

    > with TDBGrid(Sender) do begin

    > if SelectedRows.CurrentRowSelected then begin //현선택된줄만 색칠하기

    > Canvas.Brush.Color := clRed;

    > Canvas.Font.Color := clWhite;

    > Canvas.FillRect(Rect);

    > canvas.TextRect(Rect, Rect.Left, Rect.Top, Field.AsString);

    > end;

    > end;

    > end;

    > ---------------------------------------------------------------------

    > //KeyDown이벤트

    > //멀티선택안되며

    > //Options에는 현재선택한것중 dgRowSelect와 dgEditing의 교체가 가장중요함

    > procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    > Shift: TShiftState);

    > begin

    > DBGrid1.SelectedRows.Clear; //선택된 줄 초기화(따라서 멀티선택은 안됨)

    > if (Key = 65) and (Shift = [ssAlt]) then begin

    > DBGrid1.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgConfirmDelete,dgCancelOnExit];

    > DBGrid1.SelectedRows.CurrentRowSelected := True;

    > end

    > else begin

    > DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    > end;

    > end;

    > -------------------------------------------------------

    > //CellClick이벤트, 이는 마우스로 다른곳 클릭시 원상복귀임

    > procedure TForm1.DBGrid1CellClick(Column: TColumn);

    > begin

    > DBGrid1.SelectedRows.Clear;

    > DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    > end;

  • Profile
    홍성락 2001.08.21 04:21
    irookie wrote:

    > 아래 홍성락님이 가르쳐주신데로 하면 현재의 row는 색이 바뀝니다.

    >

    > 그러나, 커서를 이동하면 색이 원래대로 돌아오더군요.... ㅎㅎㅎ

    >

    > 커서의 이동이 있어도 바꾼색으로 그대로 있었으면 합니다. ESC를 누르기 전까지...

    >

    > 예를들어, (레코드번호로 하겠습니다.)

    >

    > 1번, 5번, 9번에서 특정키를 눌렀으면 1,5,9번의 색은 무슨짓을 해도 다른곳과 색이 달라야 합니다.

    > ESC가 눌리기 전까지...

    >

    > 가능한 기능 이겠지요?

    >

    > 제가 구현을 못하는것 뿐이겠지요?

    >

    > 한수만 가르쳐 주십시요.

    >

    > 그럼, 20000

    >

    > DrawDataCell이벤트는 계속 발생을 하나봐여. 아무짓도 안하고 있어도...ㅡ-;

    /////////////////////////////////////////////////////////////////////////////

    먼저 말씀드린데로 해제시키는 단계를 어디로할지에 따라 멀티든 한개만하든 가능하거든요.

    즉, DBGrid1.SelectedRows.Clear를 어디에 쓰는것에 따라 달리 표현할 수 있습니다.

    DrawDataCell이벤트는 그리드의 셀을 하나하나 다시 그릴때마다 일어나므로 별도 호출을 하지않아도됩니다.

    이 이벤트는 각 셀의 모양을 바꾸거나 형식을 조정할때 Field나 State등을 상황에 따라 보일수있는 용도에도 자주쓰는 이벤트입니다.

    ---------------------------------------------------------------------------------------

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

    Field: TField; State: TGridDrawState);

    begin

    with TDBGrid(Sender) do begin

    if SelectedRows.CurrentRowSelected then begin //현선택된줄만 색칠하기

    Canvas.Brush.Color := clRed;

    Canvas.Font.Color := clWhite;

    Canvas.FillRect(Rect);

    //필드타입에 따라 다시쓰는 위치를 조정하세요. Field.DataType

    canvas.TextRect(Rect, Rect.Left, Rect.Top, Field.AsString);

    end;

    end;



    end;

    ---------------------------------------------------------------------------------------

    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if (Key = 65) and (Shift = [ssAlt]) then begin //Alt+A

    DBGrid1.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgConfirmDelete,dgCancelOnExit];

    DBGrid1.SelectedRows.CurrentRowSelected := True;

    end

    else if (Key = 27) then begin //Esc

    DBGrid1.SelectedRows.Clear;

    DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    end

    else begin

    DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];

    end;

    end;

    ---------------------------------------------------------------------------------------

    procedure TForm1.DBGrid1CellClick(Column: TColumn);

    begin

    DBGrid1.Options := [dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];



    end;

  • Profile
    irookie 2001.08.21 19:46
    홍성락님께 무한한 감사를 드립니다. *^^*



    제 프로그램 special thanks to에 이름을 올리겠습니다. ^^;



    have a nice day~~