TStringGrid(100分)

  • 主题发起人 主题发起人 delphi fan2
  • 开始时间 开始时间
D

delphi fan2

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在TStringGrid放置其他控件,如Tspeedbutton,Tcombo...
当然可以直接放上,但边框不好看!
有点象woll2woll的产品!
希望大虾指点指点!
 
Every Cell or a StringGrid has an Object property, which could be a
any component. For example, let the object property of a cell be a
a Speedbuton, then on drawCell event to draw the SpeedButton to the
canvas of the grid.
 
试过ADVGRID吗? 该组件是一个功能较强的东西,支持加图标、字体旋转,内容打

印等多种一般编程中用到的功能。
 
自己拉一拉!
 
用过TStringGridEh吗,它提供源代码,将TSpeedButton,TComboBox等等都放了进去,其实挺方便的。
 
能给我看看吗?
dingzheng@126.com
 
很简单,将欲嵌入网格的控件的Visible设置为False,然后设置网格的以下三个事件
就能实现:
1、DBGrid.DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
2、DBGrid.ColExit(Sender: TObject);
3、DBGrid.KeyPress(Sender: TObject; var Key: Char);

举一个例子,将一个Boolean型字段在网格中编辑(状态)时用检查框(DBCheckBox)实现,
并在网格显示(状态)时用相应位图(ImageTrue,ImageFalse:TImage)来代替。

//Draw cell in grid
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if (gdFocused in State) then
begin
if (Field.FieldName = DBCheckBox1.DataField) then
begin
DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 1;
DBCheckBox1.Top := Rect.Top + DBGrid1.top + 1;
DBCheckBox1.Width := Rect.Right - Rect.Left{ - 1};
DBCheckBox1.Height := Rect.Bottom - Rect.Top{ - 1};
DBCheckBox1.Visible := True;
end
else {in this else area draw any stay behind bit maps}
begin
if (Field.FieldName = DBCheckBox1.DataField) then
begin
if TableGridDataCheckBox.AsBoolean then
DBGrid1.Canvas.Draw(Rect.Left,Rect.Top, ImageTrue.Picture.Bitmap)
else
DBGrid1.Canvas.Draw(Rect.Left,Rect.Top, ImageFalse.Picture.Bitmap)
end
end;

//when jump away cell, do it
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
If DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then
DBCheckBox1.Visible := false;
end;

//Key Press in grid
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (key <> chr(9)) then
begin
if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) then
begin
DBCheckBox1.SetFocus;
SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);
end;
end;
end;

我想woll2woll的东东的实现大概也是如此。
 
这样画上去是很不好看的!
 
最讨厌的是那个TComboBox, 它的高度是不可变的, 所以单元格的高度要与它的大小
相应才行, 否则确实很难看.
 
强力推荐使用ThyperGrid,
 
当TEdit画在TStringGrid中时需要将return 改为tab的动作,
但有beep,怎样去掉? Tedit.onkeydown中key:=0为何不行?
 
sherman,能给我一份TStringGridEh吗,谢谢。sir_dong@263.net
 
处理stringGrid的Ondraw事件,获取当前Cell的Rect属性(含该矩形的Left、Top等值),
然后用其他控件的SetBounds方法,根据Rect的位置(可参考Xueyu的回答)来给其他控件定位,具体可查Delphi自带帮助,
但注意Rect的位置值是相对Grid控件的容器控件而定的,是相对坐标而不是相对窗体的绝对坐标,最好将其他控件与Grid放在同一容器里。
随时可通过给
stringgridName.cells[stringGridName.col,stringGridName.row]
赋值来给填充当前cell。
stringGridName.col和stringGridName.row即为当前cell的坐标.



 
接受答案了.
 
后退
顶部