如何搜索数组中的空值/空值,然后使用其他值擦除和更新字段

如何搜索数组中的空值/空值,然后使用其他值擦除和更新字段

问题描述:

我正在使用delphi打印标签。我将值存储在数组中并打印相同。我想知道,当我对标签没有价值并使下一个标签利用为空值或空值提供的空间时,我们如何删除空间。如何搜索数组中的空值/空值,然后使用其他值擦除和更新字段

+2

这听起来像良好的OLE”工作'if'声明,但请张贴一些代码,以便我们提供更可靠的建议。 – GolezTrol

+0

使用'TArray.Where 'from https://github.com/SirRufo/stateless/blob/master/Stateless/Stateless.Utils.pas#L379 –

所以,如果我理解你的权利,你有一个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; 

叫帮手,我放在评论中的代码,所以你可以看到它是如何工作的。

剩下的只是显示结果。

enter image description here

在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. 
+0

TValue可能是一个“坏”的名字,因为已经有了一个数据类型Delphi称为TValue。你应该考虑更通用,因为你将它硬编码为字符串数组。 –

+2

@JensBorrisholt:TValue是为了举例。由于对所需项目类型的了解有限,因此我可以选择使这部分易于修改。在这个例子中,我使用了字符串类型以便于说明。 –

+0

我正在使用delphi 7,并且使用字符串数组来存储值 – delsql