需要思考的问题啦!关于StringGrid和TComboBox的问题(90分)

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

Linux2002

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一个StringGrid它的2列和3列上面有动态生成的ComboBox,现在问题是这个
StringGrid的行数不是固定的,有可能选中一个树型控件节点的时候它只有2列(或更多),
有可能选中树型控件结点的时候它只有4列之类的,但是当列数减少的时候动态生成的
ComboBox还在原来的地方停留,并没有消失,现在问题就是如何让ComboBox跟着
StringGrid的行增加而增加,减少而减少
 
为什么要固定在2列和3列上有ComboBox呢?

本来就只有一个ComboBox,只是在你进入到符合条件的单元格的时
才让它的Visible为Ture。离开后就为False了。

在这里的论坛中找一下DBGrid中绘出其它控件的方法。很简单的。
 
程序需要这样我也没有办法啊,反正StringGrid的每行的2列和3列上面都需要一个TComboBox
我不管是创建也好还是设Visible也好,总之应该如何动态增减StringGrid行数的时候,相应的
看不到或看到ComboBox就可以了,给给代码吧!
 
连大富翁都无法解决这个问题吗,呜呜。
 
不要哭不要哭,我来告诉你方法。其实你不要动态生成那么多的Combobox,有2列需要就只
要两个就够了,也不用动态生成,在设计时将它的visible设成false就行了。然后是设置
stringGrid的onClick事件:
var V_Rect:TRect;
begin
With StringGrid1 do
begin
if Col<>2 then Combobox1.visible:=false
else begin
V_Rect:=CellRect(3,row);
Combobox1.Width:=V_Rect.Right-V_Rect.Left+1;
Combobox1.Left:=Left+V_Rect.Left+1;
Combobox1.Top:=Top+V_Rect.Top+1;
Combobox1.Height:=V_Rect.Bottom - V_Rect.Top+1;
Combobox1.visible:=true;
Combobox1.SetFocus;
Combobox1.Text:=Cells[3.Row];
end;
if col=3 then ..... //按上面方法如法炮制
end;

如果stringGrid的列宽设为可以拉动的话,还要再设置其onColWidthsChanged事件
P_SetGrdEdt(Combobox1,Stringgrid1,2,StringGrid1.row);
P_SetGrdEdt(Combobox2,StringGrid1,3,StringGrid2.Row);
用到的过程P_SetGrdEdt如下:
procedure P_SetGrdEdt(B_Edt:TWinControl;B_Grd:TStringAlignGrid;B_Col,B_Row:integer);
//根据表格B_Grd的当前行来设置编辑或组合框B_Edt的位置与选择状态.B_Col,B_Row:所在列,所在行
var V_Rect:TRect;
begin
With B_Grd do
begin
V_Rect:=CellRect(B_Col,B_Row);
B_Edt.Width:=V_Rect.Right-V_Rect.Left+1;
V_Edt.Left:=Left+V_Rect.Left+1;
V_Edt.Top:=Top+V_Rect.Top+1;
V_Edt.Height:=V_Rect.Bottom-V_Rect.Top+3;
end;
end;
其实上面的Click事件也可以使用该过程.
还要设置组合框的exit与keypress事件
procedure TForm1.Combobox1exit(sender:TObject);
begin
StringGrid1.Cells[2,StringGrid1.row]:=Combobox1.text;
end;
procedure TFrom1.combobox1keypress(sender:TObject.......);
begin
if (key=#13) or (key=#9) then //回车或tab键时跳到下一列
begin
StringGrid1.col:=3;
StringGrid1.setfocus;
end;
end;
这样在焦点移动到需要组合框的位置时才会出现组合框,并用它来输入,其它时候就不会出现组合框.
代码是我现敲进去的,有错误的话自己判断吧。

 
在树节点的选择中进行处理。
 
对不起大家,我可能没有告诉大家一点,我需要的TComboBox的内容是不能每行公用两个T
ComboBox,因为要求数据独立,最后这些数据是需要保存为文件的。如果按照楼上的楼上的
大哥说的那样,数据就无法独立了,只有新建链表来存放,这样反而更加复杂,需要管理的东西
更多了,现在这些已经让我管理很吃力了
 
哈阿,我发现我的程序最后保存数据不是通过StringGrid而是通过我建立好了的一个链表,
楼上楼上大哥你的方法可能有用了
 
接受答案了.
 
顶部