Логическое значение по умолчанию в массиве записей - Delphi - PullRequest
1 голос
/ 03 июня 2010

Я помогаю своей компании со старым кодом Delphi 7.

В начале была объявлена ​​запись, которая используется для хранения всех данных, которые мы хотим вывести.

тип
TOutput_Type = record
результат: String;
resultoffset: String;
выбранный: логический;
resultcategory: целое число;
конец;

и затем массив этого объявляется

Вывод: массив TOutput_Type;

Длина установлена ​​в начале на большое значение, так как фактическая длина неизвестна.
Этот массив используется повсеместно, но, к сожалению, выбранное значение не всегда устанавливается при использовании.
Моя проблема в том, что я добавляю в сводку данных, но поскольку выбранный параметр не задан, похоже, что Delphi дает ему случайный статус истины или ложи. Есть ли способ установить все экземпляры, выбранные как истинные в начале? Кажется, это достаточно простая вещь, но я не программист на Delphi, поэтому не уверен, возможно ли это? Я знаю, что могу пройти и добавить в selected: = true каждый раз, когда делается новая запись, но я хотел бы сделать это аккуратно в начале, если это возможно ....
Заранее спасибо

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

После вызова SetLengt для выходной переменной вы должны сначала инициировать новые части записи (поскольку новая выделенная память не определена) в цикле for. Что-то вроде:

OldLength := Length(Output);
SetLength(Output, NewLength);
for n := OldLength to NewLength -1 do 
  Output[n].selected := True;
3 голосов
/ 03 июня 2010

Записи, в отличие от объектов, не инициализируются при создании, поэтому вам нужно инициализировать их самостоятельно.Поскольку вы работаете в Delphi 7, вы не можете использовать записи с методами, поэтому я бы сделал функцию инициализации, примерно такую:

type
  TOutputArray: array of TOutput_Type; 

function CreateOutputArray(length: integer): TOutputArray;
var
  i: integer;
begin
  SetLength(result, MyArbitraryItemCount);
  FillChar(result[0], Length(Output)*SizeOf(TOutput_Type), 0);
  for i := 0 to high(result) do
    result[i].selected := true;
end;
0 голосов
/ 03 июня 2010

Я бы пошел на заводской метод, как в вопросе, связанном с dcp. Конструкторы без параметров не допускаются для записей, поэтому вам всегда придется указывать некоторые параметры, которые могут раздражать, если они вам действительно не нужны.

Если это все о инициализации содержимого большого массива один раз в начале, вы также можете использовать это:

SetLength(Output, MyArbitraryItemCount);
FillChar(Output[0], Length(Output)*SizeOf(TOutput_Type), 1);

Тогда все равно 1. Включая selected :) Конечно, вы также можете использовать цикл for ...

...