如何解决记录为空?
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;
疯狂的东西
如果您绝对不想单独比较每个成员,可以在某些情况下比较字节。
但请注意,一般情况下,不能通过比较字节来比较两条记录。只提两个明显的原因:
-
即使字符串成员由两个不同的字符串堆对象表示,它们在语义上也可能是相等的(因此比较器说“不相等”而实际上它们相等)。
-
如果记录不是
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 举报,一经查实,本站将立刻删除。