Forum > Russian
Неправильно исполняется код
devisa_san:
--- Quote from: skalogryz on August 14, 2019, 05:44:52 pm ---правильно постить код, можно при помощи тэга:
--- Code: ---[code=pascal]
writeln('hello world');
[ /code]
--- End code ---
(пробел в закрывающем тэге между "[" и "/code]" нужно убрать. здесь он для примера)
результат:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} --- writeln('hello world');
https://wiki.freepascal.org/Forum#Use_code_tags
--- Quote from: devisa_san on August 14, 2019, 05:42:50 pm ---В общем в цикле после SData идут квадратные скобки и индекс i внутри них. SData - это массив записей.
--- End quote ---
это всё хорошо, но в цикле, в котором ты проходишь SData, ты не создаёшь новых рядов для TTabel.
У тебя даже закоментирован код tempTab.AddRow(new);
И он правильный, но только при условии, что "new" будет точно так же оздаваться внутри цикла, а не до него.
--- End quote ---
Мой косяк. Не тот код всё таки запостил. Там закомментированна строчка - это то, что должно было выполняться и оно не работало. А закомментировал я её просто потому что пробовал разные варианты и в текущем смотрел, что вообще запишется. Т.е. должно работать, если new создавать каждый новый цикл? Но почему? Потому что мы каждый раз при добавлении передаём ссылку на экземпляр класса в TTabel, а если этого не делать, то все записи в TTabel будут ссылками на один и тот же экземпляр и потому результат и получается таким, что таблица состоит только из того, что было в последней строке?
skalogryz:
--- Quote from: devisa_san on August 14, 2019, 06:12:13 pm ---Т.е. должно работать, если new создавать каждый новый цикл?
--- End quote ---
да
--- Quote from: devisa_san on August 14, 2019, 06:12:13 pm ---Потому что мы каждый раз при добавлении передаём ссылку на экземпляр класса в TTabel, а если этого не делать, то все записи в TTabel будут ссылками на один и тот же экземпляр и потому результат и получается таким, что таблица состоит только из того, что было в последней строке?
--- End quote ---
нет. TTabel у тебя один.
у тебя на каждую итерацию нужно создавать новый TRow.
сколько рядов, столько раз TRow нужно создавать.
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---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; for i:=1 to length(SData)+1 do begin new:=TRow.Create; SetLength(new.Cells,3); new.Cells[0]:=DateToStr(SData[i-1].date,FormatSettings); new.Cells[1]:=IntToStr(SData[i-1].input); new.Cells[2]:=IntToStr(SData[i-1].output); tempTab.Rows[i]:=new; end; tab:=temptab;end;
devisa_san:
--- Quote from: skalogryz on August 14, 2019, 07:01:35 pm ---нет. TTabel у тебя один.
у тебя на каждую итерацию нужно создавать новый TRow.
сколько рядов, столько раз TRow нужно создавать.
Почему нет? Фишка в том, что в результате получается таблица в которой количество TRow правильное, но эти TRow одинаковые. Что тогда в данном варианте происходит? Получается на каждой итерации я присваиваю значение одному и тому же экземпляру класса, а в TTabel у меня храняться только ссылки на него. И тогда мне становится понятно, почему вся таблица была заполнена теми значениями, что в SData были последние. И тогда действительно всё должно заработать, если создавать в цикле каждый раз новый TRow.
--- End quote ---
skalogryz:
--- Quote from: devisa_san on August 14, 2019, 08:38:38 pm ---Почему нет?
--- End quote ---
потому что ранее ты писал про "TTabel":
--- Quote from: devisa_san on August 14, 2019, 06:12:13 pm ---Потому что мы каждый раз при добавлении передаём ссылку на экземпляр класса в TTabel, а если этого не делать, то все записи в TTabel будут ссылками на один и тот же экземпляр
--- End quote ---
из контекста понятно, что ты говоришь про TRow.
Но т.к. ты создаёшь и TTabel и TRow тебе следует быть внимательнее.
devisa_san:
--- Quote from: skalogryz on August 14, 2019, 08:46:22 pm ---
--- Quote from: devisa_san on August 14, 2019, 08:38:38 pm ---Почему нет?
--- End quote ---
потому что ранее ты писал про "TTabel":
--- Quote from: devisa_san on August 14, 2019, 06:12:13 pm ---Потому что мы каждый раз при добавлении передаём ссылку на экземпляр класса в TTabel, а если этого не делать, то все записи в TTabel будут ссылками на один и тот же экземпляр
--- End quote ---
из контекста понятно, что ты говоришь про TRow.
Но т.к. ты создаёшь и TTabel и TRow тебе следует быть внимательнее.
--- End quote ---
Прошу прощения, действительно по невнимательности написал TTabel имея ввиду TRow. В остальном размышления верны?
Navigation
[0] Message Index
[#] Next page
[*] Previous page