我正在使用delphi打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签的值时,我们如何删除空格,并使下一个标签利用为null或空值提供的空间。
答案 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;
我在代码中添加了注释,以便您了解其工作原理。
唯一剩下的就是显示结果。