Функция Split и Array.Copy

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

Функция Split и Array.Copy

Сообщение M_Block » 03.07.2007 (Вт) 14:39

День добрый. Есть ли в VB 5.0 аналог функции Split из VBA.Strings? Или как мне ее можно подключить, имея библиотеку VBA6.dll?
Еще интересует как можно воспользоваться функцией Array.Copy в VB 5.0? Заранее спасибо.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.07.2007 (Вт) 14:50

Загляни сюда. Во-первых часть функций, отсутствующих в VB5, там уже написаны, а во-вторых тамошние самописные дадут фору встроенным.
Лучший способ понять что-то самому — объяснить это другому.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 03.07.2007 (Вт) 16:38

Я считал, что ничего не мешает таскать с собой помимо файла msvbvm50.dll ещё и msvbvm60.dll и вызывать оттуда функции продекларировав их в своей программе. А в msvbvm60.dll Split есть. Поправьте если ошибаюсь.
Программисты не глючат - глючат компиляторы...

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

Сообщение tyomitch » 03.07.2007 (Вт) 17:23

Если ничего не мешает, тогда проще скомпилировать прогу под VB6 и не таскать за собой msvbvm50.
Изображение

M_Block
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.06.2007 (Пт) 6:55

Сообщение M_Block » 05.07.2007 (Чт) 6:45

Спасибо за ссылку, Antonary, вообще я использовал свою самописную функцию, просто подумал может зря время терял.

tyomitch, вот именно что что-то мешает, у меня нет VB6, пишу на чем есть. Прочитал "Описание некоторых встроенных функций VB" alibek'a и тоже захотелось использовать не самописные функции, а над которыми уже кто-то потрудился ( :) ).

CodeName33, а как ты предлагаешь использовать эту dll, и какая разница между msvbvm60.dll и VBA6.dll? В обеих Split есть.

А как насчет Array.copy, или может не так спросил?

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

Сообщение tyomitch » 05.07.2007 (Чт) 11:12

VBA6.dll нельзя распространять.
msvbvm60 можно.
Изображение

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 05.07.2007 (Чт) 14:05

M_Block писал(а):CodeName33, а как ты предлагаешь использовать эту dll


Обычно, написать declare функцию из msvbvm60, как она точно называется можно посмотреть в программах показывающих экспортируемые функции, типа PEExplorer.
Программисты не глючат - глючат компиляторы...

M_Block
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.06.2007 (Пт) 6:55

Сообщение M_Block » 09.07.2007 (Пн) 7:29

Обычно, написать declare функцию из msvbvm60, как она точно называется можно посмотреть в программах показывающих экспортируемые функции, типа PEExplorer.


А если не сложно может кто-нибудь подскажет, у меня нет PEExplorer. Как привильно:
Код: Выделить всё
Private Declare Function Split _
Lib "msvbvm60" Alias "Я идиот! Убейте меня, кто-нибудь!" ( _
ByVal Expression As String, _
ByVal Delimiter As String)


Заранее спасибо за помощь.

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

Сообщение tyomitch » 09.07.2007 (Пн) 8:47

Alias "rtcSplit"

За параметры не поручусь.
Изображение

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

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

А если не сложно может кто-нибудь подскажет, у меня нет PEExplorer.

У тебя есть Dependency Walker. Который в контексте студии бесплатен. В отличие от PE Explorer. Который стоит денег.

А насчёт параметров... на первый взгляд их должно быть 5.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 09.07.2007 (Пн) 10:24

А еще есть такая библа BREGEXP.DLL 72 кбайт
http://www.forth.org.ru/~ac/lib/string/bregexp/BREGEXP_DLL.htm
В ней тоже есть функция Split

M_Block
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.06.2007 (Пт) 6:55

Сообщение M_Block » 09.07.2007 (Пн) 11:41

Че то я наверное совсем запутался. Возникает ошибка: Can't assign to array. Попробовал сделать то же самое (без declare function, конечно) при помощи макроса в Excel'е - получилось.

Код: Выделить всё
Private Declare Function Split _
Lib "msvbvm60" Alias "rtcSplit" ( _
Expression As String, _
Delimiter As String _
) As String

Dim asd() As String

Private Sub Command1_Click()
asd = Split("as;sd;asd", ";")
For i = 0 To 2
    MsgBox (asd(i))
Next
End Sub
]

Хакер, у меня Studio 97, я там не нашел никакого Dependency Walker. Я смотрел параметры Split через Object Browser Excel'я, там какие-то параметры необязательные, вот и подумал, что их можно не объявлять, это не так?

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

Сообщение tyomitch » 09.07.2007 (Пн) 11:46

M_Block писал(а):там какие-то параметры необязательные, вот и подумал, что их можно не объявлять, это не так?

Это не так.
Изображение

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

Сообщение Хакер » 09.07.2007 (Пн) 11:52

Начал дебажить.

Функция имеет пять аргументов.

1 - назначение пока не установлено. (предположительно: адрес возврата)
2 - StrPtr на Expression.
3 - Delimiter, но каким образом передаётся пока не установленно. В стек кладётся некоторе число (адрес), однако непосредственно по этому адресу находятся нули. Дальше ничего интересного тоже нет.
4 - необязательный аргумент "limit". Передавать обязательно. Если лимит не установлен, передавать -1.
5 - необязательный аргумент "CompareMethod". Передавать обязательно.

Сейчас ещё помучаю и скажу точно.
—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 » 09.07.2007 (Пн) 12:03

Ну и зачем реверс-инженерить, когда можно просто заглянуть в TLB?

Код: Выделить всё
        [entry(0x60000036), helpstring("Split a string into an array"), helpcontext(0x000f650b)]
        VARIANT _stdcall Split(
                        [in] BSTR Expression,
                        [in, optional] VARIANT* Delimiter,
                        [in, optional, defaultvalue(-1)] long Limit,
                        [in, optional, defaultvalue(0),
            custom({270D72B0-FFB8-11CF-A4BD-00A0C90F26EE}, "1")       
Изображение

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

Сообщение Хакер » 09.07.2007 (Пн) 12:23

M_Block
Тогда так:
Код: Выделить всё
Private Declare Function rtcSplit Lib "msvbvm60.dll" (ByVal Expression As Long, ByRef delimiter As Variant, ByVal limit As Long, ByVal mode As Long) As Variant

Public Enum MyCompareMethods
   cmpBinary = 0
   cmpText = 1
   cmpDataBase = 2
end enum

Public function Split (byval Expression, ByVal Delimiter, optional Byval Limit =-1, optional byval ComparareMethod as MyCompareMethods)
Split = rtcSplit(StrPtr(Expression), Delimiter, Limit, CompareMethod)
End function



tyomitch
зачем реверс-инженерить

Чтобы получить удовольствие :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

M_Block
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 22.06.2007 (Пт) 6:55

Сообщение M_Block » 09.07.2007 (Пн) 12:58

Хакер, не помогло, возникает таже ошибка.
Public function Split (byval Expression, ByVal Delimiter, optional Byval Limit =-1, optional byval ComparareMethod as MyCompareMethods)
Split = rtcSplit(StrPtr(Expression), Delimiter, Limit, CompareMethod)

То что выделено не опечатка, так должно быть?

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

Сообщение Хакер » 09.07.2007 (Пн) 13:00

Нет конечно. CompareMethod должно быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList