我有一個進程將數據讀入150多個臨時數組,處理數據並從臨時數組複製到工作數組中。工作陣列在一個全局數組中,因此我可以導入多個數據,這意味着我可以重複同一個過程多達100次,最後使用大數組中的一組數據來保存我可以使用,比較和執行的100倍工作數據。如何重構數組之間的複製/移動數據?
我有150個以上的陣列,所以150倍:
// for each array
SetLength(myData[Idx].WorkNames,Length(tmpNames)); // <- prepare to copy
for i := 0 to High(tmpNames) do // <- copy
myData[Idx].WorkNames[i]:=tmpNames[i];
SetLength(tmpNames,0); // <- clear tmp array
4行代碼對於每個陣列 - 150x4 = 600 LOC +初始+空行 - 大約900 LOC。
這裏是我做的例子:
type
TName = record
NameID:integer;
Description:string;
end;
TItem = record
ItemID:integer;
Description:string;
Active:boolean;
end;
TWorkData = record
WorkDataType:string;
WorkNames:array of TName;
WorkItems:array of TItem;
end;
var
AllWorkData:array of TWorkData; // <- global array that has all work data - up to 100x sets of work data
tmpNames:array of TName; // <- tmp arrays before saving to work array
tmpItems:array of TItem; //
procedure TForm1.Button1Click(Sender: TObject);
var i,Idx:integer;
begin
// 1. read data into tmp arrays
ReadDataIntoTmpArrays;
ProcessTmpData;
// 2. copy tmp arrays into work data
Idx:=GetWorkDataIdx; // <- work data sequence number; start with 0
AllWorkData[Idx].WorkDataType:=GetWorkDataName(Idx);
SetLength(AllWorkData[Idx].WorkNames,Length(tmpNames));
SetLength(AllWorkData[Idx].WorkItems,Length(tmpItems));
for i := 0 to High(tmpNames) do
AllWorkData[Idx].WorkNames[i]:=tmpNames[i];
for i := 0 to High(tmpItems) do
AllWorkData[Idx].WorkItems[i]:=tmpItems[i];
// 3. clear tmp arrays
SetLength(tmpNames,0);
SetLength(tmpItems,0);
end;
問:有什麼我能做到這一點更容易維護,重構代碼?
這行'AllWorkData [0] .WorkNames:= tmpNames;'說:'[dcc32錯誤] Unit1.pas(90):E2008 Incompatible types'。我究竟做錯了什麼? –
這是因爲.'WorkNames'和'tmpNames'是不屬於賦值兼容的不同類型。改用'TArray'代替'T'的適當類型。 –
啊哈,現在有用。所以,你建議用'TArray'替換所有'T'陣列...... –