Логическое выражение из переменной в блоке If .. Then

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Логическое выражение из переменной в блоке If .. Then

Сообщение fishmen » 13.03.2007 (Вт) 17:44

Подскажите, плиз, как мне передать логическое выражения для оператора If из переменной. Т.е я считываю в переменную str$ из файла строку, например InStr(varstrArray(10), "..") > 0. Далее это логическое выражение пытаюсь подставить в условие if str$ then, где вместо str$ хочу передать это логическое выражение и получаю ошибку. Что-то туплю - не знаю как это сделать.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 13.03.2007 (Вт) 17:47

код в студию

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.03.2007 (Вт) 17:58

А что код.
Человек хочет собственный язык программирования, из файла.
Неслабо. Пиши собственный компилятор.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 13.03.2007 (Вт) 18:20

Но ведь должны быть обходные пути!!!
Эта логическая переменная заранее не известна и может меняться.
А отрывок из кода такой.
Open sFile For Input As #1
Do Until EOF(1)
Line Input #1, str$
if str$ then
....

в строке может быть такое выражение InStr(varStrArray, ":") > 0

Должен же быть какой-то выход :!:

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 13.03.2007 (Вт) 18:38

Если несколько переработать подход к поставленной задаче, не подойдёт MSScriptControl?
Salus populi suprema lex

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.03.2007 (Ср) 10:13

Да там и перерабатывать ничего не нужно - просто скормить Eval'у эту str$ и он вернет False или True.
Код: Выделить всё
Dim sc as New ScriptControl
sc.Language = "vbscript"
If sc.Eval(str$) Then ...
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2007 (Ср) 10:21

А где Eval возьмёт объекты, на которые ссылается строка?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 14.03.2007 (Ср) 11:56

GSerg писал(а):А где Eval возьмёт объекты, на которые ссылается строка?


Все так, в строке есть переменная varstrArray(10). Боюсь, что Eval просто ее не определит. Может быть надо преобразовывать строку и подставлять уже ее значение вместо этой переменной.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2007 (Ср) 12:24

А для того, чтобы сделать это, и грамотно заменить в строке некий участок на его значение, и придётся писать свой синтаксический анализатор.
Проще хранить все данные в скриптконтроле тогда уж.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.03.2007 (Ср) 12:50

GSerg писал(а):А где Eval возьмёт объекты, на которые ссылается строка?
Начнем с того, откуда в строке объекты? :) Если автор планировал просто подставить ее в If, то там по идее должно быть записано логическое выражение, состоящее из каких-то значений. Если выражение состоит из переменных, то видимо там же должны быть записаны их определения и значения. Что мешает разбить строку на две, в первой дефиниции, во второй выражение? Первую добавляем через AddCode, вот Eval и получает все необходимые данные.
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2007 (Ср) 13:27

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.03.2007 (Ср) 15:35

Да, под массив придется генерить кучу кода. Или подсунуть вместо массива коллекцию.
Лучший способ понять что-то самому — объяснить это другому.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.03.2007 (Ср) 19:01

Можно проще, весь код не в модуле, а в форме или классе. Все массивы, переменные и т. д., которые могут понадобиться в строке, объявлены как Public. Передаем в скрипт форму (AddObject) - и к переменным обращаемся так: Form1.MyVar. Можно обрамить все это With блоком, и писать имена просто с точки.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 14.03.2007 (Ср) 21:13

А можно в AddObject в качестве имени объекта передать пустую строку, поставить GlobalMembers=True и тогда можно обращаться без точки.
Изображение

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 14.03.2007 (Ср) 23:38

Mikle писал(а):Можно проще, весь код не в модуле, а в форме или классе. Все массивы, переменные и т. д., которые могут понадобиться в строке, объявлены как Public. Передаем в скрипт форму (AddObject) - и к переменным обращаемся так: Form1.MyVar. Можно обрамить все это With блоком, и писать имена просто с точки.


Честно говоря, не совсем понятно как это применимо в моем случае, сорри. А можно чуток поподробнее, может пример небольшой. Или ссылку, где это можно почитать - не приходилось пока работать с этим. :(

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.03.2007 (Чт) 17:27

Вот простой пример, попробуй на ходу редактировать текст:

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 15.03.2007 (Чт) 18:31

Спасибо! Пошел разбираться

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 16.03.2007 (Пт) 10:41

Ура, все получилось. :D
Всем огромное человеческое спасибо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 113

    TopList