Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在数组中搜索空/空值,然后用其他值擦除并更新字段_Delphi_Dymo - Fatal编程技术网

Delphi 如何在数组中搜索空/空值,然后用其他值擦除并更新字段

Delphi 如何在数组中搜索空/空值,然后用其他值擦除并更新字段,delphi,dymo,Delphi,Dymo,我正在使用delphi打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签的值时,我们如何删除空格,并使下一个标签利用为null或空值提供的空格 如果我没弄错的话,你有一个字符串值为['Item1','Item2','Item4']的数组,你想删除空项,使其成为['Item1','Item2','Item4'] 正如在评论中所述,这可以用一个好的旧if语句来完成,但我宁愿给你一个通用的解决方案 第一件事是创建一个新的单元,它有一个助手,可以从数组中删除任何给定的值 unit Arr

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

如果我没弄错的话,你有一个字符串值为['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.
我在代码中添加了注释,这样您就可以看到它是如何工作的

唯一剩下的就是显示结果


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