2015-10-17 55 views
-1

我正在使用delphi打印標籤。我將值存儲在數組中並打印相同。我想知道,當我對標籤沒有價值並使下一個標籤利用爲空值或空值提供的空間時,我們如何刪除空間。如何搜索數組中的空值/空值,然後使用其他值擦除和更新字段

+2

這聽起來像良好的OLE」工作'if'聲明,但請張貼一些代碼,以便我們提供更可靠的建議。 – GolezTrol

+0

使用'TArray.Where 'from https://github.com/SirRufo/stateless/blob/master/Stateless/Stateless.Utils.pas#L379 –

回答

-1

所以,如果我理解你的權利,你有一個Array字符串值這樣['Item1', 'Item2', '', 'Item4'],你想使它成爲['Item1', 'Item2', 'Item4']刪除空項目?

正如評論所述,這可以用一個好的舊如果聲明,但我寧願給你一個通用的解決方案。

首先要創建一個帶有助手的新單元,該助手可以從陣列中刪除任何給定的值。

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

0

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

TValue可能是一個「壞」的名字,因爲已經有了一個數據類型Delphi稱爲TValue。你應該考慮更通用,因爲你將它硬編碼爲字符串數組。 –

+2

@JensBorrisholt:TValue是爲了舉例。由於對所需項目類型的瞭解有限,因此我可以選擇使這部分易於修改。在這個例子中,我使用了字符串類型以便於說明。 –

+0

我正在使用delphi 7,並且使用字符串數組來存儲值 – delsql