Я долго боялся, но вот очень понадобилось и всё же пришлось влезть во всю баганутость проектов WinForms (той самой функции IDE). Вам как, баги тамшние надо в issue? Там наверное штук 10-20 будет только для начала…
Это никто не будет переделывать я думаю. Мы тоже боялись туда влезать. При необходимости мы закроем эту часть. Раз уж мы стали очищать всё от багов
Фигасе! Т.е. по принципу гильотина – лучшее средство от головной боли?
Был вполне рабочий web-интерфейс – закрыли (ну, ладно, тому были объективные причины – закончилась целая эпоха проприетарных web-плагинов и там уже нечего было реанимировать без глобальной переделки на базе других технологий), теперь вот даже простой и удобный редактор формочек хотите пустить под нож лишь на основании того, что кто-то обратил внимание, что он несовершенен, а ремонтировать пока некому?!
Так скоро от “мощной среды разработки” вообще ничего не останется Могу добавить, что еще редактор весьма несовершенен, подсветка кода кривая, темы не поддерживаются, дебагер глюканутый, интеллисенс иногда фигню показывает, анализатор время от времени вообще падает, да еще и с потерей контекста, и сама среда, бывает, крашится ни с того ни с сего… Давайте уж сразу все это “закроем”, чтоб не мучаться, и оставим только голый компилятор! Хотя, нет, он тоже иногда крашится… Доктор сказал в морг – значит в морг!
Вы хотите сказать, что уже есть кому?
Ура, у нас скоро будет работающий редактор формочек, редактор кода с фановской подсветкой и поддержкой ништяков, дебагер для правильных пацанов (без глюков) и волшебный интеллисенс!
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-ки (с пустой заглушкой в базовом дистрибутиве), чтобы можно было как-то просто ручками добавлять её назад тем, кто находит её все-таки еще полезной, несмотря на все глюки? Она же будет пока неизменяемой, один раз адаптировал её таким образом и впоследствии никакой доп. работы по поддержке от вас не потребуется. В идеале – в инсталляторе отдельную галочку завести (по дефолту выключенную), с предупреждением для тех, кто её выбирает, о том, что компонент нестабильный и снят с поддержки, мол, ставьте только на свой страх и риск.
Вы запускаете несколько анимаций одного и того же параллельно и сразу.
Я специально заккоментировал остальные операторы в теле цикла, поэтому выполняется только один вид анимации. Просто логика ее выполнения мне была не ясна. Я думал, что анимация будет выполнятся последовательно по мере цикла, а она выполняется в конце цикла, например, если поставить такой оператор в цикле с i от 0 до 4:
Pz.AnimMoveon(1, 0.05*i*i*i, 0, 2).begin;
то анимация тела будет не по гиперболе, а по прямой из исходной точки в точку с координатами {1, 5}
Нет, тут другая логика. Когда мы делали формы, мы думали, что активно будем использовать это в обучении. Мы ошиблись. Не используем вообще. Кроме того, предложенная нами технология оказалась весьма несовершенной. Например, создание второй формы не поддерживается. И потом сейчас все таки технология wpf сильно прогрессивнее, а редактор форм для нее надо делать с нуля.
Так что я скептически отношусь к этому функционалу. Хотя простые вещи можно делать быстро.
Именно в этом и резон! Быстренько накидать простой, но аккуратный прототип, без особых изысков – ручками ведь выравнивать замучаешься даже небольшую формочку. Понятно, что сложный или изысканный интерфейс на нем не сделать, но так это же и не профессиональная среда! А глюки и странности, ну да, есть, но все же, когда нет другой нормальной альтернативы это лучше, чем ничего. А WPF, конечно, богаче и функциональнее, но вручную его писать… Вы уж попробуйте выделить пока то, что есть, в какой-нибудь отдельный модуль.
Ну вам так и сказали. Когда вы выполняете .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...
функции.