Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2

С++-библиотека-фреймворк для VBxx

07.10.2025, 02:21. Показов 4051. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всязи с недавно открывшейся возможностью по написанию такой библиотеки, появилась мысль по написанию такой библиотеки, хотя такая мысль была у меня давно, но не было возмжоности, а теперь есть возможность, надо бы найти мысль, надо ее вспомнить, то о чем я думал. Если перейти к конкретике, я думал, о том, чего не хватает в VB и то что это на самом деле не так сложно восполнить, зная С/С++ (или другие компилируемые языки, тот же пурик, дельфин и пр.). Чуть позже составлю примерный список из того, что можно было реализовать исходя из моего слегка ограниченного видения..

Добавлено через 11 минут
1) InStr для массивов. Итак, начнем с функции InStr. Не хватает реализации этой функции для массивов, говоря по иному, чтобы функция могла искать блок памияти в другом блоке памяти, реализовать хочу, как поиск любого массива внутри любого массива (не ссылочного ест-но)
2) RichEdit также как здесь. Это сложновато, но надеюсь на нейросеть и ее натасканность нейросетей на C++ и готовую кодовую базу по этому оконному элементу.
3) различные строковые функции из js/php/python.
4) MemCopy, GetMem*, PutMem* для VBA
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2025, 02:21
Ответы с готовыми решениями:

Можно ли программно подключить библиотеку VBA, в частности библиотеку Microsoft Visual Basic for Application Extensebility?
Кто знает, можно ли программно подключить библиотеку VBA, в частности библиотеку Microsoft Visual...

Нужна библиотека с функциями для работы с файлами
Я разрабатываю операционную оболочку на QBasic'e - QuickGUI (quickgui.narod.ru), и сейчас нужно...

Помогите пожалуйста с Инициализацией Dll библиотеки
После компиляции проекта требуется обновить dll библиотеку без повторной компиляции проекта. Можно...

41
bite
 Аватар для I can
5011 / 4841 / 852
Регистрация: 13.04.2015
Сообщений: 10,121
06.11.2025, 19:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
без нее функция может возвращать какой-нибудь мусор.
Современные средства разработки должны в таком случае выдавать сообщение "не все пути возвращают значение".
0
bite
 Аватар для I can
5011 / 4841 / 852
Регистрация: 13.04.2015
Сообщений: 10,121
06.11.2025, 20:10
Цитата Сообщение от I can Посмотреть сообщение
выдавать сообщение
Даже не сообщение, а ошибку
Миниатюры
С++-библиотека-фреймворк для VBxx  
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
07.11.2025, 02:21  [ТС]
Меня вот вопрос мучает, но я ни как не могу сообразить. Вот ищем подстроку в строке, совпал первый символ, после этого начинаем 2й внутренний цикл на сопоставление остальных символов. Если 2й цикл не отрабатывает полностью, то мы возвращаемся на 1й цикл. Вопрос должны ли мы возвратиться в ту же позициую, с которой перешли во второй цикл, или же продолжить с той позиции, на которой закончил 2й цикл?

Добавлено через 39 минут
Первый вариант правильный. Это понятно на прмере, если искать "aab" в "aaabbbaaa"
0
 Аватар для Argus19
1732 / 476 / 78
Регистрация: 24.09.2017
Сообщений: 2,573
Записей в блоге: 27
07.11.2025, 05:06
Цитата Сообщение от testuser2 Посмотреть сообщение
Вот ищем подстроку в строке, совпал первый символ, после этого начинаем 2й внутренний цикл на сопоставление остальных символов.
Если перекапывать массив байт, то продолжать поиск второго символа с той же, или следующей позицией. Если использовать std::string, то думать не надо:
"Функция find() возвращает индекс первого вхождения подстроки или отдельного символа в строке в виде значния типа size_t:"
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
 
int main()
{
    std::string text {"A friend in need is a friend indeed."};
    std::cout << text.find("ed") << std::endl;      // 14
    std::cout << text.find("friend") << std::endl;  // 2
    std::cout << text.find('d') << std::endl;     // 7
    std::cout << text.find("apple") << std::endl;  // 18446744073709551615
}
https://metanit.com/cpp/tutorial/12.6.php
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
07.11.2025, 07:35  [ТС]
Argus19, смотря какой массив, если там нуль-чары, то, может быть find и не подойдет. Допустим я хочу в бинариках копаться..

Добавлено через 2 минуты
Я знаю, что есть winapi strstr и пр., но то, что для текста, как правило "боится" нулевых символов (кроме вбшного instra)

Добавлено через 2 часа 3 минуты
И вновь исправленный вариант инстра. Самое дурное, что я уже раньше не раз разбирал этот инстр по полочкам, реализовывал его на VBA и Twin Basic, в т.ч. с указателями, но мне всегда лень смотреть и искать старые коды.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int InStrByt(int Start, SAFEARRAY** ppSAWhere, SAFEARRAY** ppSAWhat) {
    int cntWhere = (*ppSAWhere)->rgsabound[0].cElements;
    int cntWhat = (*ppSAWhat)->rgsabound[0].cElements;
    char *pcWhere1 = (char*)(*ppSAWhere)->pvData;
    char *pcWhat1 = (char*)(*ppSAWhat)->pvData;
    char *pcWhat2 = pcWhat1 + 1;
    
    if (Start > 0) {
        if (Start < cntWhere) {
            Start = Start - 1;
        }else{ 
            return 0; 
        }
    }
    else if (Start == 0) {}
    else {
        Start = cntWhere + Start; 
        if (Start >= 0) {} else { Start = 0; }
    }
    
    char *pcEndIter = pcWhere1 + cntWhere - cntWhat;
    char *pcEndIter2 = pcWhat1 + cntWhat; //- 1;
    char cWhat1 = *pcWhat1; 
    for(char *pcWhere = pcWhere1 + Start; pcWhere <= pcEndIter; pcWhere++) {
        if (*pcWhere == cWhat1) {           
            char *pcWhere_ = pcWhere;           
            for (char *pcWhat = pcWhat2; pcWhat < pcEndIter2; pcWhat++) {
                pcWhere_++;
                if (*pcWhere_ != *pcWhat) goto Nxt;
            }
            return (pcWhere - pcWhere1) + 1;
        }
    Nxt:;
    }
    return 0;
}

В дальнейшем я хочу реорганизовать эту функцию в C-макрос с байтовым поиском, а на основе этого макроса, сделать поиск для строк и массивов, and Any.
Да, конечно стоит посмотреть встроенные функции C/C++ для поиска байт
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
08.11.2025, 15:55  [ТС]
Попытался реализовать групповое присваивание, как в Твинбейсике, но получилось сделать это только на VBA ито с некоторыми нюансами, лишний аргумент понадобися в Property Get. The trick, ты не мог бы подсказать, в чем может быть причина. Ошибка - что-то свзяанное с DLL.
VB-реализация
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
Private Declare Function SafeArrayCreateVector Lib "oleaut32.dll" ( _
    ByVal vt As Integer, _
    ByVal lLbound As Long, _
    ByVal cElements As Long) As LongPtr 'Variant()
Private Type SAFEARRAYBOUND
    cCount              As Long
    lBound              As Long
End Type
Private Type SAFEARRAY1D
    cDims               As Integer
    fFeatures           As Integer
    cbElements          As Long
    cLocks              As Long
    pvData              As Long
    Bounds              As SAFEARRAYBOUND
End Type
Private Sub TestGetVarRefs()
    Dim vAr(), pAr As LongPtr
    
    Dim l&, d#, s$
    PutRefList(l, d, s) = GetRefList(0, 123, 5.6, "erwew")
End Sub
Property Let PutRefList(ParamArray Dst(), Src())
    Dim i&
    For i = 0 To UBound(Dst)
        Dst(i) = Src(i)
    Next
End Property
Property Get GetRefList(ByVal pAr As LongPtr, ParamArray ArgList()) As Variant()
    Dim SA As SAFEARRAY1D
    pAr = GetPtr(ByVal VarPtr(pAr) + LenB(pAr))
    CopyMem ByVal ArrPtr(GetRefList), ByVal pAr, 4
    PutPtr(ByVal pAr) = SafeArrayCreateVector(vbVariant, 0, 0)
End Property

C-реализация
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LPSAFEARRAY GetRefList(SAFEARRAY** ppsavRefs) {
    LPSAFEARRAY ret = *ppsavRefs;
    *ppsavRefs = SafeArrayCreateVector(VT_VARIANT, 0, 0);
    return ret;
}
void PutRefList(SAFEARRAY** ppsavRefsDst, SAFEARRAY** ppsavRefsSrc) {
    LPSAFEARRAY psavRefsDst = *ppsavRefsDst;    
    VARIANT* pVDst = (psavRefsDst)->pvData;
    int arCnt = (psavRefsDst)->rgsabound[0].cElements;
    LPSAFEARRAY psavRefsSrc = *ppsavRefsSrc;
    VARIANT* pVSrc = (psavRefsSrc)->pvData;
    int minCnt = (psavRefsSrc)->rgsabound[0].cElements;
    if (minCnt <= arCnt) {} else { minCnt = arCnt; }
    
    for (; pVDst < pVDst + minCnt; pVDst++, pVSrc++) {
        VariantCopy(pVDst, pVSrc);
    }
}
IDL
C
1
2
3
4
        [entry("GetRefList"), vararg, propget]
        HRESULT __stdcall RefList([in] SAFEARRAY(VARIANT)* ArgList, [out, retval] SAFEARRAY(VARIANT)* pRet);
        [entry("PutRefList"), vararg, propput]
        HRESULT __stdcall RefList([in] SAFEARRAY(VARIANT)* ArgList, [in] SAFEARRAY(VARIANT)* pInp);

Весь проект сдесь.

Добавлено через 17 минут
кажется я начинаю догадываться, наверное это обе должны быть функции, которые возвращают HRESULT

Добавлено через 25 минут
Сделал тестовую библиотечку на VB6, будем разбираться
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: <could not determine filename>
 
[
  uuid(A97D68D5-9923-4B28-A561-1FEBA70FE8A8),
  version(1.0),
  custom(50867B00-BB69-11D0-A8FF-00A0C9110059, 9782)
 
]
library Project1
{
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");
 
    // Forward declare all types defined in this typelib
    interface _Class1;
 
    [
      odl,
      uuid(C703A32F-140A-47A7-9074-D070711AB20C),
      version(1.0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface _Class1 : IDispatch {
        [id(0x68030000), propget, vararg]
        HRESULT TestProp(
                        [in, out] SAFEARRAY(VARIANT)* ArgList, 
                        [out, retval] SAFEARRAY(VARIANT)* );
        [id(0x68030000), propput, vararg]
        HRESULT TestProp(
                        [in, out] SAFEARRAY(VARIANT)* ArgList, 
                        [in, out] SAFEARRAY(VARIANT)* );
    };
 
    [
      uuid(CC4D6BBF-B2DA-4ADE-8D8E-1234EBC904EE),
      version(1.0)
    ]
    coclass Class1 {
        [default] interface _Class1;
    };
};


Добавлено через 46 минут
Кажется я еще раз начал догадывться - propget надо реализовывать не как функцию, а как GetMem
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
09.11.2025, 09:30  [ТС]
В общем причина выяснена, winapi функция VariantCopy не правильно копирует ссылки. Однако есть еще VariantCopyInd, которая
Освобождает вариант назначения и создает копию исходного варианта, выполняя необходимое косвенное обращение, если источник указан для VT_BYREF.
Но, она тоже не правильно копирует, потому, что она также освобождает назначение, что в данном случае не нужно. На VB это работает просто и правильно, видимо есть еще какие-то детали. Однако можно реализовать "гибридный" вариант. Property Get на Cи
C
1
2
3
4
void __stdcall GetRefList(SAFEARRAY** ppsavRefsSrc, SAFEARRAY** ppsaRefsOut) {
    *ppsaRefsOut = *ppsavRefsSrc;
    *ppsavRefsSrc = SafeArrayCreateVector(VT_VARIANT, 0, 0);
}
Property Put на VBA
Visual Basic
1
2
3
4
5
6
Property Let GroupAssigment(ParamArray Dst(), Src())
    Dim i&
    For i = 0 To UBound(Dst)
        Dst(i) = Src(i)
    Next
End Property
Добавлено через 49 секунд
Visual Basic
1
GroupAssigment(s2, d2, l2) = GetRefList(s, d, l)
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
11.11.2025, 17:17  [ТС]
В сегоднешнем "выпуске" своего псевдо-блога Занимательные ручки, я хотел бы сделать лирическое отступление, не флуда ради, но, может быть, лучшего в какой-то степени понимания некоторых принципиальных вещей, ибо, когда мы о чем-то говорим, мы не редко начинаем лучше это понимать, в каких - аспектах.
многотекста
Есть несколько причин, которые немного мешают мне, в продвижении развития данной библиотеки. 1я это время, ускользающее как песок сквозь сито, 2я, можно скать, психологическая, в виду ожидаемой сложности, того что я хотел бы реализовать и не навязчиво гнетущей мысли, о том, что, возможно, библиотека будет не достаточно прекрасной без данного составляющего сегмента (хотя это, безусловно спорный вопрос, поскольку почему бы именно в этой библиотеке и пр. и пр. не очевидно). А реализовать бы я хотел одну, не много не мало, концептуальную, вещь, достаточно простую в понимании но, не достаточно простую в реализации. Для этой вещи, во-первых мне нужны все-возможные строковые функции, идеи, с которыми в принципе нет ни каких проблэм, они имеются, во-вторых это текстовый редактор, с подстветкой синтаксиса. С этим было бы все гораздо проще, если бы существовал стандартный контрол RichTextBox под x64, который прекрасно существует под x86 в VB6, также он доступен в x86 vba, но все уже менее прекрасно, поскольку, при его установке где-нибудь, вас начнут преследовать не навязчивые, но строго-регламентированные предупреждения (при каждом включении) о небезопасности этого устаревшего агрегата. Учитывая мою некоторую зацикленность на vba, самоопределяющаяся потребность в относительно современном x64 текстовом аппарате стала как нельзя очевидной.
Я кстати пробовал тот "устаревший аппарат" и он мне не малым понравился, даже учитывая отсутствие некоторых базвовых вещей, таких как получение длины содержащегося текста (по моему там даже такого нет, но строку по номеру строки (изв. за тафталогию) там стандартно не получить, это я помню точно). Итак, что же на ближайшем горизонте - это, без сомнения, стандартный оконный класс RichEdit, тем более что реализацию для работы с ним я видел на vbforums, и, надо сказать, она не так проста, как это можно представить. Другой вариант библиотека scintilla.dll, реализацию которой я также видел на vbforums (ныне не очен доступен в моем регионе/операторе) и там автор пишет, не много не мало, о нескольких месяцах работы над реализацией. И это прям вау!, столько времени потратить на.. хмм неужели все так сложно..


Добавлено через 2 часа 31 минуту
Следующая часть "выпуска" будет посвящена сложности написания кода в C, которые могут возникнуть у любого (например у меня), кто, например, привык кодить на VB и др. похожих языка, например JS (шутка). Одно из первых что может сбивать с толку это семантика указателей, которая, подчас может выглядеть не достаточно интуитивно, как, может быть, хотелось бы этого ожидать, другой вопрос, как могло бы это быть если бы это было как-то по другому, также, не в малости сложны, поэтому не будем вдаваться в какие-то критические рассуждения, а просто попытаемся осмыслить, что жэ это такое.
Кликните здесь для просмотра всего текста
Когда мы видим переменную char *pcBuf, то мозг безусловно хочет ассоциировать суть переменной, с ее литеральным названием. Говоря о сути я име в виду данные переменной - тот участок памяти, в котором хранится значение этой переменной (в данном случае в формате char). В VB (также как и во многих других, в особенности скриптовых ЯП) переменная это имя, имя это переменная, а то, что у ней могут быть какие-то указатели в скрытом не видимом бэкграунде, про это можно конечно помнить и знать, но не свосем обязательно. В C не так, там pcBuf это указатель (и буква p должна нам об этом напоминать), тобеж целочисленное 32/64 битное значение, в д. сл. указывающее на то место, где лежит значение переменно. А вот звездочка, уже раскрывает главную сущность переменной, получить ее значение, т.е. *pcBuf это значение. Поэтому присвоение значения одной переменной другой (имеющих указатель) будет выглядеть так
*pcBuf = *pcBuf2
а это
pcBuf = pcBuf2 - присвоение указателя одной переменной другой.
Однако путаница может возникнуть в это месте
char *pcBuf = pcBuf2 - сдесь будет присвоение именно указателя одной переменной указателю другой, хотя можно было бы подумать, что в значение пытаются записать указатель. Тобеж при инициализации, работает какбы другая логика, она конечно во многом удобная, но ..
Я думаю, человек привыкший к VB (возможно даже любой подавляюще статистический) хочет увидеть имя переменной, олицетворяющее ее значение и ее суть, а указатель если он есть, то это как некий хвостик, некая приставка. Т.е. допустим, далеко не отходя от синтаксиса C данная логика могла бы выглядеть так
pcBuf - значение
&pcBuf - указатель
&&ppcBuf - указатель на указатель (если такой у переменной имеется)
pcBuf = pcBuf2 - присвоение значения
&pcBuf=&ppcData - присвоение указателя (первого уровня)
Поскольку прозвучали некие намеки на, как бы, критику С, будет справедливым также немного покритиковать VB. В VB, чтобы передать массив ByRef нужно обязатлельно передавать указатель на указатель SAFEARRAY в стек, когда во многих случаях могло бы хватить одного указателя на SAFEARRAY. Чтобы передать строку ByRef в VB-шных функциях нужно обязательно передавать в стек указатель на переменную содержаую указатель буфера BSTR, хотя где-то было бы лучше передать указатель на BSTR. Это было бы возможно, наверное если бы в VB поддерживался оператор const.
0
 Аватар для Argus19
1732 / 476 / 78
Регистрация: 24.09.2017
Сообщений: 2,573
Записей в блоге: 27
11.11.2025, 19:05
Цитата Сообщение от testuser2 Посмотреть сообщение
&pcBuf - указатель
&&ppcBuf - указатель на указатель (если такой у переменной имеется)
Фигушки. Это не указатели, а ссылки. Сам долго путался.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
12.11.2025, 01:52  [ТС]
Цитата Сообщение от Argus19 Посмотреть сообщение
Фигушки. Это не указатели, а ссылки. Сам долго путался.
Но суть то сильно близкая, по VB-шному ByRef. Я о том, что если бы существовал оператор, который работал обратно, звездочке, то он был бы во многом понятней. Допустим не & а @ (во Free Basic и Pure Basic, кстати используется такой). Да кстати. Этот принцип конфликтует с принципом звездочки. Ну допустим, существовал был отдельный вид указателей, назовем их референсы, и обозначим буквочкой r
char @rcSrc = rrsaSrc->pvData
0
 Аватар для Argus19
1732 / 476 / 78
Регистрация: 24.09.2017
Сообщений: 2,573
Записей в блоге: 27
12.11.2025, 06:05
Цитата Сообщение от testuser2 Посмотреть сообщение
Но суть то сильно близкая, по VB-шному ByRef.
Если в функции С/С++ _stdcall foo(&что-там), или return &что-то, то попытка передать, или получить из неё значение по ByRef приводит к краху.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
12.11.2025, 06:23  [ТС]
Argus19, можно пример кода посмотреть, где происходит такая ситуация?
0
 Аватар для Argus19
1732 / 476 / 78
Регистрация: 24.09.2017
Сообщений: 2,573
Записей в блоге: 27
12.11.2025, 08:21
Цитата Сообщение от testuser2 Посмотреть сообщение
можно пример кода посмотреть, где происходит такая ситуация?
Это было давно. Ни чего не сохранилось.
Я кое-какие наброски по строкам в соседней теме выложу.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
12.11.2025, 09:27
testuser2, instrB Использует
Цитата Сообщение от testuser2 Посмотреть сообщение
Другой вариант библиотека scintilla.dll, реализацию которой я также видел на vbforums (ныне не очен доступен в моем регионе/операторе) и там автор пишет, не много не мало, о нескольких месяцах работы над реализацией. И это прям вау!, столько времени потратить на.. хмм неужели все так сложно..
Нас самом деле там ничего сложного нет. Я делал подсветку на основе этой библиотеки, у меня ушло максимум пару часов чтобы разобраться с ней для базовой подсветки. Вот проект, там у видишь. https://drive.google.com/file/... sp=sharing

Цитата Сообщение от testuser2 Посмотреть сообщение
Чтобы передать строку ByRef в VB-шных функциях нужно обязательно передавать в стек указатель на переменную содержаую указатель буфера BSTR
Это делается для того чтобы можно было вернуть строку переданную ByRef, тоже с массивами. Если пишется библиотека на С/С++ то можно просто работать с OLE Automation типами которые понимает VB6 и все будет работать без всяких лишних телодвижений.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
12.11.2025, 12:39  [ТС]
The trick, спасибо посмотрю, как будет возможность

Добавлено через 2 часа 53 минуты
The trick, а что это за программа, что она делает? Я нашел там контрол для работы со скинтиллой (там в принципе понятно, работает через сообщения окну), но к сожалению не нашел, как увидеть окно с подстветкой какого-нибудь текста. Нет, в принципе, конечно понятно, что работаь с ней можно. Но скинтилла, конечно это должен быть чрезвычайно мощный инструмент, для меня пожалуй, наверное достаточно будет Rich Edit. Кстати, для скинтиллы, вроде какой-то даже activex существует.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
12.11.2025, 13:32
Цитата Сообщение от testuser2 Посмотреть сообщение
но к сожалению не нашел, как увидеть окно с подстветкой какого-нибудь текста
Нажимаешь правой кнопкой на Constant Script или Sequential Script и выбираешь Add. Выходит окно редактирования скрипта на vbs с подсветкой синтаксиса.
Миниатюры
С++-библиотека-фреймворк для VBxx  
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
13.11.2025, 18:00  [ТС]
Я слышал когда-то, что в музыкальной индустрии, скрипты очень в ходу. У меня вообще мысль, сделать, для начала, альтернативный редактор формул для Эксель, идея фикс конечно сделать редактор для VBA (вспомогательный), но доберусь я к этому наверное может быть к новому году.

Добавлено через 11 минут
Cделал запрос, на поддержку макросов в оффисных документов в техподдержку GitVerse, мне ответили, что зафиксировали мое пожелание, так что может быть и появится, будем подождать..

Добавлено через 4 часа 13 минут
Лайвхак для VB-шников - если заметили, что вы косячите в условиях (в Си) - вместо == пишете =, то эти косяки можно найти такой регуляркой if \(\*?\w+ ?[=]{1} ?\*?\w+

Добавлено через 7 минут
А так можно исправить такие случае нужно это (if \(\*?\w+ ?)[=]( ?\*?\w+) заменить на это $1==$2
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
14.11.2025, 01:23  [ТС]
Сделал функцию InStrRevB, но вот не задача, не обратил внимания, что в оригинальном InStrRev параметр Start считается от начала строки, я же сделал прямой счет от конца (отрицательные значения Start считаются от начала). T.е. Start:=1 у меня это будет 1й символ с конца строки. Но функция-то ищет от конца и сама логика какбы подсказывает считать от конца. В связи с этим нужен консилиум VB-сообщества, как все-таки лучше считать от конца, или более консервативный т.ск. вариант?
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.11.2025, 08:48
testuser2, как у оригинальной instrrev логичнее иначе нужно start всегда делать больше длины искомой строки.
1
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
15.11.2025, 10:56  [ТС]
The trick, я так и сделал, пусть лучше будет как в оригинале )

Добавлено через 1 час 10 минут
Еще один лайвхак с регулярками. Если вам нужно создать C-макрос из какого-то участка кода, то его во-первых нужно скопировать куда нужно, затем нужно каждую строчку экранировать обратным слешем. Чтобы не делать это "в-ручную" надо выделить весь код и во вставке/замене заменить (\r\n) на \$1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2025, 10:56

Классы, динамические библиотеки. VB6
Добрый вечер. Ребят, подскажите, никогда не работал с классами в Basic'е. Как работать с классами?...

Не хватает библиотеки
Всем привет. У меня вот такая проблема. Пытаюсь запустить макрос VBA, а он останавливается на...

Подключение нужных библиотек при переносе программы на другой ПК
Всем доброго здоровья! Может ли кто подсказать, как автоматизировать процесс подключения нужных...

Электронные библиотеки или кто откуда качает киниги
Предлагаю создать тему с ссылками на бесплатные электронные библиотеки с книгами по VBA и не только...

Где можно скачать библиотеку чтобы рисовать в VISIO стены, двери или окна
Здравствуйте! где можно скачать библиотеку чтобы рисовать в VISIO стены, двери или окна. И как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru