StringGrid中嵌入其他控件问题! ( 积分: 200 )

  • 主题发起人 主题发起人 lynch2611
  • 开始时间 开始时间
L

lynch2611

Unregistered / Unconfirmed
GUEST, unregistred user!
StringGrid中嵌入其他控件问题!比如Combox,我是这样写的,但当我改变列宽的时候,
Combox的大小不变化了(列宽变大时正常,列宽变小时就不变化了)
procedure TWatchListForm.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
CBLeft, CBTop, CBWidth: Integer;
begin
{if (gdFocused in state) or (gdSelected in state) then
begin
CBLeft := StringGrid1.CellRect(ACol, ARow).Left;
CBTop := StringGrid1.CellRect(ACol, ARow).Top;
CBWidth := StringGrid1.CellRect(ACol, ARow).Right - StringGrid1.CellRect(ACol, ARow).Left;
ComboBox1.Left := CBLeft + 1;
ComboBox1.Top := CBTop + 1;
ComboBox1.Width := CBWidth;
ComboBox1.Visible := True;
ComboBox1.SetFocus;
end;
end;
对了,这种问题有通过API解决的方法吗?
 
一种简单解决办法,改变列宽时候调用repaint,还有设置combobox位置时候,请用
SetBounds函数
 
问题的解决思路应该尽量从类的角度考虑,减少这种画的障眼法;
楼主的方法可以在列宽减小时使combobox随着缩小;
二楼的SetBounds函数在这个时候画会显示有界面刷新的效果;
 
有用API解决的思路吗?
 
to treemon
我也知道 障眼法 不是很好.所以我想请教有没有用API或者其他的解决方法,
比如,进度条嵌入状态栏的那中.从而实现真正的嵌入.
但我初步观察,StringGrid中,就貌似没有Cell这一类的概念,只能直接读写某行某列的数据.我最终的效果是,不同的列嵌入不同控件(Edit,Combox等),现在无从下手,望给点思路.
 
DFW们,指点下真正嵌入的思路啊!
 
谢谢!谁给点真正嵌入的思路啊!
 
用stringGridMoveDown事件
得到当前的cell的rect,然后调整能好用吧,我内嵌都是用这个事件,用stringGrid的一个函数,具体名字忘记了,但通过x,y可以得到当前行列(X,Y,Col,Row)
 
看看DataGrid吧,他从TCustomGrid继承而来。。

双击DataGrid的单元格不是可以编辑吗? 其实它是在TCustomGrid上浮动一个Edit....

你也可以在StringGrid上浮动一个Combox,当Combox失去焦点时,Combox.paintto到StringGrid的单元格上即可。
 
其实 就用楼主这种简单的方法 一般情况下也可以了。

http://www.skycn.com/soft/32971.html

看这个软件,打印设置-打印模版,里面的STRINGRID 里,就嵌入了 SpinEdit,Combobox。

关键是,嵌入COMBOBOX,楼主写代码的地方我感觉不合适。应该写在SG的

procedure TForm1.SgSetSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);

而且嵌入的那个COMBOBOX 也可以用代码动态创建,是不是更加减小软件体积。
 
//----------------------
if sgset.Cells[acol, 0] = '自动缩小' then
with CmbSgSelect do
begin
Left := sgset.left + Ret.Left + 2;
Top := sgset.Top + Ret.Top + 2;
Width := ret.Right - ret.Left;
Height := ret.Bottom - ret.top;

Sorted := false;
items.CommaText := '是,否';

if Items.IndexOf(sgset.Cells[acol, arow]) <> -1 then
ItemIndex := Items.IndexOf(sgset.Cells[acol, arow])
else
ItemIndex := 0;

Visible := true;
SetFocus;
end;
类似代码 试试呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
547
import
I
后退
顶部