Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/140: Рейтинг темы: голосов - 140, средняя оценка - 4.53
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Тестирование полезных кодов и примеров

15.10.2012, 00:56. Показов 29734. Ответов 301
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если Ваш код из темы Готовые решения и полезные коды на Visual Basic 6.0

неправильно собран или неработоспособен, он будет перенесен сюда.

Для доведения кода в рабочее состояние в порядке обсуждения создайте новую тему
2
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2012, 00:56
Ответы с готовыми решениями:

Тестирование полезных скриптов
В этой теме нужно писать: - о багах в выложенных полезных скриптах (закрепленная тема); - ошибках в кодах, на которые ведут ссылки...

Программное тестирование кодов
Доброго! Часто возникает потребность протестить некоторую программку, обычно небольшую. Т.к. в большинстве случаев это надо сделать быстро,...

Cумма кодов четных символов равна сумме кодов нечетных
Даны два поля edit1 и edit2. и кнопка button1. Нужно чтобы при нажатии на кнопку, проверялось: сумма кодов четных символов была равна сумме...

301
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
15.02.2023, 20:07  [ТС]
Студворк — интернет-сервис помощи студентам
Тебе нужно для начала найти программу с контролами, которые не поддерживают юникод.
Это любые стандартные встроенные контролы VB6, или например VBA IDE (Excel, Word ...), IDE VB6 кстати тоже.
Попробуй напечатать что-нибудь на русском языке в IDE, потом переключи раскладку на англ. язык, скопируй в буфер написанное в IDE, потом попробуй вставить в браузер.
1
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,771
15.02.2023, 20:11
Цитата Сообщение от Dragokas Посмотреть сообщение
напечатать что-нибудь на русском языке
Понял, спасибо. Увидел проблему. Раньше не замечал.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 10:10
А зачем указывать hwnd в функции получения буфера? Там ведь и 0 можно написать. Зачем hwnd формы?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 12:58  [ТС]
Оконные сообщения, коим есть уведомление об изменении состояния буфера, могут приходить только окнам. Соответственно хендл вашего окна нужно указать. Затем через сабклассинг окна, вы отлавливаете все сообщения приходящие вашему окну, и выбираете нужное.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 13:07
Да при чём тут окна? Я имел ввиду про функцию

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Function GetClipboardW(hWindow As Long) As String
    Dim hMem As Long
    Dim Ptr  As Long
    Dim Size As Long
    Dim txt  As String
    If OpenClipboard(hWindow) Then
        If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
            hMem = GetClipboardData(CF_UNICODETEXT)
            If hMem Then
                Size = GlobalSize(hMem)
                If Size Then
                    txt = Space$(Size \ 2 - 1)
                    Ptr = GlobalLock(hMem)
                    lstrcpyn ByVal StrPtr(txt), ByVal Ptr, Size
                    GlobalUnlock hMem
                    GetClipboardW = txt
                End If
            End If
        End If
        CloseClipboard
    End If
End Function
Зачем здесь получать хэнл окна? Смысла нет. Я использую старую функцию получения буфера без hwnd окна. Там просто 0.
Я имею ввиду
PureBasic
1
OpenClipboard(0)
Добавлено через 1 минуту
Я имею ввиду вашу старую функцию
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
' Ïîëó÷èòü áóôåð â óíèêîäå
Private Function GetClipboardW() As String
    On Error GoTo ErrorHandler
    
    Dim hMem As Long
    Dim ptr  As Long
    Dim Size As Long
    Dim txt  As String
    
    If OpenClipboard(0) Then
        hMem = GetClipboardData(CF_UNICODETEXT)
        If hMem Then
            Size = GlobalSize(hMem)
            If Size Then
                txt = Space$(Size \ 2 - 1)
                ptr = GlobalLock(hMem)
                lstrcpyn ByVal StrPtr(txt), ByVal ptr, Size
                GlobalUnlock hMem
                GetClipboardW = txt
            End If
        End If
        CloseClipboard
    End If
    Exit Function
ErrorHandler:
    'Debug.Print "GetClipboardW" & " - #" & Err.Number & " " & Err.Description & ". LastDllError = " & Err.LastDllError
End Function
Обращаю внимание безе HWND!!! И это писали вы! Только раньше. Так зачем тут нужен hwnd тогда?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 13:11  [ТС]
аа, вы об этом. Думаю, в данном случае разницы нет. Просто явная передача дескриптора - это более универсально. Например, если открыть буфер с OpenClipboard(0) и затем очистить через EmptyClipboard, то владельцем буфера станет NULL, и последующие вызовы SetClipboardData пофейляться. Как пример.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 13:19
В общем я проверил что

Visual Basic
1
2
3
4
5
6
7
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
Private Sub Command1_Click()
    OpenClipboard hwnd
    EmptyClipboard
End Sub
Одинаково гасит весь буфер что с нулём что с hwnd. Полностью весь буфер. Да ещё так некорректно что потом многие программы вообще не могут ничего скопировать в буфер. Включая сам VB. Лечиться только если копировать в умной программе которая правильно с буфером работает. А так буфер почти везде сразу слетает и перестаёт работать.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 13:22  [ТС]
Понятно что будет работать некорректно. Вызовом OpenClipboard hwnd, вы сделали владельцем буфера своё приложение. На каждый успешный вызов OpenClipboard нужно делать CloseClipboard, иначе другое приложение не сможет работать с буфером.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 13:29
Цитата Сообщение от Dragokas Посмотреть сообщение
нужно делать CloseClipboard
Да я так и думал)))
0
sleep
 Аватар для I can
4934 / 4598 / 841
Регистрация: 13.04.2015
Сообщений: 9,771
19.02.2023, 14:21
Цитата Сообщение от Dragokas Посмотреть сообщение
иначе другое приложение не сможет работать с буфером.
Похоже, что от этой приблуды вреда больше, чем пользы.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.02.2023, 14:46
Цитата Сообщение от I can Посмотреть сообщение
Похоже, что от этой приблуды вреда больше, чем пользы.
Так любой код работающий с буфером обмена имеет такие же требования.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.02.2023, 08:37  [ТС]
По поводу:
Цитата Сообщение от HackerVlad Посмотреть сообщение
ClipboardPath версия 2.0 значительно улучшенная версия
мне конечно лестно, но я не изобретал технологию субклассирования, а только пользуюсь ею.

На счёт кода, все вроде ничего за исключением:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Function IsQuestionString(str As String) As Boolean
    If str = "?" Or str = "??" Or str = "???" Or str = "????" Or str = "?????" Or str = "??????" Then
        IsQuestionString = True
        Exit Function ' Для ускорения
    End If
    
    If str Like "*[?]*" Then ' Если найден знак вопроса
        If Len(str) < 32768 Then
            str = Replace(str, " ", "")
            str = Replace(str, ",", "")
            str = Replace(str, ".", "")
        End If
зачем делаются некие модификации знаков препинания? Вы же в курсе, что передаёте строку в функцию как ByRef и она вернётся изменённой?

и для ускорения, я бы, ИМХО, вообще отсёк любой буфер > скажем 100к знаков, ибо ... - не припомню, чтобы когда-либо приходилось иметь дело с испорченным буфером такой большой длины, мож для для кого-то канэш это актуально.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.02.2023, 13:26
Цитата Сообщение от Dragokas Посмотреть сообщение
зачем делаются некие модификации знаков препинания?
Иногда в тексте есть точки или запятые, и при этом, как бы, слова разделяются пробелами точками запятыми, они остаются на фоне сплошных вопросительных знаков нетронутыми. В маленьком буфере до 32 килобайт я их убираю для более надёжного определения. В большом буфере этого не произвожу ибо уйдёт на это уйма времени.

Цитата Сообщение от Dragokas Посмотреть сообщение
Вы же в курсе, что передаёте строку в функцию как ByRef и она вернётся изменённой?
Да, в курсе, я думал об этом, и от ByRef не откажусь так как на копирование гигантских строк уходит до 100 млск времени, а тут я экономлю время получается. А эта строка в будущем потом всё равно нигде не используется. Ну изменилась слегка ну и ладно. Потом всё равно она нигде не используется. А так я в курсе, спасибо.

Цитата Сообщение от Dragokas Посмотреть сообщение
и для ускорения, я бы, ИМХО, вообще отсёк любой буфер > скажем 100к знаков
Да, можно и так, можно ограничить 100 килобайтами или даже просто 100 символами, конечно. Но у меня в моей программе никаких ограничений нет. Это приводит иногда к тому что приходится ждать по 3 секунды времени при копировании гигантского текста. Поэтому ограничения хорошая идея. Можно было бы и реализовать конечно.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
04.03.2023, 12:11
Цитата Сообщение от Mikle Quits Посмотреть сообщение
MaxCur = CCur("922337203685477") + CCur(0.5807)
  MinCur = -MaxCur - CCur(0.0001)
Можно просто написать:
Visual Basic
1
2
MaxCur = 922337203685477.5807@
MinCur = -922337203685477.5807@ - 0.0001@
Переполнение можно не проверять т.к. оно произойдет только через 100 лет (https://learn.microsoft.com/en... pc-and-tsc)
How often does QPC roll over?

Not less than 100 years from the most recent system boot, and potentially longer based on the underlying hardware timer used. For most applications, rollover isn't a concern.
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
04.03.2023, 12:16
Цитата Сообщение от The trick Посмотреть сообщение
Можно просто написать:
Ха! Не знал. Я даже когда-то где-то задавал вопрос, какой суффикс у типа Currency, мне ответили, что нет. А теперь и Яндекс на этот вопрос сразу ответ даёт.
Теперь бы ещё исправить это в "Готовых решениях".
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 12:56
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Теперь бы ещё исправить это в "Готовых решениях"
Там нельзя, я тоже помню хотел, но не получилось, просто выложил ещё раз вторую версию и всё.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
04.03.2023, 13:02
Я обновил. Кидайте сюда что нужно обновить, я обновлю в теме.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.03.2023, 17:33  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Получить стек вызовов в строковую переменную.
Замечательная возможность!
Не пойму только для чего нужно получение имени модуля через GetModuleHandleEx + GetCallingProcName? Вызов из своей dll?

И файл символов придётся хранить рядом. А если делать как Stand-Alone exe, интересно получится ли упаковать pdb в ресурсы постфактум, не нарушив соответствие с символами. Навскидку, пропатчил ресурс, вроде ничего не испортилось.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
04.03.2023, 17:41
Цитата Сообщение от Dragokas Посмотреть сообщение
Не пойму только для чего нужно получение имени модуля через GetModuleHandleEx + GetCallingProcName? Вызов из своей dll?
Да, чтобы получить адрес из ActiveX DLL.

Цитата Сообщение от Dragokas Посмотреть сообщение
И файл символов придётся хранить рядом. А если делать как Stand-Alone exe, интересно получится ли упаковать pdb в ресурсы постфактум, не нарушив соответствие с символами. Навскидку, пропатчил ресурс, вроде ничего не испортилось.
Я даже не проверял этот момент.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.03.2023, 18:12  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Хеш-таблица со строковыми ключами.
Добавил её к твоему проекту сравнения скоростей с TrickHashTable и Scripting.Dictionary.
М.б. будет полезно кому.
Вложения
Тип файла: zip TrickHashTables_Perf.zip (52.4 Кб, 12 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2023, 18:12
Помогаю со студенческими работами здесь

Парочка полезных видеоуроков по C++
323e1ffiYjw AEA7GmPli5Y OH7g2lfsYEU Может какой-нибудь следующий &quot;учитель&quot; посмотрит и передумает делать свои уроки :)

Удаленное тестирование приложение/Пересылка на тестирование
Если кто-то написал приложение под андроид и захочет показать другому человеку, то достаточно отослать apk. А как обстоит с этим дело в...

Unit -тестирование или автоматизированное тестирование
Доброго времени суток. Я программирую «для себя» второй год, на выходе получаются разного рода приложения от постоянно подающих с...

Не Большой Набор Полезных Функций
Функция проверки на наличие не запрещенных символов в поле, где ? - запрещенные символы Function Check_BadSymbols(sStr As String) As...

USBasp - пара возможно полезных плюшек.
Уважаемые коллеги! Возможно то, что я опишу - баян с бородищей. Готов принять справедливую критику. Но вдруг кому-то поможет. Держу...


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru