StringGrid - criando uma com uma combobox la dentro

Top  Previous  Next

{How to dynamically create a Combobox within a Cell of a StringGrid 

 

Answer:

 

 

You need a descendent of TStringgrid that properly reflects WM_COMMAND to 

embedded controls. The standard grid does not do it since it is not intended 

to play parent to other controls. 

 

Additionaly simply declare a Set- and GetMethod to access the items of die combobox 

 

 

}

unit BWControlStringGrid; 

 

interface 

 

uses 

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 

  Grids,stdctrls; 

 

type 

  TBWControlStringGrid = class(TStringGrid) 

  private 

    fComboBox:TCombobox; 

    Procedure WMCommand( var msg: TWMCommand ); message WM_COMMAND; 

    procedure DblClick;override; 

    procedure Click;override; 

    procedure RelocateComboBox; 

    procedure HideCombobox; 

  protected 

    procedure KeyPress(var Key: Char); override; 

  public 

    Constructor Create(AOWner:TComponent);override; 

    Destructor Destroy;override; 

  published 

  end

 

procedure Register; 

 

implementation 

 

procedure Register; 

begin 

  RegisterComponents('hEaDRoOm', [TBWControlStringGrid]); 

end

procedure TBWControlStringGrid.WMCommand(var msg: TWMCommand); 

begin 

  If EditorMode and ( msg.Ctl = fComboBox.Handle ) Then 

    inherited 

  Else 

    If msg.Ctl <> 0 Then 

      msg.result := 

        SendMessage( msg.ctl, CN_COMMAND, 

                     TMessage(msg).wparam, 

                     TMessage(msg).lparam ); 

end

procedure TBWControlStringGrid.KeyPress(var Key: Char); 

begin 

  if Key=#13 then 

    RelocateComboBox 

   else HideCombobox; 

 

end

procedure TBWControlStringGrid.DblClick; 

begin 

  inherited; 

  RelocateComboBox; 

end

procedure TBWControlStringGrid.Click; 

begin 

  inherited; 

  HideCombobox; 

end

procedure TBWControlStringGrid.RelocateComboBox; 

begin 

  fcombobox.boundsrect := CellRect( Selection.Left, Selection.Top); 

  fcomboBox.Visible:=TRUE; 

  fcombobox.setfocus; 

end

procedure TBWControlStringGrid.HideCombobox; 

begin 

  fcomboBox.Visible:=false; 

end

Constructor TBWControlStringGrid.Create(AOWner:TComponent); 

begin 

  inherited Create(Aowner); 

  fComboBox:=TComboBox.Create(self); 

  fComboBox.Parent:=self; 

  fComboBox.Visible:=FALSE; 

  Options:=Options-[goRangeSelect]; 

end

Destructor TBWControlStringGrid.Destroy; 

begin 

  fComboBox.Destroy; 

  inherited destroy; 

end

 

 

 

end