点击确定和双击DBGRID后返回的值为空也就是RESULT为空,点击取消程序正确.
function SearchData(ADBEdit: TDBEdit; ADataSet: TDataSet): String;
begin
  if not (ADBEdit.DataSource.DataSet.State in [dsInsert, dsEdit]) then
    Abort;
  if ADBEdit.ReadOnly then
    Abort;
  try
    fmBaseSearch := TfmBaseSearch.Create(Application);
    fmBaseSearch.Caption := '查询' + ADBEdit.DataSource.DataSet.FieldByName(ADBEdit.DataField).DisplayLabel;
    fmBaseSearch.dsTemp.DataSet := ADataSet;
    sOldValue := ADBEdit.DataSource.DataSet.FieldByName(ADBEdit.DataField).AsString;
    if fmBaseSearch.ShowModal = mrOK then
    begin
      ADBEdit.DataSource.DataSet.FieldByName(ADBEdit.DataField).AsString :=
             fmBaseSearch.dsTemp.DataSet.Fields[0].AsString;
      Result :=fmBaseSearch.dsTemp.DataSet.Fields[0].AsString;
    end
    else
    begin
      ADBEdit.DataSource.DataSet.FieldByName(ADBEdit.DataField).AsString := sOldValue;
      Result := sOldValue;
    end;
    if ADBEdit.Visible then
      ADBEdit.SetFocus;
  finally
    fmBaseSearch.Free;
  end;
end;

解决方案 »

  1.   

    此过程的最顶端加
    Result:=ADBEdit.DataSource.DataSet.FieldByName(ADBEdit.DataField).AsString;
      

  2.   

    先跟踪一下fmBaseSearch.dsTemp.DataSet.Fields[0].AsString;是否是空值.在找其它原因
    不过你写的代码太复杂化你可以先简单化一点吗!
      

  3.   

    先代入两个构件一是ADBEDIT和ADATASATE,判断ADEDIT是不是在插入和编辑状态,不是退出.
    是不是在只读状态,是退出.
    然后再查询窗体,将要查询字段的DISPLAYLABE给窗体的CAPTION属性作为窗体名.将ADBEDIT的默认值给变量sOldValue,
    将DBGRID中选中记录的第一个字段的值给RESULT,(确定或双击)
    取消用SOLDVALUE的值给RESULT.
    RE COOLFILM
    他返回的的确是空值,任意给一个值可以近回.
    像这种在程序运行时才给定数据源的DBGRID怎么样才能确定他选定的记录的指定字段的值.谢谢在线等.