如何搜索数组中的空值/空值,然后使用其他值擦除和更新字段
我正在使用delphi打印标签。我将值存储在数组中并打印相同。我想知道,当我对标签没有价值并使下一个标签利用为空值或空值提供的空间时,我们如何删除空间。如何搜索数组中的空值/空值,然后使用其他值擦除和更新字段
所以,如果我理解你的权利,你有一个Array
与字符串值这样['Item1', 'Item2', '', 'Item4']
,你想使它成为['Item1', 'Item2', 'Item4']
删除空项目?
正如评论所述,这可以用一个好的旧如果声明,但我宁愿给你一个通用的解决方案。
首先要创建一个带有助手的新单元,该助手可以从阵列中删除任何给定的值。
unit ArrayHelperU;
interface
type
ArrayHelper = record
class procedure RemoveAll<T>(var Values: TArray<T>; const Value: T); static;
end;
implementation
uses
Generics.Defaults;
{ TArrayHelper }
class procedure ArrayHelper.RemoveAll<T>(var Values: TArray<T>; const Value: T);
var
I, Count: Integer;
EqualityComparer: IEqualityComparer<T>;
begin
EqualityComparer := TEqualityComparer<T>.Default;
Count := 0;
for I := low(Values) to high(Values) do
if not EqualityComparer.Equals(Values[I], Value) then
begin
Values[Count] := Values[I];
inc(Count);
end;
SetLength(Values, Count);
end;
end.
下一步是调用它。在我小的演示项目我已经把TMemo
空白表单,然后我从FormCreate
uses
ArrayHelperU;
procedure TForm36.FormCreate(Sender: TObject);
var
Values: TArray<string>;
Buffer, Element: String;
i: Integer;
begin
//Make room for 10 elements
Setlength(Values, 10);
//Initialize the aray with some dummy values
//Some of them are blanks
for i := Low(Values) to High(Values) do
if i mod 2 = 0 then
Values[i] := 'Item' + IntToStr(i);
//Print the array to the screen
Memo1.Lines.Text := 'BEFORE: ';
Buffer := '[';
for Element in Values do
Buffer := Buffer + #39 + Element + #39 + ' ,';
Buffer[Length(Buffer)] := ']';
Memo1.Lines.Add(Buffer);
//Call our ArrayHelper from befor
ArrayHelper.RemoveAll<string>(Values, '');
//Print the array to the screen
Buffer := '[';
for Element in Values do
Buffer := Buffer + #39 + Element + #39 + ' ,';
Memo1.Lines.Add('');
Memo1.Lines.Add('AFTER:');
Buffer[Length(Buffer)] := ']';
Memo1.Lines.Add(Buffer);
end;
叫帮手,我放在评论中的代码,所以你可以看到它是如何工作的。
剩下的只是显示结果。
在Delphi 7使用旧的好的动态数组。
使用字符串的值类型,就可以解决这个问题如下:
创建一个新的VCL应用程序,放置一个备忘录,然后:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure DynamicStringArrayWay;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DynamicStringArrayWay;
var
ValueArray : array of string;
n : Integer;
n2 : Integer;
begin
SetLength(ValueArray, 6);
// fill array:
ValueArray[0] := 'LabelA';
ValueArray[1] := '';
ValueArray[2] := 'LabelB';
ValueArray[3] := '';
ValueArray[4] := 'LabelC';
ValueArray[5] := 'LabelD';
// reduce:
for n := Length(ValueArray)-1 downto 0 do
begin
if (ValueArray[n]='') then
begin
// delete element n:
for n2 := n to Length(ValueArray)-2 do
ValueArray[n2] := ValueArray[n2+1];
SetLength(ValueArray, Length(ValueArray)-1);
end;
end;
// print:
for n := 0 to Length(ValueArray)-1 do
Memo1.Lines.Add(ValueArray[n]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DynamicStringArrayWay;
end;
end.
TValue可能是一个“坏”的名字,因为已经有了一个数据类型Delphi称为TValue。你应该考虑更通用,因为你将它硬编码为字符串数组。 –
@JensBorrisholt:TValue是为了举例。由于对所需项目类型的了解有限,因此我可以选择使这部分易于修改。在这个例子中,我使用了字符串类型以便于说明。 –
我正在使用delphi 7,并且使用字符串数组来存储值 – delsql
这听起来像良好的OLE”工作'if'声明,但请张贴一些代码,以便我们提供更可靠的建议。 – GolezTrol
使用'TArray.Where'from https://github.com/SirRufo/stateless/blob/master/Stateless/Stateless.Utils.pas#L379 –