Delphi 如何在数组中搜索空/空值,然后用其他值擦除并更新字段
我正在使用delphi打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签的值时,我们如何删除空格,并使下一个标签利用为null或空值提供的空格 如果我没弄错的话,你有一个字符串值为['Item1','Item2','Item4']的数组,你想删除空项,使其成为['Item1','Item2','Item4'] 正如在评论中所述,这可以用一个好的旧if语句来完成,但我宁愿给你一个通用的解决方案 第一件事是创建一个新的单元,它有一个助手,可以从数组中删除任何给定的值Delphi 如何在数组中搜索空/空值,然后用其他值擦除并更新字段,delphi,dymo,Delphi,Dymo,我正在使用delphi打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签的值时,我们如何删除空格,并使下一个标签利用为null或空值提供的空格 如果我没弄错的话,你有一个字符串值为['Item1','Item2','Item4']的数组,你想删除空项,使其成为['Item1','Item2','Item4'] 正如在评论中所述,这可以用一个好的旧if语句来完成,但我宁愿给你一个通用的解决方案 第一件事是创建一个新的单元,它有一个助手,可以从数组中删除任何给定的值 unit Arr
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.
我在代码中添加了注释,这样您就可以看到它是如何工作的
唯一剩下的就是显示结果
在Delphi7中,使用好的旧动态数组 使用字符串的值类型,可以解决以下问题: 制作新的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.
这听起来像是一个好的Ole'if语句的工作,但请发布一些代码,这样我们可以给出更可靠的建议。使用TArray。Where from TValue可能是一个坏名字,因为Delphi中有一个名为TValue的allready数据类型。您应该考虑更一般的情况,因为您将其硬编码为字符串数组。@JensBorrisholt:TValue是为了举例。由于对所需项目类型的了解有限,我选择使此部分易于修改。在这个例子中,我使用字符串类型进行简单的说明。我使用delphi 7,我使用字符串数组来存储值。使用的归约算法不是缺乏一些性能吗?最坏的情况是在^2上,不是吗?Delphi 7中是否有TStringList可用?@RenéHoffmann因此,如果性能很重要,并且元素数量巨大,那么值得考虑。否则我就不会花时间了。
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.