Организация поиска

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

Организация поиска

Сообщение dracool » 20.03.2008 (Чт) 10:34

Всем привет! Я в VB полный чайник, поэтому я здесь...
У меня такая проблемка... Вобщем имеется текстовое поле в которое вводятся ФИО (только в строгом соответствующем порядке), между словами можно вводить любое количество пробелов (в том числе и в начале). Также имеются три текстовых поля куда, при нажатии Энтера, должны выводиться Фамилия в одно поле, Имя в другое и т.д.
Так вот вопрос как мне организовать этот поиск через цикл Do-Loop? Что мне вводить в качестве условия?[/syntax]

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.03.2008 (Чт) 10:55

А что ищем то? Или тебе надо введенные в одном поле фамилию, имя и отчество разделить на составные части и отправить их в отдельные текстовые поля? Ежели так, то порядок действий таков:
1. Берешь строку с ФИО, обрезаешь пробелы вначале и в конце функцией Trim$.
2. Заменяешь двойные пробелы внутри на одинарные в цикле Do...Loop, при помощи функций InStr и Replace$
3. Делишь полученную строку на отдельные слова при помощи функции Split.
4. Помещаешь элементы полученного массива в нужные поля ввода.
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2008 (Чт) 11:33

1 и 2 необязательны.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.03.2008 (Чт) 13:14

alibek писал(а):1 и 2 необязательны.

но с ними все же проще, не нужно будет потом пустые элементы массива обрабатывать.
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2008 (Чт) 13:26

Не проще, ведь считать элементы все-равно надо, если предусматривать обработку ситуации, когда отчество или имя/отчество не заданы.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение burik » 20.03.2008 (Чт) 21:25

Я бы сделал так:
Код: Выделить всё

Dim tmp     As Integer
Dim str     As String

    str = Text1.Text
    str = Trim$(str)
   
    tmp = InStr(1, str, " ")
    If tmp > 0 Then
        List1.AddItem Left$(str, tmp)
        str = Trim$(Right$(str, Len(str) - tmp))
    End If
   
    tmp = InStr(1, str, " ")
    If tmp > 0 Then
        List2.AddItem Left$(str, tmp)
        str = Trim$(Right$(str, Len(str) - tmp))
    End If
   
    If Len(str) > 0 Then
        List3.AddItem str
    End If
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.03.2008 (Пт) 8:26

Ужасно.
Lasciate ogni speranza, voi ch'entrate.

dracool
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 20.03.2008 (Чт) 10:20

Сообщение dracool » 18.04.2008 (Пт) 8:41

Спасибо! Вариант с Split оч хорош.
Но мне надо было делать так:
Dim Temp As String
Dim fs As Integer
Dim fn As String

Temp = Trim$(Text1.Text)
fs = InStr(1, Temp, " ")
fn = Mid$(Temp, 1, fs - 1)
Text2.Text = UCase$(Mid$(fn, 1, 1)) & LCase$(Mid$(fn, 2))

Temp = Trim$(Mid$(Temp, fs + 1))
fs = InStr(1, Temp, " ")
fn = Mid$(Temp, 1, fs - 1)
Text3.Text = UCase$(Mid$(fn, 1, 1)) & LCase$(Mid$(fn, 2))

Temp = Trim$(Mid$(Temp, fs + 1))
Text4.Text = UCase$(Mid$(Temp, 1, 1)) & LCase$(Mid$(Temp, 2))

Т.к. Split мы ешо не проходили :oops:

Тогда ещё вопросик, что нужно зациклить (For-Next) чтобы программа выполняла разделение на слова при вводе не 3х, а допустим 7 слов (есесно добовляются и поля вывода)?

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

Сообщение dr.MIG » 18.04.2008 (Пт) 10:31

Гм... Сначала подумал что это мой студент. Однако, мы Split уже проходили. :)

dracool писал(а):Тогда ещё вопросик, что нужно зациклить (For-Next) чтобы программа выполняла разделение на слова при вводе не 3х, а допустим 7 слов (есесно добовляются и поля вывода)?


При таком подходе как сейчас -- ничего не зациклишь. Если количество текстовых полей предлагается увеличить до 7, то логично будет использовать массив текстовых полей. Если подход к разделению слов должен остаться таким же (если Split до сих пор не прошли:)), то внутрь внутрь цикла поместить

Код: Выделить всё
Temp = Trim$(Mid$(Temp, fs + 1))
fs = InStr(1, Temp, " ")
fn = Mid$(Temp, 1, fs - 1)
Text2(i).Text = UCase$(Mid$(fn, 1, 1)) & LCase$(Mid$(fn, 2))


Предварительно создать массив ЭУ Text2. Здесь i -- это счётчик цикла.
Salus populi suprema lex

ANMAT
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 08.01.2006 (Вс) 12:59

Сообщение ANMAT » 18.04.2008 (Пт) 10:41

Тогда ещё вопросик, что нужно зациклить (For-Next) чтобы программа выполняла разделение на слова при вводе не 3х, а допустим 7 слов (есесно добовляются и поля вывода)?


Ну а нельзя сказать преподавателю, что самостоятельно посмотрел про split? Все-таки без него ерунда. И такие задания давать до его изучения - признак дурного учителя...

Все-таки самое правильное, делать так:
Создаешь массив из семи текстбоксов Text1
Код: Выделить всё
dim strSource as string, i as integer, re as new regexp, arrWord
strSource = "В этой переменной находится именно семь слов"
re.pattern = " {2,}"
re.global = true
strSource = re.replace(trim$(strSource), " ") ' удалить все лишние пробелы
arrWord = split(strSource, " ")
for i = 0 to ubound(arrWord)
   Text1(i).text = arrWord(i)
next
Последний раз редактировалось ANMAT 18.04.2008 (Пт) 11:00, всего редактировалось 1 раз.

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

Сообщение dr.MIG » 18.04.2008 (Пт) 10:51

Text1[i]?
Salus populi suprema lex

ANMAT
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 08.01.2006 (Вс) 12:59

Сообщение ANMAT » 18.04.2008 (Пт) 10:59

Text1[i]?

Йопть, чисто в блокноте пишу - проверки-то нету, вот и очепятался... :)

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

Сообщение RayShade » 18.04.2008 (Пт) 12:26

Самый тру способ - это regexp :) С его помощью и строку разбить, и все такое :)
I don't understand. Sorry.

dracool
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 20.03.2008 (Чт) 10:20

Сообщение dracool » 18.04.2008 (Пт) 15:55

dr.MIG писал(а):Предварительно создать массив ЭУ Text2. Здесь i -- это счётчик цикла.

Массив ЭУ - это что и как? :?:

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

Сообщение dr.MIG » 18.04.2008 (Пт) 17:56

ЭУ -- элемент управления. Следовательно массив ЭУ -- это массив элементов управления. Что бы его создать (во время разработки) выдели какой-то один элемент управления (например тот же Text2), скопируй его (Ctrl+C) и вставь на форму (Ctrl+V). Появится сообщение, что элемент управления с таким именем уже существует и будет предложено создать массив. Необходимо нажать кнопку "Да". Появится элемент управления с таким же именем как и предыдущий, но со значением свойства Index на 1 больше. Теперь, что бы обратиться к какому-нибудь свойству, допустим свойству Text в нашем случае, необходимо писать не Text2.Text, а Text2(i).Text, где i -- целое число, значение свойства Index. Таким образом, используя индекс, мы сможем производить какие-либо действия с нашими элементами управления, находящимися в массиве, используя цикл.
Salus populi suprema lex


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

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

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

    TopList