Сложный вопрос, предположительно с классом для webrequest

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сложный вопрос, предположительно с классом для webrequest

Сообщение Maitris » 08.12.2005 (Чт) 0:21

Есть .Net сторонний класс, для работы с webrequest (метод GET)
Он посылает запрос на сервер, приходит ответ. Наступает в коде формы CallBack, в нем Select Case StatusEvent. Если ReqEvent.SE_COMPLETED, то использую свойство класса .Data (возвращающее код полученной страницы), и передаю его как аргумент в мою процедуру обработки html (на базе Regular Expressions).

Проблема в том, что процедура реагирует так, как будто передана пустая стока, т.е. не реагирует вообще. Если в событии приема данных сохранить .Data в строковую переменную или, например, текстбокс.text, а затем вызвать ParseHtml с этой переменной в качестве аргумента, то все срабатывает как надо.
Пробовал показывать при вызове обработчика ParseHtml входную строку, в обоих случаях она одинакова (однако в первом, обработки не происходит).
Уже не знаю, что и делать. Подскажите.

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

Сообщение GSerg » 08.12.2005 (Чт) 17:22

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 09.12.2005 (Пт) 0:41

GSerg

Объявление .Data
Код: Выделить всё
Public ReadOnly Property Data() As String
        Get
            Return ReqState.Data.ToString
        End Get
    End Property


Вызов парсера
Код: Выделить всё
Case ReqEvent.SE_COMPLETED
ParseHtml(wr.Data)
wr = Nothing


Сам парсер
Код: Выделить всё
Private Sub ParseHtml(ByVal inputString As String)

        'MsgBox(inputString)

        Dim r As System.Text.RegularExpressions.Regex
        Dim m As System.Text.RegularExpressions.Match

далее в нем идет несколько нужных мне регексов в цикле, на подобие этого.

Код: Выделить всё
Try
            r = New Regex("go=([0-9a-z\.]*[0-9a-z\.]*)"">([a-zа-я\s]*)....(\(звуки\))*", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
            m = r.Match(inputString)
            While m.Success

                ColuminsAddItem(2, m.Groups(2).Value & " " & m.Groups(3).Value, m.Groups(1).Value)

                m = m.NextMatch()
            End While
        Catch ex As ArgumentException
        End Try


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

Сообщение GSerg » 09.12.2005 (Пт) 8:37

Странно, странно...
Что происходит, когда по шагам внутри try?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 09.12.2005 (Пт) 19:07

Хм. Выяснилось еще одно обстоятельство.
В первом варианте каждый цикл с regex срабатывает только один раз, т.е. находят по 1 элементу.

Визуализация происходит с помощью процедуры
Код: Выделить всё
  Public Sub ColuminsAddItem(ByVal Columin As Integer, ByVal LinkText As String, ByVal LinkTag As String)
     

        'Добавление элемента в колоны

        ' Create a new Label
        Dim x As New LinkLabel

        x.Tag = LinkTag
        x.Text = LinkText
        x.ActiveLinkColor = System.Drawing.Color.GhostWhite
        x.AutoSize = True

        AddHandler x.MouseEnter, AddressOf AllLinks_MouseEnter
        AddHandler x.MouseLeave, AddressOf AllLinks_MouseLeave

        'Аргумент "Колонка"
        Select Case Columin


            Case 0
                'Пользователи и NPC
                x.Name = "UsersLabel" + UsersControlCount.ToString()
                x.Location = UsersLocation
                pnlUsers.Controls.Add(x)
                UsersLocation.Y += 24
                AddHandler x.Click, AddressOf UsersLinkHandler_LinkClicked
                UsersControlCount += 1

                'Предметы (в т.ч. с трупа)
            Case 1
                x.Name = "ItemsLabel" + ItemsControlCount.ToString()
                x.Location = ItemsLocation
                pnlItems.Controls.Add(x)
                AddHandler x.Click, AddressOf ItemsLinkHandler_LinkClicked
                ItemsLocation.Y += 24
                ItemsControlCount += 1

                'Локации
            Case 2
                x.Name = "LocationsLabel" + LocationsControlCount.ToString()
                x.Location = LocationsLocation
                pnlLocations.Controls.Add(x)
                AddHandler x.Click, AddressOf LocationsLinkHandler_LinkClicked
                LocationsLocation.Y += 24
                LocationsControlCount += 1

                'Трупы
            Case 3
                x.Name = "TrupsLabel" + TrupsControlCount.ToString()
                x.Location = TrupsLocation
                pnlTrups.Controls.Add(x)
                AddHandler x.Click, AddressOf TrupsLinkHandler_LinkClicked
                TrupsLocation.Y += 24
                TrupsControlCount += 1
        End Select


В коде формы

Код: Выделить всё
Private UsersControlCount, ItemsControlCount, LocationsControlCount, TrupsControlCount As Integer
    Private UsersLocation, ItemsLocation, LocationsLocation, TrupsLocation As System.Drawing.Point


По 1 разу она получает правильные аргументы, но по невнятной причине НЕ срабатывает, хотя все выглядит правильно, линки не создаются.

Если заменить ее чем-нибудь, например добавлением строки текстбокса, то добавление происходит, но опять же по 1 разу на каждый цикл regex.

Может какой-то глобальный глюк формата строки :?:

Тогда почему два сорца равны друг-другу = True?

И еще, если по завершении SE_COMPLETED запихнуть .Data сначала в String, и посылать ParseHtml(String), то точно так же, никакого эффекта.

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 13.12.2005 (Вт) 18:56

GSerg, отзовись, проблема все еще в силе :roll:

Я думаю так.. Срабатывает корректно, если процедура вызвана из того же класса (frmMain). Возможно такое?

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

Сообщение GSerg » 14.12.2005 (Ср) 6:40

Сложно дебажить удалённо :)

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 15.12.2005 (Чт) 11:05

Давай в личку скину проэкт целиком, посмотришь, идет?

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

Сообщение GSerg » 15.12.2005 (Чт) 16:26

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 15.12.2005 (Чт) 18:48

Отправил

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 20.12.2005 (Вт) 17:41

GSerg, Ну как, есть новости?

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

Сообщение GSerg » 21.12.2005 (Ср) 18:25

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.12.2005 (Чт) 13:34

Решай :)
----

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

Сообщение GSerg » 27.12.2005 (Вт) 14:29

Решил.


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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 02.01.2006 (Пн) 14:52

GSerg,
С Новым 06 :)
Гм. В общем это клиент к онлайновой текстовой Wap-RPG. Создание и отладка в онлайне было бы не удобна, ждать по 5-6 сек каждый раз + лаги сети и пр. препятствия...
Поэтому я храню несколько различных сохраненных страниц-ответов в спец. папке и тестирую оттуда.
В верхнем текст. поле наиболее часто проверяемый шаблон, и кнопка вызывает парсинг оттуда, не открывая страницы игры с диска или с игрового сервера.

Естесственно, оно дожно работать онлайн. С этим как раз и проблема. Код принимается тот же самый, визуально не отличимый, а срабатывает в отличии от открытого с диска или из поля, как какой-то левый-неправильный.

Было предположение что проблема в каретках (New Line и пр.), но с параметром регекса RegexOptions.Singleline то же самое.
----

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

Сообщение GSerg » 02.01.2006 (Пн) 15:23

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 14.01.2006 (Сб) 12:28

Все. Причина найдена.

Controls created on one thread cannot be parented to a control on a different thread.

Теперь соответственно вопрос как решить.
----

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

Сообщение GSerg » 14.01.2006 (Сб) 12:31

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 14.01.2006 (Сб) 13:14

В MSDN'е есть инфа по этой теме?
----

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

Сообщение GSerg » 14.01.2006 (Сб) 13:31

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

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 14.01.2006 (Сб) 15:58

GSerg, все, сделал. Тема закрыта. Спасибо.
----


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron