微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

记录为空?

如何解决记录为空?

Delphi 的记录类型中是否有任何数据?怎么理解?

例如,应该得到这样的记录类型;

if (!txt_Result.Text.Contains("."))
if(txt_Result.Text == string.Empty)
    txt_Result.Text = "0.";
else
 MessageBox.Show("Sorry,invalid number format!    
Value can't have more than a decimal point");   
else
txt_Result.Text += "."; 

那么有没有办法在不浏览记录项目的情况下弄清楚这一点?

解决方法

使用成员函数

恕我直言,目前最简洁的方法是声明一个方法TDummy.IsEmpty: Boolean

type
  TDummy = record
    Text: string;
    Number: Integer;
    function IsEmpty: Boolean;
  end;

{ TDummy }

function TDummy.IsEmpty: Boolean;
begin
  Result := (Text = '') and (Number = 0);
end;

那你可以随时用这个方法来查看记录是否为空:

procedure TForm1.FormCreate(Sender: TObject);
var
  D: TDummy;
begin

  D := Default(TDummy);

  if D.IsEmpty then
    ShowMessage('D is empty.');

  D.Number := 394;

  if D.IsEmpty then
    ShowMessage('D is empty.');

end;

使用等号运算符

另一种方法:

type
  TDummy = record
    Text: string;
    Number: Integer;
    class operator Equal(const Left,Right: TDummy): Boolean;
    class operator NotEqual(const Left,Right: TDummy): Boolean;
  end;

const
  EmptyDummy: TDummy = ();

{ TDummy }

class operator TDummy.Equal(const Left,Right: TDummy): Boolean;
begin
  Result := (Left.Text = Right.Text) and (Left.Number = Right.Number);
end;

class operator TDummy.NotEqual(const Left,Right: TDummy): Boolean;
begin
  Result := not (Left = Right);
end;

现在可以了

procedure TForm1.FormCreate(Sender: TObject);
var
  D: TDummy;
begin

  D := Default(TDummy);

  if D = EmptyDummy then
    ShowMessage('D is empty.');

  D.Number := 394;

  if D = EmptyDummy then
    ShowMessage('D is empty.');

end;

疯狂的东西

如果您绝对不想单独比较每个成员,可以在某些情况下比较字节。

但请注意,一般情况下,不能通过比较字节来比较两条记录。只提两个明显的原因:

  1. 即使字符串成员由两个不同的字符串堆对象表示,它们在语义上也可能是相等的(因此比较器说“不相等”而实际上它们相等)。

  2. 如果记录不是 packed,则记录可能有填充(因此比较器可能会说“不相等”,而实际上它们相等)。

但您只想与“默认”(归零)值进行比较,作为奖励,您的记录类型恰好是 packed,因此您可以逃脱

type
  TDummy = packed record
    Text: string;
    Number: Integer;
  end;

  TZeroRecord<T: record> = record
    class function IsZero([Ref] const ARecord: T): Boolean; static;
  end;

{ TZeroRecord<T> }

class function TZeroRecord<T>.IsZero([Ref] const ARecord: T): Boolean;
begin
  var DefT := Default(T);
  Result := CompareMem(@ARecord,@DefT,SizeOf(T));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  D: TDummy;
begin

  D := Default(TDummy);

  if TZeroRecord<TDummy>.IsZero(D) then
    ShowMessage('D is empty.');

  D.Number := 394;

  if TZeroRecord<TDummy>.IsZero(D) then
    ShowMessage('D is empty.');

end;

但这相当疯狂。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。