Forum > Russian

Неправильно исполняется код

<< < (5/6) > >>

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

Go to full version