Like работает через... плохо работает!

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

Like работает через... плохо работает!

Сообщение Citius » 11.08.2007 (Сб) 22:10

В общем ситуация у меня такова есть функция вот она ниже

Код: Выделить всё
Public Function LikeText(Expression As String, Pattern As String) As Boolean
  Pattern = "*" & Pattern & "*"
  LikeText = Expression Like Pattern
End Function


Он прекрасно находит слово на страничке yandex, и совсем не видет слово со странице google. :(

А смысл таков, я последовательно, Inet компонентом, сливаю странички, и в цикле, используя вышеуказанную функцию, пытаюсь найти слово (указаное мной выражение-запрос)

Объясните пожалуйста такое поведения Like

Вот код цикла:

Код: Выделить всё
Do
            If cmdCansel.Value = True Then Exit Sub
            Que.Caption = txtSrcQuery(0).Text
            InText = Inet.OpenURL("http://www.google.com/search?&q=" & txtSrcQuery(0).Text & "&start=" & srcPage)
            MsgBox txtSrcQuery(0).Text
            MsgBox SITEInSESSION
            If LikeText.LikeText(CStr(InText), CStr(SITEInSESSION)) = True Then
                lstSrcItems.AddItem TbFr("Google", CStr(srcPage))
                Exit Do
            End If
            srcPage = srcPage + 1
            DoEvents
            If ExitFlag Then
                MsgBox "Searching is complete", vbInformation, App.EXEName
                ExitFlag = False
                Exit Do
            End If
        Loop


Посмотрите пожалуйста может кто ошибку заметит, а то у меня уже голова пухнет :(

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 11.08.2007 (Сб) 23:24

Я думаю Like тут ни причем. Это слово на странице действительно есть? :)
Просмотри что поступает в функцию поиска строки...
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 12.08.2007 (Вс) 0:38

Смотрел я поступающий текст, думал, мало-ли, а вдруг там то и нет этого выражения. Но! Оно там есть, я даже отдельно простенький проэкт создал с двумя текстовыми полями и кнопочкой применил эту же функцию - работает, а в этом проэкте не хочет!!! Заметил одну интерсную вещь, почемуто с каждым проходом цикла мое искомое значение обрастает звездочками, это значит что функция всетаки применяется к выражению, но непонятно (для меня) как это происходит ведь звездочки - это маска.

Вот как все происходит:
Допустим надо найти слово "привет", что мы получаем в результате
Первый проход цикла: *привет*
Второй проход цикла: **привет**
Третий проход цикла: ***привет***
и так далее.

Посмотрите внимательно, что это может быть?

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

Сообщение GSerg » 12.08.2007 (Вс) 0:53

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

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 12.08.2007 (Вс) 1:44

Искомое значение звёздочками обрастает от того, что у тебя в качестве аргумента функции переменная, а в функции аргумент изменяется. Значит и переменная тоже:

Код: Выделить всё
...If LikeText.LikeText(CStr(InText), CStr(SITEInSESSION)) = True Then...

...Pattern = "*" & Pattern & "*"...


Чтобы переменная не изменялась, перед аргументом нужно поставить "ByVal". Тогда функция будет работать не с самой переменной, а с её копией:

Public Function LikeText(Expression As String, ByVal Pattern As String) As Boolean

Или вместо

Код: Выделить всё
Pattern = "*" & Pattern & "*"
LikeText = Expression Like Pattern


используй

Код: Выделить всё
LikeText = Expression Like "*" & Pattern & "*"


Переменная изменяться не будет.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 12.08.2007 (Вс) 1:46

АЙ! Меня опередили!

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

Сообщение GSerg » 12.08.2007 (Вс) 2:03

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

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 12.08.2007 (Вс) 10:54

Да и кстате мне было бы очень интересно для чего служит ByVal и ByRef, и когда их необходимо применять?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.08.2007 (Вс) 11:10

Нда...

Служат они для указания того, что будет передано: значение или ссылка на значение.-
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 12.08.2007 (Вс) 11:27

Хакер писал(а):Нда...

Служат они для указания того, что будет передано: значение или ссылка на значение.-


Короче правильно я мыслю:

ByVal служит для передачи ссылки на параметр, т. е. при работе с параметром по ссылке я не могу фактически изменить его занчения, а только лишь прочитать данные из области памяти занимаемой этим параметром.

ByRef в свою очередь позволяет не только прочитать, но и записать, т.е. изменить?

Правильно???

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 12.08.2007 (Вс) 11:32

Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.08.2007 (Вс) 11:35

Нет.

В случае с ByVal передаётся (т.е. кладётся в стек перед вызовом) само значение.

Во-втором случае, передаётся не значение, а адрес значения в памяти.

Для чисел. Для других типов механим немного отличается.


ByRef в свою очередь позволяет не только прочитать, но и записать, т.е. изменить?

ByVal тоже позволяет записать. Только запись идёт в другую область, и на переменную, переданную в качестве аргумента влияния не оказывает.

При передачи аргумента ByRef передаётся адрес. Поэтому запись идёт в ту область, на которую "указывает указатель". Поэтому таким образом значение переменной, переданной в качестве аргумента можно изменить.

Но следует учитывать, что переменная типа String это число, а именно - адрес, по которому расположена строка (и не только).
Поэтому при передаче String-а ByRef будут передаваться указатель на указатель на данные. При передаче ByVal будет передаваться просто указатель на данные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.08.2007 (Вс) 11:41

Хакер писал(а):Поэтому при передаче String-а ByRef будут передаваться указатель на указатель на данные. При передаче ByVal будет передаваться просто указатель на данные.

Дааа?


Ещё развей тему объектов, вариантов, массивов и UDT.
Получится клон http://bbs.vbstreets.ru/viewtopic.php?t=26906 ;-)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.08.2007 (Вс) 11:57

Но следует учитывать, что переменная типа String это число, а именно - адрес, по которому расположена строка (и не только).


Да. И узнать это число можно с помощью StrPtr(StringVar). Или с помощью GetMem4

Поэтому при передаче String-а ByRef будут передаваться указатель на указатель на данные.

Да.

При передаче ByVal будет передаваться просто указатель на данные.

Не проверялось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.08.2007 (Вс) 12:10

Я исправил свой пост, пока ты печатал свой.
Изображение

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 12.08.2007 (Вс) 12:25

tyomitch писал(а):Ещё развей тему объектов, вариантов, массивов и UDT.
Получится клон http://bbs.vbstreets.ru/viewtopic.php?t=26906 ;-)


Кстате прежде чем я спросил про ссылки я был у темя на этом топике, честно сказать туговато я там для меня написано, просто теория, вот если бы сразу примерчик прилагался ;)

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 14:18

В рбщем возвращаюсь к поставленному вопросу. У меня как Like не видел, так и не видит выражение на сайте.
Для примера для поиска в Google я ввел запрос rambler выдается естественно множество ссылок, и среди них конечно же есть и на www.rambler.ru, НО Like не видит этого выражения!!! А вот просто rambler замечает, с чем это может быть связано?

Да и к тому же я просматриваю именно исходную страницу HTML.

(самое интересное то, что при обработке страничек с Yandex все прекрасно работает!!!)

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 13.08.2007 (Пн) 14:50

Можешь скинуть сорй исходник?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 13.08.2007 (Пн) 16:31

Пользоваться like неудобно. Лучше всего - RegExp :)
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.08.2007 (Пн) 16:40

RayShade
Гордишься знанием страшных слов типа RegExp? А знаешь ли ты, RayShade, что такое детерминированный конечный автомат (непосредственное отношение имеет к регэкспам)? :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение keks-n » 13.08.2007 (Пн) 17:10

Ни регэксп ни Like не поймут следущей записи: можете (утащено откуда-то снизу страницы форума).
Так что лучше припахать какой-нибудь стандартный парсер HTML и искать через него.
Изображение

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 20:53

Ни регэксп ни Like не поймут следущей записи: можете (утащено откуда-то снизу страницы форума).


Мне не нужно так уж сильно... :)

burik код смотри выше.

А есть ли класс в VB работающий с Regexp.

P.S: Да и кстате, а что такое "детерминированный конечный автомат"

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 20:57

keks-n
Насчет Regexp, В смыле не поймут:
Ни регэксп ни Like не поймут следущей записи: можете

Не разберут чтоли?

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

Сообщение keks-n » 13.08.2007 (Пн) 20:59

Citius
Эта был обрывок фразы "Вы можете голосовать в опросах" с этой страницы.
Полный текст фразы:
&#x0412;&#x044B; <b>&#x043C;&#x043E;&#x0436;&#x0435;&#x0442;&#x0435;</b> &#x0434;&#x043E;&#x0431;&#x0430;&#x0432;&#x043B;&#x044F;&#x0442;&#x044C; &#x043F;&#x0440;&#x0438;&#x043B;&#x043E;&#x0436;&#x0435;&#x043D;&#x0438;&#x044F; &#x0432; &#x044D;&#x0442;&#x043E;&#x043C; &#x0444;&#x043E;&#x0440;&#x0443;&#x043C;&#x0435;

И такое оформление кирилицы - не редкость. Большинство мощных HTML-редакторов(Dreamweaver, Front Page, правда не все версии) делают так.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.08.2007 (Пн) 21:04

А есть ли класс в VB работающий с Regexp.

Нет. Но есть класс VBScript.RegExp

P.S: Да и кстате, а что такое "детерминированный конечный автомат"

Рассказывать что такое ДКА слишком долго :)
Можешь глянуть сюда http://ru.wikipedia.org/wiki/Конечный_автомат .

Не разберут чтоли?

Регекспы всё разберут при нужном паттерне.

keks-n
Это не оформление кириллицы - это оформление юникодных символов в неюникодном чарсете.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 21:53

Хакер
Нет. Но есть класс VBScript.RegExp


А как файлик в уоторм он лежит называется?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.08.2007 (Пн) 21:54

vbscript.dll

Но нафига тебе это?

Код: Выделить всё
MsgBox TypeName(CreateObject("VBScript.RegExp"))
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 22:16

Хакер
Да вот хочу попробовать через RegExp может получится :roll: . Или все же с Like разобраться?

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

Сообщение keks-n » 13.08.2007 (Пн) 22:21

Хакер
Ясное дело, что юникод, но "оформление кирилицы" понятнее.
Citius
Разобрать-то разберут, если ЭТО будет в поисковом запросе. А вот если нормальные символы - нет. Посему надо делать перекодировку текста, причём не везде. Посему надо по нормальному распарсивать HTML, что самому делать неинтересно.
Изображение

Citius
Обычный пользователь
Обычный пользователь
 
Сообщения: 74
Зарегистрирован: 09.11.2005 (Ср) 9:36
Откуда: Украина

Сообщение Citius » 13.08.2007 (Пн) 23:06

keks-n
Блин да мне то всего навсего найти надо словосочетание, выражение на странице! Даже парсить ничего не надо! Просто если есть такое выражение то True если нет то False, для чего теоретически прекрасно подходит Like, но увы, я не могу понять, почему он не хочет у меня правильно работать :(

След.

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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 96

    TopList