Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с функцией замены Replace, нужна помощь, сравнение файлов 
V
    Опции темы
PhantomM
Дата 9.3.2012, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Приветствую мастера!
проблемы с функцией замены Replace, задача сравнить два списка handle окон
и выявить новые (запущенное между заполнениями списков)
Я решил действовать через функцию Replace заменяя все совпадающие значения на "" 
при проверке кода всё работает нормально до момента передачи полученных значений 
из переменной в текстовое поле. я предположил что функция Replace записывает результат 
как массив и передаёт txt только первое значение, но все мои попытки работать 
с переменной как с массивом тоже ничего не дали.....
И ещё почему то функция Replace не заменяет всё, если запустить сравнение
без запуска программ она всёравно находит новые окна....
Мне очень важна эта функция так как в ближайшем будущем надо будет научить программу
сравнивать на выявления и записи лишних строк из двух огромных файлов до 50 мб.
Я тут написал упрощённый код посмотрите пожалуйста в чём может быть ошибка?
А вот пример с моими комментариями пример
Спасибо, Максим.

Вот код
Код

Private Sub Command1_Click()
'очищаем список
 Form1.List1.Clear
 'запускаем процедуру GetTaskList с индексом 1 тоесть на заполнение листа
 GetTaskList 1
End Sub

Private Sub Command2_Click()
'
'Dim mrstr1 As String
'Запускаем программы
Shell "notepad.exe"
'запускаем процедуру GetTaskList с индексом 0 тоесть на заполнение текстового поля
GetTaskList 0
'объявляем переменную счётчика
'! Short variable name: sh
'! NameCheck: sh - Valid: <sh>%, i<sh>
Dim sh As Integer
'переменная счётчика
Dim lngCounter As Long
'Запускаем цикл for для сравнения списков объектов (до и после запуска программы)
For lngCounter = 0 To List1.ListCount - 1
'задаём нашему счетчику пунктов листа значение счетчика цикла
'тем самым переходим к новому пункту листа
sh = Int(lngCounter)
'удаляем из переменной заголовок объекта если он присутствует
'в списке и заменяем на h (что бы видеть замены)
listsorte = Replace(listsorte, List1.List(sh), "h")
'mrstr1 = listsorte
'стазу записываем результат в текстовое поле
'????????????????????????????????????????????????????????????????????????
'Вот тут вопрос почему то наше текстовое поле получает в результате только
'последнее значение переменной listsorte. Единственное что я предположил
'это то что функция Replace записывает результат как массив и передаёт
'txt  только первое значение, но все мои попытки работать с переменной как с
'массивом тоже ничего не дали.....
'B ещё почему то функция Replace не заменяет всё, если запустить сравнение
'без запуска программ она всёравно находит новые окна....
Text1.Text = listsorte
'????????????????????????????????????????????????????????????????????????
'продолжаем цикл до конца
Next lngCounter


Модуль:

Код

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
 Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
 Private Const GW_HWNDFIRST = 0
 Private Const GW_HWNDNEXT = 2
 Private CurrWnd As String
 Private ListItem As String
 Private Length As String
 Public listsorte As String
  Public Sub GetTaskList(perem0List1 As Integer)
'получаем количество объектов
 CurrWnd = GetWindow(Form1.hwnd, GW_HWNDFIRST)
 'запускаем цикл пока объекты не кончатся
 Do While CurrWnd <> 0
 'получаем длину заголовка окна
 Length = GetWindowTextLength(CurrWnd)
 '
 ListItem = Space(Length + 1)
 
 Length = GetWindowText(CurrWnd, ListItem, Length + 1)
 'если заголовок объекта = "" то ничего не делаем
 'и переходим к следующему пункту цикла
 If Length <> 0 Then
 'если текст всётаки есть
 ' проверяем индекс переданный процедуре
       'если индекс равен 1 тогда
       If perem0List1 = 1 Then
       'добавляем заголовок объекта в лист
       Form1.List1.AddItem ListItem
           'если индекс равен 0 тогда
          ElseIf perem0List1 = 0 Then
          'добавляем заголовок объекта в переменную listsorte
           listsorte = listsorte & ListItem '& "\?"
            End If
 End If
 'переходим ко второму окну
 CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
 'DoEvents
' повторяем цикл
 Loop
 End Sub



Это сообщение отредактировал(а) PhantomM - 9.3.2012, 17:22

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Example.zip 3,06 Kb
PM MAIL   Вверх
Akina
Дата 9.3.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  9.3.2012,  18:20 Найти цитируемый пост)
Я решил действовать через функцию Replace заменяя все совпадающие значения на "" 

Напрасно.
Разумнее было набить два массива, после чего выполнить их сортировку и поэлементное двухкурсорное сравнение.

Цитата(PhantomM @  9.3.2012,  18:20 Найти цитируемый пост)
я предположил что функция Replace записывает результат 
как массив 

Разумнее было просто почитать справку.
http://msdn.microsoft.com/en-us/library/aa...2(v=vs.60).aspx


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 9.3.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Цитата

Напрасно.
Разумнее было набить два массива, после чего выполнить их сортировку и поэлементное двухкурсорное сравнение.

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

Цитата

>>я предположил что функция Replace записывает результат 
>>как массив 
      Разумнее было просто почитать справку.
      http://msdn.microsoft.com/en-us/library/aa...2(v=vs.60).aspx


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

Но всёравно ОГРОМНОЕ СПАСИБО, вы единственный кто хоть что то написал.
С уважением Максим 
PM MAIL   Вверх
Akina
Дата 10.3.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  9.3.2012,  21:04 Найти цитируемый пост)
наверно читал и справки и статьи...

И, прочитав, что Replace возвращает строку, всё-таки начинает делать напрочь не соответствующие этому предположения? а вот не верю...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 11.3.2012, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Цитата

И, прочитав, что Replace возвращает строку, всё-таки начинает делать напрочь не соответствующие этому предположения? а вот не верю...

А что мне остаётся думать? Я знаю  что она должна передавать строку.. Но почему передаётся  только первое значение строки????
Тоесть при отладке функция имеет конечное значение, например "Корова   кошка верблюд       велосепед" в текстовом поле получаем
"Корова" и всё, хоть убейся!!! И никто объяснить в чём дело не может... Ни на одном форуме.... Если по логике, такие результаты могут быть  только в массивах... Я это и "ПРЕДПОЛОЖИЛ" Я же не могу всего знать, думал может чего упустил. Но никто не знает, видимо и мне не судьба.
Спасибо за ответ, с уважением Максим.
PM MAIL   Вверх
Akina
Дата 11.3.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  11.3.2012,  18:57 Найти цитируемый пост)
при отладке функция имеет конечное значение, например "Корова   кошка верблюд       велосепед" в текстовом поле получаем
"Корова" и всё, хоть убейся!!! 

А символов перевода строки там, в строковой переменной, не завалялось? покажите debug.print того стринга, который передаёте в функцию, и результата её работы...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 11.3.2012, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Цитата

А символов перевода строки там, в строковой переменной, не завалялось? покажите debug.print того стринга, который передаёте в функцию, и результата её работы..


Я тоже об этом подумал, поэтому в примере попробовал передавать значения в текст бокс с мультилайн я думаю что при символах перевода значения просто напечатались бы на новой сороке. debug.print я так понимаю это скрины процесса, если я правильно понял сейчас сделаю.
PM MAIL   Вверх
PhantomM
Дата 11.3.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Вот скрины:
1 - это значение переменной (текстовой) listsorte полученые из функции "listsorte= Replace(listsorte, List1.List(sh), "h")"
Я тут что бы мне было  нагляднее вместо "" поставил "h" что бы было видно замены.
p\s присвоение происходит прямо во время цикла......
user posted image
2- переедаем значение сразу в текст значение текстового поля, вот тут мы и видим только одну "h" хотя в это же время istsorte содержит все свои значения как и раньше:
user posted image
3 - результат выполнения самой программы:
user posted image
PM MAIL   Вверх
Akina
Дата 12.3.2012, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  11.3.2012,  19:23 Найти цитируемый пост)
debug.print я так понимаю это скрины процесса

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 12.3.2012, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Нет у меня родной справки vb, и честно сказать никогда небыло нужды в  debug.print, но всегда приятно узнать что то новое smile
Прошу прошения, исправил скрин ниже:

Это сообщение отредактировал(а) PhantomM - 13.3.2012, 17:15
PM MAIL   Вверх
Akina
Дата 13.3.2012, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  12.3.2012,  18:49 Найти цитируемый пост)
Нет у меня родной справки vb

http://msdn.microsoft.com/en-us/library/aa...60).aspx?ppud=4

Цитата(PhantomM @  12.3.2012,  18:49 Найти цитируемый пост)
вот debug.print 

Многочисленные преобразования, которые выполняются при размещении поста, убивают его ценность.
Вместо debug.print всей переменной покажите ASC() первых 16 символов во всех трёх случаях:
Код

for i = 1 to 16: debug.print asc(mid(variable,i,1)); : next i



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 13.3.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



коды символов до обработки функцией
 77  83  67  84  70  73  77  69  32  85  73  68  101  102  97  117 
результат замены на символ h- 104
 118  108  99  0  104  0  104  0  118  108  99  0  104  0  104  0 
значение текстового поля
 118  108  99 

Ну причину благодаря вам мы вроде нашли, если не ошибаюсь "0" это конец строки,
но всётаки этот символ вставляет функция Replace, он появляется исключительно 
после обработки переменной... Но почему она так делает?
PM MAIL   Вверх
Akina
Дата 13.3.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  13.3.2012,  18:12 Найти цитируемый пост)
коды символов до обработки функцией

Вот этого дела - побольше... чтобы было захвачено минимум 2 строки целиком.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
PhantomM
Дата 14.3.2012, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.3.2012

Репутация: нет
Всего: нет



Цитата

Вот этого дела - побольше... чтобы было захвачено минимум 2 строки целиком.


77  83  67  84  70  73  77  69  32  85  73  68  101  102  97  117  108  116  32  73  77  69  77  83  67  84  70  73  77  69  32  85  73  68  101  102  97  117  108  116  32  73  77  69  193  224  235  224  225  238  235  234  224  80  104  97  110  116  111  109  77  57  57  57  64  115  105  112  110  101


Но вроде ничего странного не заметил.

Это сообщение отредактировал(а) PhantomM - 14.3.2012, 09:36
PM MAIL   Вверх
Akina
Дата 14.3.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(PhantomM @  13.3.2012,  18:12 Найти цитируемый пост)
причину благодаря вам мы вроде нашли, если не ошибаюсь "0" это конец строки,
но всётаки этот символ вставляет функция Replace, он появляется исключительно 
после обработки переменной... Но почему она так делает? 

Тваюмать!
А то что у тебя одна хрень - это листбокс, а вторая текстбокс - это ничего?
CHR(0) - это разделитель элементов листбокса. И они имеют место быть там изначально, Replace тут никаким боком, не надо на функцию гнать.
Так что либо замени текстбокс на другой листбокс, либо перед запихиванием результата в текстбокс замени CHR(0) на VBNewLine.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.