关于TStringGrid的Change问题(100分)

  • 主题发起人 主题发起人 xmhong
  • 开始时间 开始时间
X

xmhong

Unregistered / Unconfirmed
GUEST, unregistred user!
使用TStringGrid的问题:
我在每个单元格编辑完之后对数据的有效性进行验证
请问怎样实现诸如Edit的OnChanged事件的功能。。
使得每个单元格数据变化之后都能及时对其进行验证。
 
你的数据总得post吧, 在beforepost中加入你的判断代码,
就ok了。
 
可以在post之前对整个StringGrid的数据进行遍历验证,但是老板要求
在输入、编辑每个单元格数据的时候就要进行
验证。。。。。
 
TStringGrid.OnSetEditText
Occurs when the user has finished editing the value of a cell.
在此对数据的有效性进行验证
 
>>Occurs when the user has finished editing the value of a cell.
好像不是finish
 
http://www.vclxx.com/有很多改进的TStringGrid,找找有没有合适的
 
xWolf:
TStringGrid.OnSetEditText是在单元格编辑是发生。。。
你敲入每一个键都将其触发。。。。。
另外,我的单元格内容没有改变,只是光标移动它也被触发。。
跟OnChange事件有一定差别。。。。
有没有办法。。。。
我到gxg8816提供的站点去瞧瞧。。。。不知会不会有收获。。。


 
你在单元格里编辑完数据总得要用一个键来表示结束,比如用enter键
那么可以在StringGrid的OnKeyDown里写:

procedure TUserEditor.StringGrid1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key<>vk_Return then exit;

.....// 验证数据有效性
end;

这样你每敲一个非enter键只是执行一个判断语句,费不了什么功夫。
不会影响程序运行速度。
这个办法够简单吧?
 
用鼠标点也要判断.还有Tab键,直接关闭窗口等,处理好这些,就等于
做了一个OnCellExit事件,
 
还有上下键。。。。
ckeka的方法问题在于用户如果只修改其中一个数据,
而用键盘移动到上面区去改,那么所有数据都要验证,
那效率就不高了。。。。。。。
能不能做个OnCellChange事件。。。。???
一个办法是在进入cell时保存cell的单元格内容,
exit时在判断比较,而后进行验证,。。。
但什么时候才是进入一个新的单元格呢?
TStringGrid.row,col改变的时候?
谁知道怎样在程序中实时获取row,col的改变????



 
TCustomGrid中有一个TInplaceEdit, 继承自TCustomMaskEdit,
我本想override:
constructor TInplaceEdit.Create(AOwner: TComponent);
begin
OnChange := ...
end;
可惜没能成功
 
能不能在每个cell里面插入edit框,
让edit的onchange事件触发校验呢?
请各位大虾想想办法。。。。
thx.
 
可以在cell里面用edit框来编辑数据,
程序大抵如下,还需你进一步完善,

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
x,y:integer;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Color:=clBlue;
Edit1.Visible:=False;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
x:=aCol;
y:=aRow;
if (gdFocused in State) then
begin
Edit1.Text := StringGrid1.Cells[x,y];
Edit1.Left := Rect.Left + StringGrid1.Left + 2;
Edit1.Top := Rect.Top + StringGrid1.top + 2;
Edit1.Width := Rect.Right - Rect.Left;
Edit1.Height := Rect.Bottom - Rect.Top;
Edit1.Visible := True;
end else
begin
Edit1.Visible:=False;
end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
//判断数据有效性
StringGrid1.Cells[x,y]:=Edit1.Text;
end;

end.
 
有一个控件ALIGNGRID,你可以试试有源码。
 
时间太久,强制结束。 wjiachun
 
后退
顶部