TStringGrid的cell问题?(200分)

  • 主题发起人 主题发起人 waiting
  • 开始时间 开始时间
W

waiting

Unregistered / Unconfirmed
GUEST, unregistred user!
TStringGrid(goEditing为true)的缺省键盘操作为:
left/right/down/up移动焦点到另外的cell.
焦点刚进入一个cell时,该cell反白显示,这时按enter进入编辑状态,
在编辑状态按enter则进入反白选择状态。
请教:
想实现,
1、在反白显示情况下按enter键移动焦点
2、在编辑状态下按enter验证数据的合理性。
3、在反白情况下按left/right进入编辑状态,并相应把光标放在串首或尾
Thx.
 
以下是demo程序
相比你也看的懂,
不好意思,第3个问题,left将光标放在串首,还没考虑出来!
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var s:string;
begin
if key=vk_return then begin
if not stringgrid1.EditorMode then
edit1.SetFocus else
if stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row] <> '' then
showmessage('not null');
end
else
begin
if key = vk_left then
begin
key := 0;
stringgrid1.EditorMode := true;
end
else
if key = vk_right then
begin
key := 0;
stringgrid1.EditorMode := true;
end ;
end;
end;
 
我想过了,还是在自画事件中,将当前的cell用一个Edit空件替代,
Edit.selstart :=0 可以将光标定位在串首
即选中cell时其实显示的是一个Edit
 
第一个问题可以这样做:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
with StringGrid1 do
begin
Row := Row + 1; // 注意不要越界
Key := #0;
end;
end;
第二个问题,StrigGrid 有一个 OnSetEditText 事件,但是可能不太适合你:
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String);
begin
with StringGrid1 do
if Value='1' then Cells[ACol,ARow] := '2';
end;
第三个问题就只能继承 TStringGrid ,写一个新的类,因为它内部其实是嵌了一个 Edit,
但是声明在 Protected 部分,必须 Public 出来,然后就好办了,SelStart 等属性的使用
是很简单的。
protected
...
property InplaceEditor: TInplaceEdit read FInplaceEdit;
btw: 如果你愿意写一个新的类,第二个问题其实也能解决,加一个诸如 OnAfterSetText 事件
就行了。

希望能对你有所帮助。
From: BaKuBaKu
 
if (key=39)//如果是RIGTH则到字符串尾,KEY=37一样
then begin Key := 0;
with StringGrid1 do
begin EditorMode := true;
然后可以根据CELL的位置和文字的宽度计算出CARET的位置
(就象VC的基础例子一样),你试试看!
 
我试了一下,还是有点问题:
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
vk_return:begin
if not stringgrid1.editormode
then begin
stringgrid1.Row:=stringgrid1.row+1;
key:=0;
stringgrid1.editormode:=false;
//进入下一个cell时,该cell处于edtor状态,按enter变成全选,再按enter
//才进入另外的cell.不能实现连续按enter进行焦点切换。????
end
else begin
showmessage('checking....');
end;
end;
vk_left:begin
if not stringgrid1.editormode
then begin
key:=0; //光标自动放在串尾
stringgrid1.editormode:=true;
end;
end;///
vk_right:begin
if not stringgrid1.editormode
then begin
key:=0; //怎样放串首?
stringgrid1.editormode:=true;
end;
end;
end;//case
end;
sorry that 我忘记了告诉各位,我的TStringGrid的goAlwaysShowEditor为true.
老板要求进入一个cell时就处于全选状态,
按enter进入下一个焦点;
按left/right进入编辑状态(其实我觉得,是不是全选时就处于编辑状态??)
按其它输入键覆盖修改。
我想还是用“在自画事件中,将当前的cell用一个Edit空件替代”比较适合我的水平,
谁能给我较为详细的代码。
能给我继承的类那就更好,可惜我到现在为止还没有用过。。。。
faint...我的烂水平。。。
 
请各位大虾快点help..
老板催着交差...
thx.
 
To waiting: 是 OnKeyPress ,而不是 OnKeyDown ,这样“Key := 0”才能起作用。
如果只想在 StringGrid 的基础上改一改,就只能想办法修修补补了。
 
To BaKuBaKu: 效果一样。
怎样判断cell处于全选状态呢?
还有老板还要求cell中最大字符数为12.怎么办?
是不是只有使用edit筐,使cell的object等于edit才行?
Thx.
 
字符数为12最好办啊!老弟,自己多想想嘛!!
with stringgrid1 do
if length(cells[col,row])>12 then key:=chr(0); //有可能是>=12
其实,用方向键来进入CELL并可以开始编辑,似乎有点不合理!想老板提啊,
不用什么都听老板的,没有自己的见解,老板会瞧不起你的!!!呵呵


BaKuBaKu,你在KEYDOWN下试试:
if Key=37 then begin Key:=0;StringGrid1.EditorMode := true; end;
看看Key:=0有没有用!!!
 
To Waiting:
如果你把 InplaceEditor 给 Public 出来的话,设置最大长度和判断是否全选就很简单了。
 
To gcq:最大长度ok.
说了,老板死活不改,而TEdit框确实也是left/right进入编辑状态。
Thx.

To BaKuBaKu:
把 InplaceEditor 给 Public 出来;
请老兄赐教。。。我这方面很差。。。
Thx.
 
EDIT是可以<-,->开始编辑,但如果,你要用<-,->来切换EDIT,恐怕也要费些神吧!
即要<-,->能切换CELLS,又要进入编辑状态,这功能,似乎不少啊!
不行的话,可以用一个EDIT框覆盖CELLS,在EDIT里编辑,退出时,把TEXT付给CELLS,
这个要费点时间就可以作好了!!!但要实现用<-,->来切换EDIT
 
发个控件给你,请查收!
 
class TMyGrid = class(TStringGrid)
published
...
property InplaceEditor;
end;
 
waiting:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部