Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Дата: Вт, 03 Сентября 2013, 14:08 | Сообщение # 31
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Я себе представляю это так....
Сохраняем все переменные в файл.
Читаем весь текст из этого файла в переменную.
С помощью плагина hpwControl и регулярного выражения ищем все нужные названия переменных и собираем их в одну строку через запятую. После просто вызываем команду ClearVariables "Сюда вставляем наш список"
Все. Можно конечно и через цикл, но регуляркой быстрее. Как состовлять регулярку, не ко мне.
Добавлено (03 Сентября 2013, 14:08) --------------------------------------------- Можно опять же с помощью плагина hpwControl искать символы как с начала так и с конца строки. Если префикс, ищем через цикл в строке префикс . Проверяем, если он превый символ, значит префикс.
Суффикс. Ищем знак равно в !строке. Командой hpwStrRevSearch ищем суффикс указав номер символа =. Если найденный символ меньше значения символа = на указанное количество символов (префикс и суффикс может быть как из одного, так и из нескольких символов), тьо это та переменная которая нам нужна. Копируем ее название. Ну и т.д.
If "[[[%]Variable]]" "<>" "" SetVar "[[[%]Variable]]" "" EndIf
тоже лишнее, достаточно SetVar "[SomeVar]" " "
Но, я бы сделал иначе, но так тоже можно, если работает. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 01:48 | Сообщение # 37
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (ponand)
Предлагайте, всегда интересно мнение профессионала
Это, кто? Я-то профессионал?
Профессионалы деньги зарабатывают, а мы так... подмастерье.
В NeoBook вполне неплохо налажена работа со строками, и как показали некоторые опыты, необушные скрипты работают даже быстрее аналогичных VBS, другое дело, что в VBS функций больше, и потому VBS в некотрых ситуациях может оказаться предпочтительнее скриптов NB.
Стандартное решение по поиску символов в строке и есть именно SearchStr (в NeoBook): находится первое вхождение символа в строку, производятся нужные манипуляции, ненужное в строке отбрасывается, и поиск начинается в оставшейся части строки, т.е. цикл повторяется.
Когда я говорил, что сделал бы иначе, то подумал о другой задаче - сначала поиск по префиксу, а потом разделение полученного результата на строки по разделителю, и тут решение уже должно быть иным, а именно - через массив, т.е. строки разбиваются на массив строк, в цикле по массиву ищется префикс, и если находится, то производятся соответствующие манипуляции со строкой. Обозначенную задачу тоже можно решить подобным методом, но я не уверен, что это будет быстрее, чем прямолинейное сканирование строки (если не наоборот), но строки, которыми будет манипулировать NB, уже будут короче. Пробовать надо.
Цитата (ponand)
визуально, скорость обработки не изменилась.
Возможно, но первый вариант был вообще, как иногда говорят, жесть, поскольку в строку по поиску одного префикса постоянно подсовывался другой (да и ещё более длинный), и он же подсовывался в имена переменных, которые NB тоже нужно было окучить. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 19:06 | Сообщение # 39
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (Сергей)
а если так:
Интересная мысль, я б не додумался.
В принципе, можно и так, только нужно учесть, что каждое обращение к файлу (FileRead и FileDelLine) предусматривает открытие файла, чтение/удаление строки, закрытие файла (эта последовательность действий скрыта от необукера), и так - весь цикл. Практичнее вывести хотя бы FileRead из цикла, заменив её один раз на FileToVar (прочесть файл целиком за один присест), и уже в цикле по массиву строк произвести поиск префикса (теоретически так должно быть быстрее). Желательно ещё и FileDelLine куда-то по-дальше пристроить, но тогда идея уже не та будет.
Добавлено (04 Сентября 2013, 19:06) --------------------------------------------- Хотя, стоп! В таком решении есть засада: если мы удаляем в цикле строку, то количество строк в файле будет постоянно меняться, а точнее - уменьшаться, и при чтении/удалении следующей строки получиться перескакивание через строку....
Боюсь, что напрямую так не пойдет...
Нужно тогда делать через While (пока файл не закончился), и, после удаления строки, возвращать цикл на удаленную позицию.
Впрочем, можно попробовать на место удаленной строки вставить чистую, т.е. FileInsLine.... Или посредством той же StrReplace на место "=" записать в строку любой "мусор" (или вообще удалить), LoadVariables её отбросит. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 19:40 | Сообщение # 41
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
Мне стыдно это читать... После удаления строки присваиваем переменной счетчика -1 и переменной количества строк -1
mishem, ты читать умеешь:
Цитата (Peter)
количество строк в файле будет постоянно меняться, а точнее - уменьшаться,
Я про это и говорил. Чего тебе стыдно читать-то?
Цитата (mishem)
А это вообще...
И что тут "вообще"? Имелось в виду "не трогать" параметры цикла! Какая разница как делать? На мой взгляд" вообще" это аккурат в цикле FileRead и FileDelLine !
Цитата (mishem)
и переменной количества строк -1
К тому же я не уверен (никогда такое не делал), что для Lopp-цикла возможно изменение количества итераций цикла в процессе работы. Это у While прокатывает, а Loop - цикл ФИКСИРОВАННЫЙ Это кому отдыхать-то надо?
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 19:50 | Сообщение # 43
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
В принципе, из Loop-цикла мжно и выйти (когда строки закончатся) посредством ExitLoop...
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 19:54 | Сообщение # 45
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
Что засада есть...
Засада в
Цитата (Peter)
напрямую так не пойдет...
как это в примере.
Цитата (Peter)
Нужно тогда делать через While (пока файл не закончился), и, после удаления строки, возвращать цикл на удаленную позицию.
Чего тут непонятного-то?
Цитата (mishem)
Возможно.
Интересно, покажи пример.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Представим что у нас префикс ar_ или еще какой там. И есть переменная Navatar_is_navatorov Строка будет удалена хоть и нет префикса. И учет регистра здесь не помогает. Я уже поднимал эту тему. И говорил о том что для строк нужен покруче плагин. Даже hpwControl порой не помогает и приходится такую "портянку" городить ради того что бы найти правильный символ в нужном месте.
По этому в этом коде нужно еще условие добавлять, что бы найденный символ располагался первым, или вторым если будет скобка [. С префиксом мелочи, легко. А вот когда суффикс искать надо, тут уже посложнее. Ну, не для нас...
Вообще бы если б кто то замутил плагин по строкам с учетом всяких вариантов, было бы здорово.
Дата: Ср, 04 Сентября 2013, 20:29 | Сообщение # 47
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
Такого достаточно будет?
Да, вполне. Убедил! Странно, но, действительно, работает...
Цитата (mishem)
только добавить нужно -1
Тогда - да.
Сейчас проверил: самое забавное, что в Delphi это тоже работает. Никогда и в голову не приходило проверить.
Взял на заметку. Thanx!!! - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 20:46 | Сообщение # 48
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Цитата (Peter)
Никогда и в голову не приходило проверить.
Просто потому что со строками не работаешь, а если и работаешь то очень мало наверно. Практически очень часто требуется именно в таких моментах, со строками, с символами когда при удалении меняется позиция и количество.
Здесь 10 другой строк набежит, а когда 1000 чами исчисляются, сразу начинаешь искать метод оптимизации.
Как то напряжно когда программа с полчаса работает. Успеваешь кино какое нибудь посмотреть.
В принципе когда работает, не напряжно. Напряжно когда на 10 000 ной строке ошибка вылазит.
Когда то у меня подпись была, помнишь? Сел писать программу в пару строк, теперь ошибку ищу в 1 000 ной строке. Как то так по моему. Не хочешь читать хелп?
Дата: Ср, 04 Сентября 2013, 20:49 | Сообщение # 49
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Не-а - в Delphi НЕ РАБОТАЕТ! Цикл в ступор не входит (что я предполагал), но по-любому, если, например, задано N:= 20 for i:= 0 to N do ... Так и будет 20 итераций, что только с N ни делай! И вот это - ПРАВИЛЬНО!!!
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 20:57 | Сообщение # 50
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Цитата (Peter)
Странно, но, действительно, работает...
А че странного? Если логически, когда возвращается в начало цикла идет же проверка методом сравнивания. А сравниваются либо жестко указанные значения, либо переменные. А переменые у нас что?... Могут менять свое значение как угодно, и когда угодно.
Добавлено (04 Сентября 2013, 20:52) ---------------------------------------------
Цитата (Peter)
Не-а - в Delphi НЕ РАБОТАЕТ
Цитата (mishem)
Могут менять свое значение как угодно, и когда угодно.
Хотел дописать, только не в делфи.
Добавлено (04 Сентября 2013, 20:57) ---------------------------------------------
Цитата (Peter)
N:= 20 for i:= 0 to N do
Так а здесь условие то другое. Че ты сравниваешь яичницу с омлетом?
Выполнять от 0 до 20.
Это уже в памяти заложено. И нет возврата к переменной N.
Дата: Ср, 04 Сентября 2013, 21:11 | Сообщение # 51
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
А переменые у нас что?... Могут менять свое значение как угодно, и когда угодно.
mishem, да, но смысл цикла Loop состоит в указанном количестве повторений, и, по идее, если указано в самом начале (в певой строке), то уже меняться не должно. В принципе, можно нашлепать "умную" функцию цикла (что разрабы и сделалали), которая постоянно будет проверять "верхний предел", но по-логике...
Добавлено (04 Сентября 2013, 21:11) ---------------------------------------------
Цитата (mishem)
Так а здесь условие то другое. Че ты сравниваешь яичницу с омлетом?
Выполнять от 0 до 20.
Все абсолютно ТО ЖЕ САМОЕ: NeoBook
Код
SetVar "[x]" "20" Loop "1" "[x]" "[i]"
т.е. начать с 1 и закончить на [x]
Delphi
Код
N:= 20 for i:= 0 to N do
начать с i и закончить на N
В данном случае, разница только в том, что в Delphi i задана начиная с нуля, и реально будет не 20, а 21 повторение. Но можно было и начинать с 1.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 21:18 | Сообщение # 52
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Не, ну вот сейчас сижу анализирую... Должна и в делфи выполнятся. Мож ты че не так там делаешь?
Присвой N 0 или1 без вычитаний в конце первого срабатывания. В делфи так же идет проверка значений, если I меньше N прибавить к I 1. I Переменная. Она меняется и с ней идет сравнение. Почему N тогда не меняется?
Дата: Ср, 04 Сентября 2013, 21:22 | Сообщение # 53
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
mishem, но, я еще раз говорю, что нет ничего сложного, чтобы и в Delphi нашлепать свою функцию Loop, аналогичную по устройству и работе необушной.
Добавлено (04 Сентября 2013, 21:22) ---------------------------------------------
Цитата (mishem)
Она меняется и с ней идет сравнение.
В данном случае переменая"i" выступает "счетчиком" цикла, точно так же, как и в NB (в твоем примере). В Delphi все устроено правильно, но, если надо, то нет проблем... См. чуть выше.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 21:59 | Сообщение # 54
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Ниче не понимаю я в ваших делфях...
С N в цикле можно извращаться как угодно. Получается что эта переменная на цикл не должна влиять ни как. И в тот же момент когда возвращаемся к циклу, N опять становится 20. Бредятина какая то. Не хочешь читать хелп?
Дата: Ср, 04 Сентября 2013, 22:19 | Сообщение # 55
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
Ниче не понимаю я в ваших делфях...
Цитата (mishem)
Бредятина какая то.
mishem, да никакой бредятины в дэлфях нету, там - наоброт все стройно и логично, и подчинено жестким правилам. Это ты привык, что в NB можно написать какую угодно бредятину, и интерпретатор проглотит, или что можно как угодно обращаться с данными, параметрами, и т.п.. Если примешься всерьез за Delphi, то быстро поймешь, что без "дисциплины" и шагу не ступишь.
Цитата (mishem)
Получается что эта переменная на цикл не должна влиять ни как
Совершенно справедливо - она лишь задает количество срабатываний.
Цитата (mishem)
в тот же момент когда возвращаемся к циклу, N опять становится 20
Ничего подобного, после оператора for... do с N можно делать что угодно, но она не станет снова 20. Напиши , скажем, вот такой код^
Код
var I, N : Integer; begin N:= 20; for i:= 1 to N do begin ListBox1.Items.Add (IntToStr(N)); N:= N-1; end; end;
и посмотри в списке на N. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 22:31 | Сообщение # 56
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Цитата (Peter)
Напиши , скажем, вот такой код
Да я тут понаизощрялся уже. Думаешь просто так сказал.
Цитата (Peter)
после оператора for... do с N можно делать что угодно
В том то и дело что после. Но к примеру первый цикл закончился, возвращается к for... do и опять N =20. Или возвращение происходит к строке begin ? Че я только не перепробовал.
Закрыл с таким кодом
Код
var i,N,z: integer;
begin N:= 20;
begin begin
for i:= 0 to N do z:= N; N:= N-1;
end;
Label1.Caption:= Inttostr (N); end; end; end.
Добавлено (04 Сентября 2013, 22:31) --------------------------------------------- Аж сам ржу сижу глядя на этот код.
Дата: Ср, 04 Сентября 2013, 22:41 | Сообщение # 57
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Цитата (mishem)
Но к примеру первый цикл закончился, возвращается к for... do и опять N =20. Или возвращение происходит к строке begin ? Че я только не перепробовал.
Ничего не понял - а где тут у тебя "возвращение к циклу"? Если ты вызываешь, написанный тобой код (функцию, процедуру) откуда-то "извне", то она начинает работать с "var", и первого "begin".
Да, и экспериментуруй с циклами осторожнее, а то придеться тебе жать известную комбинацию из трех клавиш,. Или того хуже: вспомнищь про кнопку Reset.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 22:56 | Сообщение # 58
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Цитата (Peter)
где тут у тебя "возвращение к циклу"?
Ну это я уже тут под конец чудил. Но все же, давай разберем...
Код
1 var 2 i,N: integer; 3 begin 4 N:= 20; 5 for i:= 0 to N do 6 N:= N-1; 7 end; 8 end.
С какой строки идет повтор цикла? С 3 или с 5? Если с 3, тогда все понятно, здесь не как в НБ. Если с 5, тогда мне ничего не понятно. N опять становится равна 20. С какого перепуга? Не хочешь читать хелп?
Дата: Ср, 04 Сентября 2013, 23:03 | Сообщение # 59
Админ NeoBook
Администраторы
Сообщений: 7425
Offline
Только сейчас обратил внимание...
Цитата (mishem)
begin
for i:= 0 to N do z:= N; N:= N-1;
end;
Label1.Caption:= Inttostr (N); end;
У тебя здесь цикл постоянно присваивает переменной z значение N, а в надпись отправляется N, которая всегда остается неизменной. Надо как-то так:
for i:= 0 to N do begin z:= N; N:= N-1; end; Label1.Caption:= Inttostr (N);
Только нагляднее будет тот пример, что я привел выше.
Да, и нахрена нужна переменная Z? Без неё можно так:
for i:= 0 to N do N:= N-1; Label1.Caption:= Inttostr (N);
Добавлено (04 Сентября 2013, 23:03) ---------------------------------------------
Цитата (mishem)
С какой строки идет повтор цикла? С 3 или с 5?
с 6-й. Цикл начинает работать (повторять) со строки после do - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Дата: Ср, 04 Сентября 2013, 23:09 | Сообщение # 60
Эксперт форума
Модераторы
Сообщений: 5942
Offline
Цитата (Peter)
Напиши , скажем, вот такой код^
var I, N : Integer; begin N:= 20; for i:= 1 to N do begin ListBox1.Items.Add (IntToStr(N)); N:= N-1; end; end;
Я еще больше потерялся...
Добавлено (04 Сентября 2013, 23:08) ---------------------------------------------
Цитата (Peter)
цикл постоянно присваивает переменной z
Это у меня до этого был вывод и эжтой переменной. Ты внимания не обращай что там написано. Я что то дописывал, что то удалял... Это я просто показал что проводил эксперементы.
Цитата (Peter)
Только нагляднее будет тот пример, что я привел выше.
В том то и дело что я что то совсем потерялся..
Цитата (Peter)
Без неё можно так:
А так в лейбл возвращается 19 или 20 не помню уже. По моему 19, отсюда и вопрос был почему N постоянно 20. Но судя по листбоксу ...
Короче "Потерялася я..."
Добавлено (04 Сентября 2013, 23:09) ---------------------------------------------