Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

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

15.10.2012, 00:56. Показов 30295. Ответов 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
15.02.2023, 20:07  [ТС]
Студворк — интернет-сервис помощи студентам
Тебе нужно для начала найти программу с контролами, которые не поддерживают юникод.
Это любые стандартные встроенные контролы VB6, или например VBA IDE (Excel, Word ...), IDE VB6 кстати тоже.
Попробуй напечатать что-нибудь на русском языке в IDE, потом переключи раскладку на англ. язык, скопируй в буфер написанное в IDE, потом попробуй вставить в браузер.
1
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.02.2023, 20:11
Цитата Сообщение от Dragokas Посмотреть сообщение
напечатать что-нибудь на русском языке
Понял, спасибо. Увидел проблему. Раньше не замечал.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 10:10
А зачем указывать hwnd в функции получения буфера? Там ведь и 0 можно написать. Зачем hwnd формы?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 12:58  [ТС]
Оконные сообщения, коим есть уведомление об изменении состояния буфера, могут приходить только окнам. Соответственно хендл вашего окна нужно указать. Затем через сабклассинг окна, вы отлавливаете все сообщения приходящие вашему окну, и выбираете нужное.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 13:11  [ТС]
аа, вы об этом. Думаю, в данном случае разницы нет. Просто явная передача дескриптора - это более универсально. Например, если открыть буфер с OpenClipboard(0) и затем очистить через EmptyClipboard, то владельцем буфера станет NULL, и последующие вызовы SetClipboardData пофейляться. Как пример.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.02.2023, 13:22  [ТС]
Понятно что будет работать некорректно. Вызовом OpenClipboard hwnd, вы сделали владельцем буфера своё приложение. На каждый успешный вызов OpenClipboard нужно делать CloseClipboard, иначе другое приложение не сможет работать с буфером.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.02.2023, 13:29
Цитата Сообщение от Dragokas Посмотреть сообщение
нужно делать CloseClipboard
Да я так и думал)))
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
19.02.2023, 14:21
Цитата Сообщение от Dragokas Посмотреть сообщение
иначе другое приложение не сможет работать с буфером.
Похоже, что от этой приблуды вреда больше, чем пользы.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
19.02.2023, 14:46
Цитата Сообщение от I can Посмотреть сообщение
Похоже, что от этой приблуды вреда больше, чем пользы.
Так любой код работающий с буфером обмена имеет такие же требования.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 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
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.02.2023, 13:26
Цитата Сообщение от Dragokas Посмотреть сообщение
зачем делаются некие модификации знаков препинания?
Иногда в тексте есть точки или запятые, и при этом, как бы, слова разделяются пробелами точками запятыми, они остаются на фоне сплошных вопросительных знаков нетронутыми. В маленьком буфере до 32 килобайт я их убираю для более надёжного определения. В большом буфере этого не произвожу ибо уйдёт на это уйма времени.

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

Цитата Сообщение от Dragokas Посмотреть сообщение
и для ускорения, я бы, ИМХО, вообще отсёк любой буфер > скажем 100к знаков
Да, можно и так, можно ограничить 100 килобайтами или даже просто 100 символами, конечно. Но у меня в моей программе никаких ограничений нет. Это приводит иногда к тому что приходится ждать по 3 секунды времени при копировании гигантского текста. Поэтому ограничения хорошая идея. Можно было бы и реализовать конечно.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 509
04.03.2023, 12:16
Цитата Сообщение от The trick Посмотреть сообщение
Можно просто написать:
Ха! Не знал. Я даже когда-то где-то задавал вопрос, какой суффикс у типа Currency, мне ответили, что нет. А теперь и Яндекс на этот вопрос сразу ответ даёт.
Теперь бы ещё исправить это в "Готовых решениях".
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2023, 12:56
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Теперь бы ещё исправить это в "Готовых решениях"
Там нельзя, я тоже помню хотел, но не получилось, просто выложил ещё раз вторую версию и всё.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
04.03.2023, 13:02
Я обновил. Кидайте сюда что нужно обновить, я обновлю в теме.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.03.2023, 17:33  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Получить стек вызовов в строковую переменную.
Замечательная возможность!
Не пойму только для чего нужно получение имени модуля через GetModuleHandleEx + GetCallingProcName? Вызов из своей dll?

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

Цитата Сообщение от Dragokas Посмотреть сообщение
И файл символов придётся хранить рядом. А если делать как Stand-Alone exe, интересно получится ли упаковать pdb в ресурсы постфактум, не нарушив соответствие с символами. Навскидку, пропатчил ресурс, вроде ничего не испортилось.
Я даже не проверял этот момент.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru