0

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

4

2 回答 2

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.
于 2015-10-17T11:29:38.893 回答
-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;

我在代码中添加了注释,以便您了解它是如何工作的。

剩下的就是显示结果。

在此处输入图像描述

于 2015-10-17T11:11:07.727 回答