可以中止 Tarray 构造函数以不添加新记录吗?
Can Tarray constructor be aborted to not add new record?
我正在尝试控制、限制添加到数组中的新记录数。这是一个简化的例子:
我正在尝试让变量 LimitToUSA 只允许在数组中创建来自 Country = US 的开发人员:
type
TDevelopers = record
FName: string;
LName: string;
Country: string;
constructor New(const aFName, aLName, aCountry: string);
end;
var
Developers:TArray<TDevelopers>;
LimitToUSA: boolean; // <-- Controlling variable
constructor TDevelopers.New(const aFName, aLName, aCountry: string);
begin
if LimitToUSA And (aCountry <> 'US') then
Exit; // <-- Cancel adding new record here
FName := aFName;
LName := aLName;
Country := aCountry;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
LimitToUSA := True;
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end;
问题是它为非美国开发者添加了空记录:
当你有 50 个开发人员时,这个解决方案很难看,而且维护起来会很烦人:
if LimitToUSA then
begin
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end
else
begin
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end;
是否可以通过构造函数以某种方式取消根据条件添加新记录?
不,你不能那样做。您可以做的是使用 TList<TDevelopers>
并仅添加有效的 class 个实例:
type
TDevelopers = record
LName: string;
FName: string;
Country: string;
constructor New(const aFName, aLName, aCountry: string);
end;
const
NumDevelopers = 5; // or whatever the real number is.
ConstDevelopers: array[0..NumDevelopers - 1] of TDevelopers =
(
(LName: 'Smith'; FName: 'John'; Country: 'US'),
(LName: 'Wolken'; FName: 'Jennifer'; Country: 'US'),
(LName: 'Hazen'; FName: 'Leo'; Country: 'CA'),
(LName: 'Tilson'; FName: 'Bob'; Country: 'UK'),
(LName: 'Willer'; FName: 'John'; Country: 'US')
);
...
var
Developers: TList<TDevelopers>;
I: Integer;
begin
Developers := TList<TDevelopers>.Create;
for I := 0 to High(ConstDevelopers) do
begin
if not LimitToUSA or (ConstDevelopers[I].Country = 'US') then
Developers.Add(ConstDevelopers[I]);
end;
现在,如果你真的需要一个数组,你可以使用 ToArray。
请注意,我现在无法测试此代码(目前,我只能在安全模式下启动此 Mac 然后我不能使用 Windows 虚拟机启动 Parallels)。 但它应该会提示您可以做什么。
备选
或者,您保留代码并简单地删除所有空记录(检查 Country = ''
)。在最新的 Delphi 版本中(包括 Berlin),您可以使用 Delete
从动态数组中删除,就像 Delete
用于字符串。但是倒过来,否则你的索引会遇到麻烦:
for I := High(Developers) downto 0 do
if Developers[I].Country = '' then
Delete(Developers, I, 1);
备选方案 2
为了避免重复自己,您可以这样做:
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
if not LimitToUSA then
begin
ForeignDevelopers := TArray<TDevelopers>.Create(
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'));
Developers := Developers + ForeignDevelopers;
end;
我正在尝试控制、限制添加到数组中的新记录数。这是一个简化的例子:
我正在尝试让变量 LimitToUSA 只允许在数组中创建来自 Country = US 的开发人员:
type
TDevelopers = record
FName: string;
LName: string;
Country: string;
constructor New(const aFName, aLName, aCountry: string);
end;
var
Developers:TArray<TDevelopers>;
LimitToUSA: boolean; // <-- Controlling variable
constructor TDevelopers.New(const aFName, aLName, aCountry: string);
begin
if LimitToUSA And (aCountry <> 'US') then
Exit; // <-- Cancel adding new record here
FName := aFName;
LName := aLName;
Country := aCountry;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
LimitToUSA := True;
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end;
问题是它为非美国开发者添加了空记录:
当你有 50 个开发人员时,这个解决方案很难看,而且维护起来会很烦人:
if LimitToUSA then
begin
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end
else
begin
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
end;
是否可以通过构造函数以某种方式取消根据条件添加新记录?
不,你不能那样做。您可以做的是使用 TList<TDevelopers>
并仅添加有效的 class 个实例:
type
TDevelopers = record
LName: string;
FName: string;
Country: string;
constructor New(const aFName, aLName, aCountry: string);
end;
const
NumDevelopers = 5; // or whatever the real number is.
ConstDevelopers: array[0..NumDevelopers - 1] of TDevelopers =
(
(LName: 'Smith'; FName: 'John'; Country: 'US'),
(LName: 'Wolken'; FName: 'Jennifer'; Country: 'US'),
(LName: 'Hazen'; FName: 'Leo'; Country: 'CA'),
(LName: 'Tilson'; FName: 'Bob'; Country: 'UK'),
(LName: 'Willer'; FName: 'John'; Country: 'US')
);
...
var
Developers: TList<TDevelopers>;
I: Integer;
begin
Developers := TList<TDevelopers>.Create;
for I := 0 to High(ConstDevelopers) do
begin
if not LimitToUSA or (ConstDevelopers[I].Country = 'US') then
Developers.Add(ConstDevelopers[I]);
end;
现在,如果你真的需要一个数组,你可以使用 ToArray。
请注意,我现在无法测试此代码(目前,我只能在安全模式下启动此 Mac 然后我不能使用 Windows 虚拟机启动 Parallels)。 但它应该会提示您可以做什么。
备选
或者,您保留代码并简单地删除所有空记录(检查 Country = ''
)。在最新的 Delphi 版本中(包括 Berlin),您可以使用 Delete
从动态数组中删除,就像 Delete
用于字符串。但是倒过来,否则你的索引会遇到麻烦:
for I := High(Developers) downto 0 do
if Developers[I].Country = '' then
Delete(Developers, I, 1);
备选方案 2
为了避免重复自己,您可以这样做:
Developers := TArray<TDevelopers>.Create(
TDevelopers.New('John','Smith', 'US'),
TDevelopers.New('Jennifer','Wolken','US'),
TDevelopers.New('John','Willer','US'));
if not LimitToUSA then
begin
ForeignDevelopers := TArray<TDevelopers>.Create(
TDevelopers.New('Leo','Hazen', 'CA'),
TDevelopers.New('Bob','Tilson','UK'));
Developers := Developers + ForeignDevelopers;
end;