//from
http://kingron.myetang.com/zsfunc12.htm
//是不是你要的?(*//
标题:处理数据网格的编辑框
说明:示例添加焦点颜色;获取还没有提交到数据集的字段文本
设计:Zswang
日期:2002-03-31
支持:[email protected]
//*)///////Begin Source
function GetDBGridEdit(mDBGrid: TDBGrid): TEdit;
var
  I: Integer;
begin
  Result := nil;
  if not Assigned(mDBGrid) then Exit;
  if not mDBGrid.EditorMode then begin
    mDBGrid.EditorMode := True;
    mDBGrid.EditorMode := False;
  end;
  with mDBGrid do for I := 0 to Pred(ComponentCount) do
    if Components[I] is TCustomEdit then begin
      Result := TEdit(Components[I]);
      Break;
    end;
end; { GetDBGridEdit }function GetDBGridEditText(mDBGrid: TDBGrid): string;
var
  vEdit: TEdit;
begin
  vEdit := GetDBGridEdit(mDBGrid);
  if Assigned(vEdit) then
    Result := vEdit.Text
  else Result := '';
end; { GetDBGridEditText }
///////End Source///////Begin Demo
procedure TForm1.DBGrid1Enter(Sender: TObject);
var
  vEdit: TEdit;
begin
  vEdit := GetDBGridEdit(TDBGrid(Sender));
  if Assigned(vEdit) then vEdit.Color := clYellow;
end;procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Caption := GetDBGridEditText(TDBGrid(Sender));
end;
///////End Demo

解决方案 »

  1.   

    zswang(伴水)(* pascal→c *) (  ) :
    您的代码我已试了,很有启发,但好象不能完全适用我的情况:
    我要实现的是:按“新建”后,等一行的各个cell值输入完毕后,调用一个存储过程来把它插入数据库中(不是调用clientdataset.applyupdates()来更新),所以我要记录一条记录的各个cell的输入值,作为参数传给存储过程。
    很想就我的想法与您交流意见,望不吝指教!
      

  2.   

    补充一点:
    我的大部分cell的值都是通过列表框(哈哈,还没想好怎么在cell中动态创建列表框呢,也请一并指教)选的,不是键盘输入。
      

  3.   

    //我现在才看明白你发的帖子
    ClientDataSet.Firsr;
    while not ClientDataSet.Eof do begin
      { 保存列的值,追加到字符串中 }
      ClientDataSet.Next;
    end;
    { 用该字符串传递到存储过程中 }
    { 存储过程中分解处理就可以了 }
      

  4.   

    zswang(伴水)(* pascal→c *) (  ) :
    我不太明白您的意思,我有可能只按一次“新建”按柳(即有可能只加一笔记录),为什么要遍历 ClientDataSet呢?
    您能给我具体的代码看看么?
      

  5.   

    可以利用TField的OldValue , NewValue , CurrentValue 等等。