Командная строка и её парсинг

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

Командная строка и её парсинг

Сообщение Tok » 09.08.2004 (Пн) 3:49

Как ловить командную строку я знаю - Command, но как осуществить парсинг ее, если я хочу передавать проге кучу данных?

То есть, как порезать строчку на нужные команды?

Я хочу, например передавать координаты окна через командную строку:

myprog.exe -x=200 -y=550

ну или хотябы так (пробел, как разделитель):

myprog.exe /200 550


Подскажите Плизз!
Back from the dead
I am resurrected
to spew, putrefaction...
http://gutted.nm.ru

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.08.2004 (Пн) 8:27

Я делаю вот так:
Код: Выделить всё
    'Get application command line
    Dim sCmdLine()  As String
    nArgCount = ParseArgString(Command$(), sCmdLine())

Где ParseArgString
Код: Выделить всё
Public Function ParseArgString(ByVal sArgString As String, ByRef sArgArray() As String) As Long
    'parse command line arguments
    Dim sArg    As String
    Dim nCount  As Long
    Dim i       As Long
   
    sArg = Trim(sArgString)
   
    If (Len(sArg) > 0) Then
        Do
            i = InStr(1, sArg, Chr$(32))    'find [Space]
            If (i = 0) Then i = Len(sArg)
           
            ReDim Preserve sArgArray(0 To nCount) As String
            sArgArray(nCount) = Trim(Left$(sArg, i))
            sArg = Trim(Right$(sArg, Len(sArg) - i))
           
            nCount = nCount + 1
        Loop While (Len(sArg) > 0)
    End If
   
    ParseArgString = nCount
End Function

Помогло? :wink:

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 09.08.2004 (Пн) 9:59

Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Dim WordsArray() As String
    Dim SplitChar As String
    SplitChar = Chr(32)
    WordsArray() = Split(Command$, SplitChar)
    MsgBox "Количество аргументов: " & UBound(WordsArray())
End Sub

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

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.08.2004 (Пн) 10:07

2Ruslan Demidow:
Да, так лучше. Воспользуюсь :)

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

Сообщение tyomitch » 09.08.2004 (Пн) 10:24

Ruslan Demidow писал(а):
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Dim WordsArray() As String
    Dim SplitChar As String
    SplitChar = Chr(32)
    WordsArray() = Split(Command$, SplitChar)
    MsgBox "Количество аргументов: " & UBound(WordsArray())
End Sub

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

Пробел у Split - разделитель по умолчанию, т.е. можно просто
Код: Выделить всё
WordsArray() = Split(Command$)

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 09.08.2004 (Пн) 10:55

Не знал.. Учту.
Спасибо. :)

Tok
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 28.09.2003 (Вс) 16:14
Откуда: Алчевск (Украина)

Сообщение Tok » 09.08.2004 (Пн) 18:28

Ruslan Demidow писал(а):
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Dim WordsArray() As String
    Dim SplitChar As String
    SplitChar = Chr(32)
    WordsArray() = Split(Command$, SplitChar)
    MsgBox "Количество аргументов: " & UBound(WordsArray())
End Sub

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




Простите за тупость ( :oops: ), можно привести пример цикла?
Back from the dead
I am resurrected
to spew, putrefaction...
http://gutted.nm.ru

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 09.08.2004 (Пн) 19:49

Код: Выделить всё
Dim i As Long
For i = LBound(WordsArray) To UBound(WordsArray)
    MsgBox i + 1 & "'й параметр = " & WordsArray(i)
Next
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 10.08.2004 (Вт) 11:54

Так, к слову: в PowerBasic-е есть отличная функция a$ = PARSE$(string_expr [, [ANY] string_delimiter], index&)
Я думаю на VB не составит труда написать подобную функцию с помощью Instr() и Mid$()

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

Сообщение alibek » 10.08.2004 (Вт) 14:24

А в VB есть Split$(), зачем писать свою?
Lasciate ogni speranza, voi ch'entrate.

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 10.08.2004 (Вт) 14:44

alibek писал(а):А в VB есть Split$(), зачем писать свою?

Я не совсем понял, Split$ возвращает значение или Массив? Это немного разные весчи.

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

Сообщение alibek » 10.08.2004 (Вт) 14:55

А кто мешает писать Split$("1;2;3",";")(2)? Кроме, понятное дело, расхода памяти.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 10.08.2004 (Вт) 16:41

alibek писал(а):А кто мешает писать Split$("1;2;3",";")(2)? Кроме, понятное дело, расхода памяти.

Так, как в VB, даже лучше - строка рассекается только один раз, а не каждый раз, когда читается новый параметр.
Проблем с расходом памяти тоже нет - мы ведь и так всю строку хотим распарсить?

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

Сообщение alibek » 11.08.2004 (Ср) 9:03

Я имел ввиду, что чем Split()(1), Split()(2), ... Split()(n) лучше один раз сделать S() = Split() и юзать массив, так будет и быстрее и память расходоваться будет экономнее.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 11.08.2004 (Ср) 9:35

alibek писал(а):Я имел ввиду, что чем Split()(1), Split()(2), ... Split()(n) лучше один раз сделать S() = Split() и юзать массив, так будет и быстрее и память расходоваться будет экономнее.

Дык я тоже! :-D


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

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

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList