Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Здравствуйте! Делал несколько месяцев назад программку для игры Аион, чтобы писать цветным текстом в чате (ссылка). Нужно исходный текст разбить на равные части по N (от 1 до 5) символов в каждой части. Решил добавить изменение цвета в ручную с помощью слайдеров, но так как делал через цикл, то бывают что этот цикл прерывается. Есть еще идеи как сделать не глючный цикл или разбить текст другим способом? Собственно мой проект - ссылка (.ехе) и ссылка2 (не скомпилированный)
это все замечательно, но на будущее лучше вам самому изолировать проблему и сделать маленький демо проект, содержащий суть проблемы. потому что раскапывать и выяснять где проблемный код, особенно в чужих немаленьких исходниках, это трата времени. К примеру, я вот не сразу нашел этот цикл. да и не всегда нужно показывать исходники, если только вы не против чтобы их видели в открытом доступе. Как задавать вопросы
Если честно, я даже не знаю как сделать маленький демо проект, т.к. даже сейчас когда немного подрезав проект (тот что в 1 посте, оригинал еще больше ) цикл вроде стал нормально работать, возможно иза того что в оригинале использовал фоновую музыку PlaySoundFile "хх.wma" "Loop" по кругу. Насчет исходников - мне не жалко, может быть кому то пригодится. Да и любой кто знаком с Необук хотя бы 2 месяца напишет лучше код, чем мой. Но за идеи разбивки текста на примере моего проекта штатными средствами без использования циклов буду очень благодарен) Во всем и вся только "метод тыка"
навскидку, основные действия, дающие конечный результат, и занимающие наибольшее время (в вашем случае Gosub rgb) лучше не помещать на вкладку Value Changing слайдера, потому что возникнет конкуренция, когда быстро изменяющееся значение слайдера будет пытаться запустить еще не закончившую работу после предыдущего изменения медленную подпрограмму. Лучше повесить на отдельную кнопку. Да и потом, это позволит указывать значения rgb вручную в полях ввода (когда они известны например), т.к. слайдер не очень информативен. Сейчас думаю как превратить 0-255 значения в доли единицы... Как задавать вопросы
0-255 если я правильно Вас понял, то нужно разделить 255 и "запятые" заменить на "точки" (или наоборот, смотря от чего идти). В принципе можно и на кнопку сделать (поначалу так и было), но захотелось чтобы результат отображался сразу в реальном времени, но появилась проблема с циклом. Во всем и вся только "метод тыка"
когда быстро изменяющееся значение слайдера будет пытаться запустить еще не закончившую работу после предыдущего изменения медленную подпрограмму.
Чтобы это не происходило, т.е. требуется обязательное полное выполнение текущего не законченного скрипта, можно в самом его начале написАть примерно так:
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
попробуйте, я немного прокомментировал красный слайдер. работает быстрее. Но у вас там оптимизировать и оптимизировать. ладно гляну этот тормозной GoSub rgb...
Пока нельзя, новичкам... Это сделано в целях "безопасности".
ЦитатаDEMBEL ()
тогда слайдер тормозить начнет
Почему? В конечном итоге у нас имеется Value Changed, которое срабатывает когда мышь отпущена, а это уже другое событие.
ЦитатаDEMBEL ()
лучше просто не связываться с событием Value Changing или класть туда только быстрые скрипты
Ну, скрипты всегда должны быть быстрыми. Все определяется поставленной задачей. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Все когда-то начинали, и тоже, в основном, методом тыка, но все же лучше "изучать материальную часть" NB, это поможет сэкономить кучу времени.
В NB "метод тыка" ещё прокатывает, а вот во взрослых языках уже нет. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
[DecimalSymbol] вам лучше указать 1 раз при старте проекта, и уберите StrReplace еще может я ошибаюсь, но эта байда
Код
Math "[b1]/[n1]" "2" "[c1]" Math "Round([c1])" "0" "[cx]" If "[cx]" "<" "[c1]" SetVar "[c2]" "[cx]+1" Else SetVar "[c2]" "[cx]" EndIf
может быть заменена на Math "Trunc([b1]/[n1])+1" "0" "[c2]" логика следующего цикла для меня темный лес, но наверняка и его можно сделать немного подобрее, думайте Как задавать вопросы
Math "[b1]/[n1]" "2" "[c1]" Math "Round([c1])" "0" "[cx]" If "[cx]" "<" "[c1]" SetVar "[c2]" "[cx]+1" Else SetVar "[c2]" "[cx]" EndIf
здесь я пытался сделать остаток целым, т.е. допустим получили мы значение [с1] равное 7.2, то в окне "Результат" должно быть 8 частей. (7=7, 7.2=8, 7.6=8, 8=8 - как то так).
Цитата
[DecimalSymbol] вам лучше указать 1 раз при старте проекта, и уберите StrReplace
уже сделал С циклами у меня совсем беда, читал справку и примеры на этом форуме. С легкими примерами у меня получается, но суть "где-то там", не доходит) Поэтому просто скопировал из примера на форуме где был цикл с массивом и методом тыка "подправил" под свой проект. Поэтому объяснить свои действия в этом цикле не в состоянии Во всем и вся только "метод тыка"
т.е. надо было просто отбросить дробную часть и прибавить 1. Но вот если дробной части нет, тогда косяк... Если в реальной работе 7=8 это не большая проблема (смотрите на скорость работы подпрограммы, может оно того и стоит), тогда можно и короче Math "[b1]/[n1]+1" "0" "[c2]" Если проблема, то будь по вашему:
Код
Math "[b1]/[n1]" "2" "[c1]" Math "[b1]/[n1]" "0" "[c2]" If "[c1]" ">" "[c2]" SetVar "[c2]" "[c2]+1" EndIf
Старайтесь не использовать лишних промежуточных переменных, особенно если у вас уже висят в памяти куча уже ненужных, которые можно привлечь к делу. Примерно вот что получилось (вроде работает, если не так то допилите)
Код
.кол-во частей по n-символов Math "[b1]/[n1]" "2" "[c1]" Math "[b1]/[n1]" "0" "[c2]" If "[c1]" "=" "[c2]" SetVar "[c2]" "[c2]-1" EndIf
SetVar "[d2]" "" .цикл начинается с 0 (так меньше вычислений), поэтому мы соотв-но подправили логику вычисления [c2] Loop "0" "[c2]" "[i]" .простые целочисленные вычисления можно писать прямо в командах SubStr "[a1]" "[i]*[n1]+1" "[n1]" "[d1]" .теперь запишем приращение строки в "буферную" переменную предварительно .очистив ее выше SetVar "[d2]" "[d2][#91]color:[d1];[r] [g] [b][#93]" EndLoop .теперь присвоим [d2] в результат, так у нас в окне появится сразу а не по линиям SetVar "[bx]" "[d2]"
в слайдерах наверное лучше сначала делать SetObjectFill а потом GoSub, так визуально "быстрее" Как задавать вопросы
т.е. надо было просто отбросить дробную часть и прибавить 1
Подумалось тут про округление... В формулах можно использовать Round и Trunc, а округление "вверх" и "вниз" что ли нету? Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Round - обычное округление (7.4=7, 7.5=8, 7.8=8) Trunc - отбрасывание дробной части или округление "вниз" (7.4=7, 7.5=7, 7.8 =7) Округления "верх" вроде нет, т.е. нужно самому писать код, например как предложил DEMBEL
Код
Math "[b1]/[n1]" "2" "[c1]" Math "[b1]/[n1]" "0" "[c2]" If "[c1]" ">" "[c2]" SetVar "[c2]" "[c2]+1" EndIf
Про Round и Trunc я в курсе, насколько понимаю, это стандартные дельфийские функции, вот и стало интересно есть ли другие. Я в дельфи ни зуб ногой Вот, к примеру, в Lua есть округление и вверх и вниз.
А если пойти топорным способом
Код
Math "436/33+0,999999" "0" "[r]"
Добавлено (24 Ноября 2014, 12:05) --------------------------------------------- Т.е.
Код
Math "Trunc(436/33+0,999999)" "0" "[r]"
Пожалуйста, не надо ко мне на "Вы", а то чувствую себя бабулькой)
Сообщение отредактировано Callisto - Пн, 24 Ноября 2014, 12:06
Старайтесь не использовать лишних промежуточных переменных, особенно если у вас уже висят в памяти куча уже ненужных, которые можно привлечь к делу.
С самого начала нужно приучать себя к упорядочиванию кода, а это приведет к порядку в мыслях и логике. Лучше всего вообще не плодить ненужных переменных (не оставлять хвосты), просто удаляя уже "отработавшие" переменные. В случае необходимости эти переменные всегда можно вернуть к жизни в любой момент. Для промежуточных результатов можно использовать одни и те же переменные (например, [Result]), но не забывать удалять эти переменные по окончании вычислений (работы скрипта), а так же следить за тем, чтобы в текущем скрипте не было обращений, например, к подпрограммам, тоже использующих те же переменные ([Result]), за исключением случаев когда требуется напрямую передать через эти переменные что-то в подпрограмму.
Впрочем, все приходит с опытом и практикой, и каждый сам вырабатывает "свой стиль", но аккуратность и рациональность в коде должны присутствовать всегда.
Кстати, DeHeDe, в конструкции IF..ELSE..ENDIF, если после ELSE не выполняются никакие действия, "ELSE" можно опустить, т.е. просто записать IF..ENDIF.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
но не забывать удалять эти переменные по окончании вычислений (работы скрипта)
мы вообще непозволительно мало используем обьявления переменных. Можно их сделать локальными для каждого скрипта - сами удалятся. Имя можно использовать одно - в каждом скрипте это будет своя переменная. Да и контролировать тип содержимого можно.
Мучился полночи я с кодом - перемудрил скорее всего. Так как программа актуальна для Аион версии 3.9 и ниже (а сейчас 4.6), т.е. только фришек, то думаю хватит с этого проекта. А для ознакомления с НБ лучше попроще примеры использовать). Оставляю ссылки, вдруг кому-нибудь пригодится) ссылка1 - архив с исходником, не скомпилированный. ссылка2 - готовая программа (.exe)
Тему можно закрывать, критика приветствуется
Добавлено (26 Ноября 2014, 15:19) --------------------------------------------- Всем спасибо)