如何在数组中搜索null / empty值,然后使用其他值擦除和更新该字段

时间:2015-10-17 08:20:16

标签: delphi dymo

我正在使用delphi打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签的值时,我们如何删除空格,并使下一个标签利用为null或空值提供的空间。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

因此,如果我理解正确,那么您有一个Array 字符串值,例如此['Item1', 'Item2', '', 'Item4'],并且您想删除空项目,使其变为['Item1', 'Item2', 'Item4']

如评论中所述,可以使用旧的 if 语句来完成,但我宁愿为您提供通用解决方案。

首先要创建一个带有帮助程序的新单元,该帮助程序可以从数组中删除任何给定值。

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