Вместо создания массива целых чисел, создайте массив элементов управления TLabel
. Этот вы можете отсортировать так же, как массив целых чисел. В самом деле, учитывая MyLabel: TLabel
, вы можете легко получить соответствующее целое число как StrToInt(MyLabel.Caption)
.
Кроме того, подход FindComponent
не очень эффективен. Я бы сделал
const
ALLOC_BY = 100;
MAGIC_TAG = 871226;
var
i: Integer;
ActualLength: integer;
FLabels: array of TLabel;
begin
SetLength(FLabels, ALLOC_BY);
ActualLength := 0;
for i := 0 to ControlCount - 1 do
if Controls[i] is TLabel then
with TLabel(Controls[i]) do
if Tag = MAGIC_TAG then
begin
if ActualLength = length(FLabels) then
SetLength(FLabels, length(FLabels) + ALLOC_BY);
FLabels[ActualLength] := Controls[i];
inc(ActualLength);
end;
SetLength(FLabels, ActualLength);
SortArray(FLabels) // with respect to the StrToInt(CurLabel.Caption) of each
// CurLabel: TLabel.
Конечно, вы можете пропустить выделение чанка, если заранее знаете количество меток.
Убедитесь, что для каждой из меток, которые должны быть включены в массив, для Tag
установлено значение MAGIC_TAG
.
Другой вариант - создать массив
FLabelDataArray: array of TLabelData;
из
type
TLabelData = record
Control: TLabel;
Value: integer;
end;
, где
FLabelDataArray[i].Value := StrToInt(FLabelDataArray[i].Control.Caption);
вычисляется только один раз.