刚才问错了!我想问如何在TStringGrid里的cell里使用其他控件!如ComboBox.

ajun21cn 2002-07-08 02:58:51
急!!!
...全文
39 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysmstoneman 2002-07-08
  • 打赏
  • 举报
回复
好,收藏了
winder_008 2002-07-08
  • 打赏
  • 举报
回复
看看这个 在dbgrid下的加成checkbox
procedure Tfrmsysset.DBGrid1DrawDataCell(Sender: TObject;
const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if not (gdFocused in state) then exit
else
begin
with dbcheckbox1 do
if (dbgrid1.SelectedField.FieldName=datafield) then
begin
left:=Rect.Left+dbgrid1.Left;
top:=rect.Top+dbgrid1.Top;
width:=rect.Right-rect.Left;
height:=rect.Bottom-rect.Top;
visible:=true;
end;
end;
end;
ihihonline 2002-07-08
  • 打赏
  • 举报
回复
动态的要给它给onExit事件,其实还是将静态的写,动态的给地址,差不多的
你看吧;
ihihonline 2002-07-08
  • 打赏
  • 举报
回复
动态的要给它给onExit事件,其实还是将静态的写,动态的给地址,差不多的
你看吧;
ihihonline 2002-07-08
  • 打赏
  • 举报
回复
嘻嘻,可以,可以,当然可以啦;如:
var
ComV : TComboBox;
begin
....
ComV := TComboBox.Create(Self);
ComV.Top := ..;
ComV.Left := ..;
ComV.width := ..;
.....
用到StringGrid里边应该更好,就不用写那么多的语句了,你自己整理一下
end;
ajun21cn 2002-07-08
  • 打赏
  • 举报
回复

请问为什么不动态创建的控件呢?
不可以吗?
谁给出动态多多给分
ajun21cn 2002-07-08
  • 打赏
  • 举报
回复
马上给分!!!
请问为什么不动态创建的控件呢?
不可以吗?
ihihonline 2002-07-08
  • 打赏
  • 举报
回复
procedure Tfgsspdbdform.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var n,s:integer;
begin
if x<25 then
begin
n:=stringgrid1.Row;
stringgrid1.Cells[0,n]:=inttostr(n+1);
end;
combobox5.Visible :=false;
combobox10.Visible :=false;
combobox7.Visible :=false;
combobox6.Visible :=false;
combobox8.Visible :=false;
if (x>25) and (x<77) then
begin
combobox5.Visible :=true;
combobox10.Visible :=false;
combobox7.Visible :=false;
combobox6.Visible :=false;
combobox8.Visible :=false;
end;
if (x>77) and (x<148) then
begin
combobox10.Visible :=true;
combobox6.Visible :=false;
combobox7.Visible :=false;
combobox8.Visible :=false;
combobox5.Visible :=false;
end;
if (x>148) and (x<220) then
begin
combobox10.Visible :=false;
combobox6.Visible :=true;
combobox5.Visible :=false;
combobox7.Visible :=false;
combobox8.Visible :=false;
end;
if (x>221) and (x<378) then
begin
combobox5.Visible :=false;
combobox8.Visible :=true;
combobox7.Visible :=false;
combobox6.Visible :=false;
combobox10.Visible :=false;
end;
if (x>637) and (x<676) then
begin
combobox10.Visible :=false;
combobox5.Visible :=false;
combobox6.Visible :=false;
combobox7.Visible :=true;
combobox8.Visible :=false;
end;
s:=y div 22 ;
combobox5.Top :=172+s*22;
combobox6.top:=combobox5.Top ;
combobox7.Top :=combobox5.Top ;
combobox8.Top :=combobox5.Top ;
combobox10.Top :=combobox5.top;
end;
------
procedure Tfgsspdbdform.ComboBox5Exit(Sender: TObject);
var n:integer;
begin
n:=stringgrid1.row;
stringgrid1.Cells[1,n]:=combobox5.Text ;
combobox5.Visible :=false;
end;

procedure Tfgsspdbdform.ComboBox6Exit(Sender: TObject);
var n:integer;
begin
n:=stringgrid1.row;
if combobox6.text<>'' then stringgrid1.Cells[3,n]:=combobox6.Text ;
combobox6.text:='';
combobox6.Visible :=false;
end;

procedure Tfgsspdbdform.ComboBox7Exit(Sender: TObject);
var n:integer;
begin
n:=stringgrid1.row;
if combobox7.text<>'' then stringgrid1.Cells[10,n]:=combobox7.Text ;
combobox7.Visible :=false;
end;
huangcf 2002-07-08
  • 打赏
  • 举报
回复
首先放一Panel1,在此Panel1上放一SpeedButton,然后设置Panel1的AutoSize为TRUE;
Panel1的BevelOuter为bvNone,目的使这个Panel1彻底地没有留下痕迹。
再在FROM上放ComboBox1,在它的Items属性上随便放些值。

//设置StringGrid的Column要显示的字符。
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Rows[0].Add('for you want');
StringGrid1.Rows[0].Add('測試標准');
StringGrid1.Rows[0].Add('panel');
end;
//在StringGrid的自画事件中,将两个控件摆到StringGrid相应的Cells中
//Panel1.Top:=Rect.Top+StringGrid1.Top+2中的“+2”无非是使控件显示的位置更加准确。
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (gdFocused in State) then
begin
if (StringGrid1.Cells[Acol,0]='測試標准') then
begin
ComboBox1.Left:=Rect.Left+StringGrid1.Left;
ComboBox1.Top:=Rect.Top+StringGrid1.Top+3;
ComboBox1.Width:=Rect.Right-Rect.Left+2;
ComboBox1.Visible:=true;
ComboBox1.SetFocus;
ComboBox1.Text:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row];
end
else
ComboBox1.Visible := False;
if (StringGrid1.Cells[Acol,0]='panel') then
begin
Panel1.Left:=Rect.Right + StringGrid1.Left - Panel1.Width;
Panel1.Top:=Rect.Top+StringGrid1.Top+2;
Panel1.Height:=Rect.Bottom-Rect.Top;
Panel1.Visible:=True;
end
else
Panel1.Visible := False;
end;
end;
//将选取到的ComboBox值赋值到StringGrid相应的Cells中。
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=ComboBox1.Items[ComboBox1.ItemIndex];
end;
ihihonline 2002-07-08
  • 打赏
  • 举报
回复
每次都给分?那就试一试喽
netlib 2002-07-08
  • 打赏
  • 举报
回复
这是一个向TDBGrid中添加的例子,希望对你有帮助。
/////////////////////////////////////////////////////
Delphi中向TDBGrid添加组件是一件十分麻烦的事情。笔者在这里向大家介绍一种利用WIN32 API函数在TDBGRID中嵌入CHECKBOX组件的方法。

  TDBGrid部件是用于显示和编辑数据库表中记录信息的重要部件,它是我们在程序设计过程中要经常使用的一个强有力的工具。TDBGrid具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid部件中有很多重要的属性,我们在这里重点介绍Option属性和DefaultDrawing属性,其他属性及其设置方法请参看联机帮助文件。

  Options属性:它是TDBGrid部件的一个扩展属性,在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性。

  DefalultDrawing属性:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为True,也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制。如果DefaulDrawing属性被设置为False,Delphi不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序以用于绘制各网格单元和其中的数据。

  需要注意的是,当一个布尔字段得到焦点时,TDBGrid.Options中的 gdEditing属性不能被设置成为可编辑模式。另外,TDBGrid.DefaultDrawing属性不要设置为FALSE,否则,就不能得到网格中画布属性的句柄。

  程序设计开始时就应考虑:需要设定一变量来存储原始的 TDBGrid.Options的所有属性值。这样,当一boolean字段所在栏得到焦点时将要关闭TDBGrid.Options中gdEditing的可编辑模式。与此相对应,若该栏失去焦点时,就要重新恢复原始的 TDBGrid.Options的所有属性值。

  在实例中可以通过鼠标点击或敲打空格键改变布尔值,这样就需要触发TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因为这两个事件都是改变单元格中逻辑字段的布尔值,所以为了减少代码的重复最好创建一个私有过程(SaveBoolean;)来完成逻辑值的输入,以后,在不同的事件中调用此过程即可。

  对 TDBGrid.OnDrawColumnCell事件的处理是整个程序的关键。处理嵌入组件的显示的传统方法是:在表单上实际添加组件对象,然后对组件的位置属性与网格中单元格的位置属性进行调整,以达到嵌入的视觉效果。这种方法虽然可行但代码量大,实际运行时控制性很差。笔者采用的方法是充分利用WIN32 API函数:DrawFrameControl(),由于此函数可以直接画出Checkbox组件,所以就无须在表单中实际添加组件。如何使用API函数:DrawFrameControl()是本程序技巧所在。

  在TDBGrid.OnDrawColumnCell事件中,我想大家会注意到:设定一个整型数组常数,而这个返回的整数值是与布尔值相一致的,如果字段是逻辑字段,则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,从而实现了Checkbox组件在网格中的嵌入效果。

  源代码如下:

  type

   TForm1 = class(TForm)

    DataSource1: TDataSource;

    Table1: TTable;

    DBGrid1: TDBGrid;

    procedure DBGrid1DrawColumnCell(Sender: TObject;

          const Rect: TRect; DataCol: Integer;

          Column: TColumn; State: TGridDrawState);

    procedure DBGrid1ColEnter(Sender: TObject);

    procedure DBGrid1ColExit(Sender: TObject);

    procedure DBGrid1CellClick(Column: TColumn);

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

          Shift: TShiftState);

   private

    { Private declarations }

    OriginalOptions : TDBGridOptions;

    procedure SaveBoolean;

   public

    { Public declarations }

   end;

  

  {...}

  procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;

           const Rect: TRect; DataCol: Integer;

           Column: TColumn; State: TGridDrawState);

  const

   // 这个整数值将按照布尔值返回,并送入数组

   CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,

           DFCS_BUTTONCHECK or DFCS_CHECKED);

  begin

   //确保只有在逻辑字段才能插入组件

   if Column.Field.DataType = ftBoolean then

   begin

    DBGrid1.Canvas.FillRect(Rect);

    DrawFrameControl(DBGrid1.Canvas.Handle,

             Rect,

             DFC_BUTTON,

             CtrlState[Column.Field.AsBoolean]);

   end;

  end;

  

  procedure TForm1.DBGrid1ColEnter(Sender: TObject);

  begin

   // 确保该栏是逻辑字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

   begin

    OriginalOptions := DBGrid1.Options;

    DBGrid1.Options := DBGrid1.Options - [dgEditing];

   end;

  end;

  

  procedure TForm1.DBGrid1ColExit(Sender: TObject);

  begin

   //确保该栏是逻辑字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

    DBGrid1.Options := OriginalOptions;

  end;

  

  procedure TForm1.DBGrid1CellClick(Column: TColumn);

  begin

   //确保该栏是逻辑字段

   if DBGrid1.SelectedField.DataType = ftBoolean then

    SaveBoolean();

  end;

  

  procedure TForm1.DBGrid1KeyDown(Sender: TObject;

             var Key: Word; Shift: TShiftState);

  begin

   //确保该栏是逻辑字段和空格键在键盘中被敲击

   if ( Key = VK_SPACE ) and

     ( DBGrid1.SelectedField.DataType = ftBoolean ) then

    SaveBoolean();

  end;

  

  procedure TForm1.SaveBoolean;

  begin

   DBGrid1.SelectedField.Dataset.Edit;

   DBGrid1.SelectedField.AsBoolean :=

     not DBGrid1.SelectedField.AsBoolean;

   DBGrid1.SelectedField.Dataset.Post;

  end;
zhouzm 2002-07-08
  • 打赏
  • 举报
回复
好像要重新继承组件,增加该属性

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧