delphi stringGrid更改单元格数据 delphi中, TstringGrid中,单击单元格之后, 将会出现光标(如果里面有数据的话,数据将全选),然后可以填入数据,想问的是,如果不出现光标(里面有数据的话,不被选中), 直接写数据?另外,我在 tstringgrid中加入了下拉框,有没有办法,只能从下拉框中读数据,而不能直接更改单元格的数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把该CELL改为只读,在你点击后,出现一个对话框,在对话框中写入,然后再写入CELL中.呵呵,跟你的下接框方式差不多, 这样不直观,因为不只一个下拉框,是继承了TStringGrid来实现的,就是不知道双击两下出现编辑状态(带光标的那种)是触发了什么事件。想直接把那事件去掉 单击两下,会出现光标(如果里面有数据的话,数据将全选,并重新设值(还是原来的值),能不能不让其重新设值,因为我用的是TNT控件,重新设值又变成了乱码 我在 tstringgrid中加入了下拉框,有没有办法,只能从下拉框中读数据,而不能直接更改单元格的数据 =============================================这个是可以做到的吧。你在combobox的onChange事件写代码不是可以吗?stringGrid.cell[stringGrid.col,stringGrid.row] := combobox.text; 你该问这个的.直接把该事件去掉?呵呵,我说的只读就是这意思.把这个事件去掉(点击不进入编辑状态).void __fastcall Tfm_ly_bill::sgSelectCell(TObject *Sender, int ACol,int ARow, bool &CanSelect){ if(sg->RowCount==ARow+1) { CanSelect=false; return; } //最后一行不整行显示 if((Tag==0||Tag==1)&&(ACol==5||ACol==8)) sg->Options=sg->Options<<goEditing<<goAlwaysShowEditor<<goTabs; else sg->Options=sg->Options>>goAlwaysShowEditor>>goEditing>>goTabs; sg->Refresh(); //=========================== TRect irect; for(int i=1;i<sg->ColCount;i++) { irect=sg->CellRect(i,ARow); if((Tag==0||Tag==1)&&(i==5||i==8)) sg->Canvas->Brush->Color=0x0012266B; else sg->Canvas->Brush->Color=0x00C56A31; // 0x00804000 sg->Canvas->FillRect(irect); sg->Canvas->Font->Color=clWhite; sg->Canvas->TextRect(irect,irect.Left+1,irect.Top+1,sg->Cells[i][ARow]); } //end for } 汗...我转DELPHI噢.关键其实是sgSelectCell //假设STRINGGRID改名为sg ,那么就在该事件中============begin if (ACol=5) or (ACol=8) then //假设你要把双击这个去掉,为5和8列,噢是每一行的五和八列,如果第一列去掉,要加一句话. sg.Options:=sg.Options < <goEditing < <goAlwaysShowEditor < <goTabs; //就是去掉的. else sg.Options:=sg.Options>>goAlwaysShowEditor>>goEditing>>goTabs; //那么其他的列就是可以编辑的,除了5和8 sg.Refresh; end; sg.Options < <goEditing < <goAlwaysShowEditor < <goTabs=======================================================这个在DELPHI中好像不是这么表示的,应该是包含[contain]吧....噢,要假设STRINGGRID定义为第一列为不可编辑列.不然要加上这句if sg.RowCount=0 then //第一行显示,不能选择.begin CanSelect:=false; return; end; 谢谢你的回复,其实 canSelect 或者 goEditing, 都没什么,我想要的是这行只能选择,而不可以通过键盘输入,刚刚想到个办法,如果触发 keyPree 事件,把他给挡回去,不过 cell的数据不知道怎么变化,因为我用的是 Tnt控件,来解决 unicode问题,但是进入编辑状态时,就成了乱码。所以想只让他选择,而不可以输入, 加了 下拉框,仅仅是指加了一种形式, 并不是直接把 comboBox放到 grid中(即没有 comboBox).另外,你有办法放进去吗,每个单元格都要有的那种?我只是继承了 TStringGrid, 并把 EditStyle改了下,具体代码如下,网上的例子http://download.csdn.net/source/797966 我用的是 tnt控件, 一进入编辑状态, cel 的内容就重新刷了一次,同时上面的字符串(中文)就变成了乱码,我用的是 Delphi7, 英文环境 dbgrideh设置默认值 为什么Webbrowser右键无法复制 散分!Delphi区各位大家新年快乐! 。 讨论一下关于托盘图标的事件有没有更好的实现方法 急求InterWeb文档 如何实时监控文件的更改? Delphi 控制 Excel2000 心得 qry.Filter 问题 各位高手大家好:有关QQ的问题我不能访问 特急!!!怎样切换声道? 请教一个C/S系统中商品图片的存取方法 求助:对调色板进行操作
=============================================
这个是可以做到的吧。
你在combobox的onChange事件写代码不是可以吗?stringGrid.cell[stringGrid.col,stringGrid.row] := combobox.text;
你该问这个的.直接把该事件去掉?
呵呵,我说的只读就是这意思.把这个事件去掉(点击不进入编辑状态).
void __fastcall Tfm_ly_bill::sgSelectCell(TObject *Sender, int ACol,int ARow, bool &CanSelect)
{
if(sg->RowCount==ARow+1) { CanSelect=false; return; } //最后一行不整行显示
if((Tag==0||Tag==1)&&(ACol==5||ACol==8)) sg->Options=sg->Options<<goEditing<<goAlwaysShowEditor<<goTabs;
else sg->Options=sg->Options>>goAlwaysShowEditor>>goEditing>>goTabs;
sg->Refresh();
//===========================
TRect irect;
for(int i=1;i<sg->ColCount;i++)
{
irect=sg->CellRect(i,ARow);
if((Tag==0||Tag==1)&&(i==5||i==8)) sg->Canvas->Brush->Color=0x0012266B;
else sg->Canvas->Brush->Color=0x00C56A31; // 0x00804000
sg->Canvas->FillRect(irect);
sg->Canvas->Font->Color=clWhite;
sg->Canvas->TextRect(irect,irect.Left+1,irect.Top+1,sg->Cells[i][ARow]);
} //end for
}
sgSelectCell //假设STRINGGRID改名为sg ,那么就在该事件中
============
begin if (ACol=5) or (ACol=8) then //假设你要把双击这个去掉,为5和8列,噢是每一行的五和八列,如果第一列去掉,要加一句话.
sg.Options:=sg.Options < <goEditing < <goAlwaysShowEditor < <goTabs; //就是去掉的.
else
sg.Options:=sg.Options>>goAlwaysShowEditor>>goEditing>>goTabs; //那么其他的列就是可以编辑的,除了5和8
sg.Refresh;
end;
=======================================================
这个在DELPHI中好像不是这么表示的,应该是包含[contain]吧....
噢,要假设STRINGGRID定义为第一列为不可编辑列.
不然要加上这句
if sg.RowCount=0 then //第一行显示,不能选择.
begin
CanSelect:=false;
return;
end;
另外,你有办法放进去吗,每个单元格都要有的那种?我只是继承了 TStringGrid, 并把 EditStyle改了下,具体代码如下,网上的例子
http://download.csdn.net/source/797966
我用的是 Delphi7, 英文环境