Ошибки PascalABC.NET

Я долго боялся, но вот очень понадобилось и всё же пришлось влезть во всю баганутость проектов WinForms (той самой функции IDE). Вам как, баги тамшние надо в issue? Там наверное штук 10-20 будет только для начала…

Это никто не будет переделывать я думаю. Мы тоже боялись туда влезать. При необходимости мы закроем эту часть. Раз уж мы стали очищать всё от багов

2 лайка

Фигасе! Т.е. по принципу гильотина – лучшее средство от головной боли? :hushed:

Был вполне рабочий web-интерфейс – закрыли (ну, ладно, тому были объективные причины – закончилась целая эпоха проприетарных web-плагинов и там уже нечего было реанимировать без глобальной переделки на базе других технологий), теперь вот даже простой и удобный редактор формочек хотите пустить под нож лишь на основании того, что кто-то обратил внимание, что он несовершенен, а ремонтировать пока некому?!

Так скоро от “мощной среды разработки” вообще ничего не останется :frowning_face: Могу добавить, что еще редактор весьма несовершенен, подсветка кода кривая, темы не поддерживаются, дебагер глюканутый, интеллисенс иногда фигню показывает, анализатор время от времени вообще падает, да еще и с потерей контекста, и сама среда, бывает, крашится ни с того ни с сего… Давайте уж сразу все это “закроем”, чтоб не мучаться, и оставим только голый компилятор! Хотя, нет, он тоже иногда крашится… Доктор сказал в морг – значит в морг! :smiling_imp:

Вы хотите сказать, что уже есть кому? :smile:

Ура, у нас скоро будет работающий редактор формочек, редактор кода с фановской подсветкой и поддержкой ништяков, дебагер для правильных пацанов (без глюков) и волшебный интеллисенс!

uses Graph3D; 
var Pz:=Sphere(0, 0, 0, 0.2, colors.Blue);
begin
Window.Maximize;
Camera.UpDirection:=V3D(0,1,0);
Camera.Position:=P3D(0,0,30);
Camera.LookDirection:=V3D(0,0,-30);
for var i:=0 to 4 do
  begin
Pz.MoveTo(1, 0, 0);
//Pz.MoveOn(1, 0, 0);
//Pz.AnimMoveOn(1, 0, 0, 5).Begin;
//Pz.AnimMoveTo(1, 0, 0, 5).Begin;
  end;
end.

Объясните мне, пожалуйста, почему в этом коде операторы MoveTo и AnimMoveTo работают по-разному, это ошибка? Если нет, тогда в чем отличие между AnimMoveOn и AnimMoveTo?

Да ладно)). Мне вот оно понадобилось чтоб зрительно расставить элементы формы. А потом просто копирую координаты в нормальную программу. Как ни крути, даже с багами, это удобнее чем вслепую координаты вписывать, а потом смотреть не налезло ли 1 на другое. И так loop 100 do.

Anim это сокращение от “Анимация”. То есть просто Move телепортирует объект, а AnimMove плавно сдвигает его.

А MoveTo и MoveOn отличаются тем относительно чего они двигают. То есть MoveTo(1,0,0) сдвигает в точку (1; 0; 0), а MoveOn(1,0,0) сдвигает на 1 в сторону X+, относительно того где был объект когда началась анимация. Если он был в точке (5; 2; 3) - MoveOn(1, 0, 0) сдвинет его в точку (6; 2; 3), а MoveTo(1, 0, 0) сдвинет его в точку (1; 0; 0).

По моему, хоть пишете Вы с @RAlex-ом много, но сути, кроме выяснения отношений, мало.

Никто не собирался полностью отказываться от редактора формочек, но вы вот попробуйте что то в нём сделать. Это не те баги компилятора, которые встречаются раз пару дней. Тут каждые 5 мин бьёшься бошкой о что то сырое и твёрдое. Как 1 из главных фич в таком состоянии это нельзя позиционировать, особенно считая что нет ни 1 разработчика, которому интересно было бы исправить всё это (хотя, кстати, им может стать каждый желающий. К примеру Вы).

Мне вот, когда я учился, 1 из учителей сказал что мне стоит научится в этом редакторе формочек работать, типо это очень важное умение. Ну и тогда я на долго вперёд ужасов насмотрелся. Так может любой новичок туда случайно залазить, а потом привыкает работать без анализатора кода и в условиях что лишнее лучше не трогать, а то ломается всё (был уже 1 такой, в помощь новичкам писал). А для карьеры программиста это как яд.

А, понял

В принципе, да. Он написан хорошим студентом 5 лет назад, идеи реализации мы уже забыли, он никем не поддерживается. Если хотим среду без багов, эту часть надо закрыть

Это ваша ошибка. Вы запускаете несколько анимаций одного и того же параллельно и сразу. Так нельзя. On относительно текущей точки, to — к абсолютной точке

Мы можем это поддерживать. Баги в интеллисенс потихоньку исправлять будем, но он у нас в силу общего алгоритма все равно останется нечувствительным к некоторым вещам. Баги в компиляторе это конечно наша основная ответственность. И пожалуйста имейте в виду, что всякие новые хотелки в языке будут потенциально множить баги. Так что предложения об улучшении должны быть самые необходимые, а не “давайте замутим это”

Хорошо, а можно тогда оформить эту удаляемую часть в виде плагина или опциональной dll-ки (с пустой заглушкой в базовом дистрибутиве), чтобы можно было как-то просто ручками добавлять её назад тем, кто находит её все-таки еще полезной, несмотря на все глюки? Она же будет пока неизменяемой, один раз адаптировал её таким образом и впоследствии никакой доп. работы по поддержке от вас не потребуется. В идеале – в инсталляторе отдельную галочку завести (по дефолту выключенную), с предупреждением для тех, кто её выбирает, о том, что компонент нестабильный и снят с поддержки, мол, ставьте только на свой страх и риск.

1 лайк

Вы запускаете несколько анимаций одного и того же параллельно и сразу.

Я специально заккоментировал остальные операторы в теле цикла, поэтому выполняется только один вид анимации. Просто логика ее выполнения мне была не ясна. Я думал, что анимация будет выполнятся последовательно по мере цикла, а она выполняется в конце цикла, например, если поставить такой оператор в цикле с i от 0 до 4:

    Pz.AnimMoveon(1, 0.05*i*i*i, 0, 2).begin;

то анимация тела будет не по гиперболе, а по прямой из исходной точки в точку с координатами {1, 5}

Нет, тут другая логика. Когда мы делали формы, мы думали, что активно будем использовать это в обучении. Мы ошиблись. Не используем вообще. Кроме того, предложенная нами технология оказалась весьма несовершенной. Например, создание второй формы не поддерживается. И потом сейчас все таки технология wpf сильно прогрессивнее, а редактор форм для нее надо делать с нуля.

Так что я скептически отношусь к этому функционалу. Хотя простые вещи можно делать быстро.

Именно в этом и резон! Быстренько накидать простой, но аккуратный прототип, без особых изысков – ручками ведь выравнивать замучаешься даже небольшую формочку. Понятно, что сложный или изысканный интерфейс на нем не сделать, но так это же и не профессиональная среда! А глюки и странности, ну да, есть, но все же, когда нет другой нормальной альтернативы это лучше, чем ничего. А WPF, конечно, богаче и функциональнее, но вручную его писать… Вы уж попробуйте выделить пока то, что есть, в какой-нибудь отдельный модуль.

1 лайк

Ну вам так и сказали. Когда вы выполняете .Begin для анимации - она только начинает выполнятся. И выполнение кода не ожидает пока анимация закончится, а сразу выполняет следующую итерацию цикла. Таком образом, до того как первая анимация закончилась - вызываются все сразу.

Чтоб анимации выполнялись последовательно - их надо сначала присвоить отдельной переменной, так:

uses Graph3D;

begin
  Window.Maximize;
  Camera.UpDirection := V3D(0, 1, 0);
  Camera.Position := P3D(0, 0, 30);
  Camera.LookDirection := V3D(0, 0, -30);
  
  var Pz := Sphere(0, 0, 0, 0.2, colors.Blue);
  
  Sleep(1000);//чтоб сразу не началось, а сначала запустилось до конца
  
  var anim:=Pz.AnimMoveTo(0, 0, 0, 0);
  for var i := 0 to 4 do
    anim := anim + Pz.AnimMoveOn(1, 0.05*i*i*i, 0, 1);
  
  anim.Begin;
  
end.

Если прибавлять анимации - они будут выполнятся последовательно, а если умножать - одновременно.

Но и это работает не идеально. К примеру так - лучше:

uses Graph3D;

begin
  Window.Maximize;
  Camera.UpDirection := V3D(0, 1, 0);
  Camera.Position := P3D(0, 0, 30);
  Camera.LookDirection := V3D(0, 0, -30);
  
  var Pz := Sphere(0, 0, 0, 0.2, colors.Blue);
  
  var pts_c := 50;
  var pts := new Point3D[pts_c];
  for var i := 0 to pts_c-1 do
  begin
    var ang := 90*(i/(pts_c-1));
    ang := DegToRad(ang);
    pts[i] := P3D(sin(ang)*5,cos(ang)*5-5,0);
  end;
  
  var anim := Pz.AnimMoveTrajectory(
    pts,
    5,
    procedure->writeln('анимация закончилась')
  );
  
  anim.Begin;
  
  writeln('Анимация уже началась, но это выпишет до того как она закончится');
  
end.

Спасибо за разъяснения. Есть ли способ объявить переменную анимации неявно (например, в виде глобальной переменной)? Второй вариант мне не очень подходит, т.к. я хочу, чтобы анимация шла не по предвычисленной заранее траектории, а в процессе ее вычисления, этому как раз отвечает первый вариант.

Удивило…

begin
  var F: () -> integer := () -> Random(1,100);
  Println(0+F+F);
  Println(F+0+F);
  //Println(F+F+0); // Нет перегруженной подпрограммы с такими типами параметров
  //Println(F); // Возможны два преобразования типов
  Println(F());
  Println(integer(F));
end.

Неявно это вызывать begin без присвоения переменной. А тип вы можете сами посмотреть анализатором кода. Просто объявите переменную с тем же типом, который возвращают все Anim... функции.