如何在StringGrid中进行输入的合法性校验(100分)

康夫

Unregistered / Unconfirmed
GUEST, unregistred user!
在StringGrid中,goEditing为TRUE时,当焦点从一个Cell移动到另外一个Cell时,如何对前面的输入数据进行合法性校验,比如有一个类似于
BeforeLeaveCell的事件?又如何在输入的过程中,实时地控制输入呢?不要类似于EditMask之类的东东
 
D

Delphi3.0

Unregistered / Unconfirmed
GUEST, unregistred user!
当焦点从一个Cell移动到另外一个Cell时,你可以使用OnExit事件
 
H

hfade

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi 4 中有OnSetEditText event,
不知其它版本有没有?
 
S

Sunset

Unregistered / Unconfirmed
GUEST, unregistred user!
OnExit只在离开表格时才会发生,应该在OnSelectCell事件上也加上校验。
如下例,CheckData函数检查指定单元数据的合法性,在OnSelectCell和
OnExit事件中调用该函数进行校验。

function TForm1.CheckData(Row, Col: integer): boolean;
{对指定单元数据进行校验,要求数据必须为整数}
begin
Result := True;
if StringGrid1.Cells[Col, Row] = '' then
Exit;
try
StrToInt(StringGrid1.Cells[Col, Row]);
except
ShowMessage('Cell(' + IntToStr(Row) + ',' + IntToStr(Col) + ')' +
' is not a valid integer value');
Result := False;
end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject
Col, Row: Integer;
var CanSelect: Boolean);
begin
CanSelect := CheckData(StringGrid1.Row, StringGrid1.Col);
end;

procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
if not CheckData(StringGrid1.Row, StringGrid1.Col) then
StringGrid1.SetFocus;
end;
 

康夫

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢各位!
SunSet先生的意见我基本满意,我原来也考虑过这样做,但是,涉及的
地方太多了.我的程序是一个MDI应用程序,每个CHILD中打开一个
表格(注:不是DELPHI中的TABLE,而是我们通常而言的报表)进行编辑,
FORM上还有许多SpeedButton(没有焦点),如Save,Close等,另外,
关闭CHILD时也要检查,还有,关闭Application时也需考虑.
有没有更好的办法?
 
H

huizhang

Unregistered / Unconfirmed
GUEST, unregistred user!
最好是自己做一个Grid控件, 直接从TStringGrid继承过来, 将它的 InplaceEditor
属性说明为 published, 然后在 InplaceEditor 里面做文章

InplaceEditor 是一个 TCustomEdit, 专门用来进行单元格文字编辑的, 有了它
你不必关心是在什么地方, 只要对文字进行编辑时就可以控制
 
W

wxy3064

Unregistered / Unconfirmed
GUEST, unregistred user!
你可以这样做
先定义
var
iCol,iRow:integer
//全局变量
然后
在TStringGrid的OnSetEditText事件中书写如下代码,这样你的校验就只触发一次。
begin
if (iCol<>ACol||iRow<>ARow)
begin
// To Do your things
end;
iCol:=ACol;
iRow:=ARow;
end;
严重反对robinson的做法!!!!!!!!!
 
顶部