我正在使用 delphi 打印标签。我将值存储在数组中并打印相同的值。我想知道,当我没有标签值时,我们如何删除空间并带上下一个标签以利用为空值或空值提供的空间。
问问题
1621 次
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 回答