Один всё таки озвучу. Например буквально на днях в проекте создавал класс который включал в себя массив записей. В записях планировал создать два поля типа boolean, последовательность действий была такая - сначала описал только одно поле с данным типом, проверил - всё работало, как только добавил второе поле с таким же типом, программа работать перестала. Убирал второе поле - работало, добавлял - переставало. Сам код не сохранился...
я бы предложил реализовать проект ещё раз, и проверить воспроизведётся ошибка или нет.
Без кода, разговор получится на пустом месте.
но я уже вижу тревожные звоночки в виде:
procedure StatDataToStringGrid(var StringGrid:TstringGrid);
procedure StringGridAutoSize(Var StringGrid:TstringGrid);
procedure StatDataToTabel(var tab:TTabel);
а именно - тревожит наличие "var". Причём, я не думаю, что ошибка была в исползовании "var". Просто само его использование в данным случае излишне. "var" для класса имеет несколько иное значение, чем "var" для record-а.
Понимаю, что без кода разговор скорее всего будет ни о чём. Попробую на днях восстановить то, что было.
По поводу var - хотелось бы знать отличие. В данном случае поставил var, чтобы процедура работала непосредственно с данными классами не создавая копию. Без них код не работал - данные из процедур не передавались далее. Кстати, процедура procedure StatDataToTabel(var tab:TTabel); у меня так и не заработала как надо. Почему опять таки я не понял.
Код её следующий:
procedure TStatistic.StatDataToTabel(var tab:TTabel); //не работает
var i:integer;
tempTab:TTabel;
new:TRow;
begin
tempTab:=TTabel.Create;
new:=TRow.Create;
SetLength(new.Cells,3);
SetLength(tempTab.Rows,length(SData)+1);
new.Cells[0]:=systoutf8('Дата');
new.Cells[1]:=systoutf8('Приход');
new.Cells[2]:=systoutf8('Уход');
tempTab.AddRow(new);
tempTab.Rows[0]:=new;
// showmessage(tempTab.Rows[0].RowToUTF8String);
for i:=1 to length(SData)+1 do
begin
//showmessage(tempTab.Rows[0].RowToUTF8String);
new.Cells[0]:=DateToStr(SData
.date,FormatSettings);
new.Cells[1]:=IntToStr(SData.input);
new.Cells[2]:=IntToStr(SData.output);
tempTab.Rows:=new; //tempTab.AddRow(new);
// showmessage(tempRow.RowToUTF8String);
end;
tab:=temptab;
end;
Коротко о том, что происходит - класс TTabel - это класс таблиц мною созданный. В TTabel имеется массив TRow, который является строками в таблицах, в TRow имеются массивы Cells. Т.е. для создания таблицы 3x3 мы задаем количество ячеек Cells в TRow равное 3-м и добавляем три таких Row в TTabel. Сам класс TTabel уже использовал в проекте и всё работало достаточно долго (проект начал в 2017).
Эта процедура должна записать данные из SData (Массив записей с полями текущей даты, прихода и ухода. Даты в массиве идут последовательно по дням например 01.01.2019, 02.01.2019 и т.д.) в таблицу Tab. По результату получается, что вся таблица Tab заполнена данными только за одну дату - последнюю. В классе TTabel есть процедура Add для добавления строк, изначально использовал её, по вышеозвученному результату предположил, что дело в ней (хотя в других случаях она всегда работала) и реализовал добавление строк к таблицу так как написано в коде выше. Но результат оказался идентичным. В комментариях стоят showmessage - таким образом следил за тем, что происхоидит - одно могу сказать точно - SData заполнен нужными данными и вопрос тут в том, как они записываются в TTabel.