Board index » delphi » TAB Key (pertaining to floating edit/combo boxes in TStringGrid)

TAB Key (pertaining to floating edit/combo boxes in TStringGrid)

I have successfully embedded some HexNeg (my modified version of TEdit)
and a regular ComboBox into the cells of a TString Grid.  To be exact,
when a cell in a certain column is selected, a ComboBox becomes visible
and is moved to the position of that cell.  Also, the focus is then
moved to the ComboBox, so that the characters typed go to the ComboBox.
The last thing I do is copy any changes to the ComboBox to the
underlying cell, so that they have the same data.  Normally  (as long as
goTab is true) you can tab from cell to cell within a TStringGrid.  But,
now when a ComboBox is selected, the tab (as you might guess, since it's
not a part of the Grid), moves from object to object within the form (to
other grids, edit boxes, etc.

What event is triggered by the TAB key?  And if i find an event to
capture it, will doing a  SendMessage (of WM_Char type) to the grid
solve the problem?  Right now, I can't even find an event to trigger the
tab key.  I've tried, for example, handling keypress and keydown within
ComboBox (that's where the focus is), and tried within the form.  But,
the tab key doesn't even trigger these events, so the handler is never
run.

Any help that you can offer would be much appreciated.

Matt Phillips

 

Re:TAB Key (pertaining to floating edit/combo boxes in TStringGrid)


Quote
> I have successfully embedded some HexNeg (my modified version of TEdit)
> and a regular ComboBox into the cells of a TString Grid.  To be exact,
> when a cell in a certain column is selected, a ComboBox becomes visible
> and is moved to the position of that cell.  Also, the focus is then
> moved to the ComboBox, so that the characters typed go to the ComboBox.
> The last thing I do is copy any changes to the ComboBox to the
> underlying cell, so that they have the same data.  Normally  (as long as
> goTab is true) you can tab from cell to cell within a TStringGrid.  But,
> now when a ComboBox is selected, the tab (as you might guess, since it's
> not a part of the Grid), moves from object to object within the form (to
> other grids, edit boxes, etc.

Matt, see following example.

Attach a combobox to a stringgrid column

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ComboBox1: TComboBox;
    procedure ComboBox1Exit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private declarations }
    Procedure CMDialogKey( Var msg: TCMDialogKey );
      message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
  If Activecontrol = Combobox1 Then Begin
    If msg.CharCode = VK_TAB Then Begin
      // set focus back to the grid and pass the tab key to it
      stringgrid1.setfocus;
      stringgrid1.perform( WM_KEYDOWN, msg.charcode, msg.keydata );
      // swallow this message
      msg.result := 1;
      Exit;
    End;
  End;
  inherited;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  with sender as TCombobox do begin
    hide;
    if itemindex >= 0 then
      with stringgrid1 do
        cells[ col, row ] := items[itemindex];
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  combobox1.visible := false;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  R: TRect;
  org: TPoint;
begin
  With Sender As TStringgrid Do
    If (ACol = 2) and (ARow >= FixedRows) Then Begin
      // entered the column associated to the combobox
      // get grid out of selection mode
      perform( WM_CANCELMODE, 0, 0 );
      // position the control on top of the cell
      R := CellRect( Acol, Arow );
      org:= Self.ScreenToClient( ClientToScreen( R.topleft ));
      With combobox1 do begin
        setbounds( org.X, org.Y, r.right-r.left, height );
        itemindex := Items.IndexOf( Cells[ acol, arow ] );
        Show;
        BringTofront;
        // focus the combobox and drop down the list
        SetFocus;
        DroppedDown := true;
      end;
    End;
end;

end.

Peter Below (TeamB)  100113.1...@compuserve.com)
No e-mail responses, please, unless explicitly requested!

Other Threads