Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.00/2: Рейтинг темы: голосов - 2, средняя оценка - 4.00
 Аватар для BasicMan
19318 / 2626 / 84
Регистрация: 17.02.2009
Сообщений: 30,364

Делимся наработками

03.11.2009, 11:04. Показов 485432. Ответов 282
Метки нет (Все метки)

в этой теме предлагаю выкладывать интересные наработки по акцессу...

зы. в дальнейшем на основе их можно будет создать темы "важное"

Добавлено через 45 секунд
ззы. флуд и спам в этой теме будет награжден красными карточками
17
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2009, 11:04
Ответы с готовыми решениями:

Для рубрики "Делимся наработками", добить БД поставка-сделка авто
День добрый, форумчане. Хочу довести до ума БД, чтобы добавить в раздел форума "Делимся наработками", так как там нашел только...

Обсуждение поста #137 в теме "Делимся наработками". Программный модуль контроля ресурсов принтеров сети.
Сейчас тестовая страница на каждом принтере выдаёт эту информацию.

Строковый тип данных. С наработками. Работает, но не верно
Написать программу определения в заданной строке номера первого по порядку слова, которое короче своего предшественника и число вхождений в...

282
Эксперт MS Access
 Аватар для Eugene-LS
13229 / 5913 / 1520
Регистрация: 05.10.2016
Сообщений: 16,562
12.10.2020, 14:19
Цитата Сообщение от Capi Посмотреть сообщение
Но не есть ли это просто иллюстрация применения функции Split?
Именно !
Причём громоздкая (на любителя), хотя и верная. Можно было в 6-9 строчек всё уложить ....
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
21.11.2020, 21:57
Автозакрытие формы.

Когда-то я сильно увлекался разработкой пользовательского интерфейса. Хотелось сделать что-то такое, чего не было у других. Мастерил всякое: выезжающие и разворачивающиеся формы, меняющиеся указатели мыши, меняющийся цвет и шрифт на кнопках при наведении указателя мыши, ну и тому подобное.
Одной из задумок было создать поясняющую систему, когда при наведении указателя мыши на соответствующее поле, под указателем всплывала бы форма с текстовым полем, где было бы пояснение, а когда указатель убирался со всплывающей формы, то она бы автоматически закрывалась. К сожалению я эту задумку не довёл до ума. Полученные примеры работали неустойчиво и я от них отказался.
Вскоре я охладел к украшательству. Для программ на работе всё это по большому счёту не надо, а для программ на заказ это становится выгодным только при массовом тиражировании. Для единичных заказов всё это только увеличивает трудозатраты не влияя на стоимость работы.
И вот недавно, совершенно случайно на одном из сайтов я натолкнулся на решение той задачи с автозакрытием форм, которую не смог решить тогда.
Предлагаю Вашему вниманию пример, скачанный с того сайта.
В архиве лежат базы в формате mdb и accdb. Пример может работать в 32-х и 64-х разрядных версиях Access.

Автор примера - Daniel Pineault

Источник Auto-Closing Forms
Вложения
Тип файла: rar AutoClosePopup_V1.000.rar (52.7 Кб, 569 просмотров)
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
22.11.2020, 13:45
Когда-то, не так давно, лет 5 назад существовал сайт accessoft.ru
Автор: Парусников Алексей (AKA Palarm)

На этом сайте размещались справочные материалы по Access, принимались разработки на базы данных, был форум, выкладывались готовые базы.
У меня в архиве осталось несколько баз с этого сайта. Решил выложить здесь. Может пригодятся

Программа Библиотека
Обратилась ко мне студентка: сделай мне программу по ТЗ для диплома. Ну я и сделал. Потом правда у нее возникли проблемы с ее открытием (правда почему то только у нее).
Разбор полетов по этой проге уже был в каком то топике, но думаю, зачем добру пропадать, может кому и пригодится. Программу слегка подшаманил Крук Валера. (Palarm)


Инструментальное производство
Программа «Инструментальное производство» разработана с целью ускорения прохождения документации в отделах предприятия, занимающихся планированием инструментального производства (инструментальный отдел - ИНО), в которых учет извещений, тех. решений, планирование заказов и т. д. ведется при помощи устаревших версий программного обеспечения, не отвечающих современным требованиям, либо вручную.

Программа для оформления заказов на стальные двери
Реализованы функции работы с Word, вставка рисунка из каталога в форму и отчет, создание формул для расчета параметров двери. Ну и разумеется, как всегда автолинковка и резервное копирование.
Здесь представлена только часть программы. Остальную часть показывать нет смысла, так как там в основном то же самое, только макеты отчетов и шаблонов Word другие. Программа делалась на заказ, она и сейчас успешно работает и продолжает развиваться. Думаю, что наверное отчеты "Заказчику", "Подрядчику", "В цех" придется все же выводить в Word, так как сколько я не пытался сделать зависимых справочников, все равно периодически возникает ситуация, когда надо так, а выходит по другому. И выручает как всегда замазывание и ручное исправление. Не помешает также и какой ни будь мастер для создания рисунков - Paint для этого случая полный отстой.
Вообще интересно бы было послушать умные слова к примеру по поводу оптимизации загрузки формы "Заказы" - в mdb варианте это происходит довольно медленно, если базу переделать в mde дела пойдут быстрее.
Для тех, кто не в курсе, открывать для просмотра базу надо так: придавить кирпичом SHIFT и щелкать по «Двери».


Стартовая форма - автолинковка, резервное копирование/восстановление.
В данном примере показано, как автоматически присоединять таблицы из каталога приложения базы, делать резервное копирование и восстановление. Модуль автолинковки позаимствован у Jossа и слегка доработан. Пример может быть полезен для начинающих.
Вложения
Тип файла: zip Biblioteka.zip (57.3 Кб, 591 просмотров)
Тип файла: rar Instr.rar (1.06 Мб, 526 просмотров)
Тип файла: rar Двери.rar (787.1 Кб, 551 просмотров)
Тип файла: zip AutoLink.ZIP (140.3 Кб, 362 просмотров)
2
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
26.11.2020, 16:08
Автоматический перезапуск Access

Была (да и есть сейчас) у меня одна задача. В ней необходимо было выгружать в шаблоны Excel информацию. Там было намудрено с ранним и поздним связыванием, так что после выгрузки процесс Excel оставался в памяти и необходимо было перегружать Access. Хотелось бы это делать автоматически сразу после выгрузки. Пробовал использовать командные файлы (bat и cmd) для повторного запуска Access. Потом в интернете наткнулся На vbs скрипт, который делает то же самое. Понравилось.

Текст скрипта, представленный ниже, просто выполняет цикл до тех пор, пока не будет закрыт/удалён файл блокировки (таким образом проверяется закрытие текущей программы), а затем снова запускает базу данных. Для работы он ожидает 2 входных аргумента: (1) полный путь и имя файла базы данных, (2) полный путь и имя файла блокировки.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'Input into a standard text editor, save it with the name RestartDb.vbs 
'and place in the same folder as the front-end
Dim Database
Dim LockFile
Dim i
Dim sAppEXE
Dim sRegKey
 
Database = WScript.Arguments(0)
LockFile = WScript.Arguments(1)
 
Set WshShell = CreateObject("WScript.Shell")
i = 0
'Wait until the lock file is gone
Do While FileExists(LockFile) = True
       PauseScript WshShell, 250
   i = i + 1
   if i >= 40 Then 'Number of loops to test for before exiting without success.  This number can be adjusted
       MsgBox "Unable to restart the Database as the Lock File is not going away.  Please try to relaunch it manually."
       Wscript.Quit
   End If
Loop 
PauseScript WshShell, 750
 
sAppEXE = "MSACCESS.EXE"
sRegKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" & sAppEXE & "\Path"
sAccessPath = WshShell.RegRead(sRegKey)
WshShell.Run _
        chr(34) & sAccessPath & sAppEXE & _
        chr(34) & " " & chr(34) & Database & chr(34)
 
Set WSHShell = Nothing
 
 
 
Function FileExists(FilePath)
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(FilePath) Then
    FileExists = True
  Else
    FileExists = False
  End If
End Function
 
Function PauseScript(WshShell, Delay)
   'Delay in milliseconds
   If WshShell Is Nothing Then Set WshShell = CreateObject("WScript.Shell")
   WScript.Sleep Delay
End Function
Затем в своей базе данных делается что-то вроде:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim sDatabase             As String
Dim sLockFile             As String
 
' Input argument 1
sDatabase = Application.CurrentDb.Name 
' Input argument 2
sLockFile = Replace(sDatabase, ".accdb", ".laccdb") 
'sLockFile = Replace(sDatabase, ".mdb", ".ldb") 
' Launch the Restart VBScript
Shell "wscript """ & Application.CurrentProject.Path & "\RestartDb.vbs"" """ & _
      sDatabase & """ """ & sLockFile & """"
'Close Access
Application.Quit
Ключевым моментом здесь является тот факт, что вы запускаете сценарий до выхода из Access.

Источник Automatically Restart Access
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
28.11.2020, 12:17
Когда-то, в одной из задач, мне было необходимо организовать взаимодействие из Access с определённым процессом (задачей) Он мог быть запущен или нет. Я организовал проверку его работы по ошибке. Если при обращении к процессу возвращалась ошибка, то процесс не был запущен. Но не для всех процессов это подходило. Потом я нашел в интернете более оригинальное определение работы нужного процесса. Может кому-то пригодится

WMI-определить, работает ли процесс или программа

Простой метод проверить, запущена ли программа (фактически процесс) в настоящее время на компьютере, локальном или удаленном (если установлены соответствующие разрешения для удалённой проверки такой ​​информации) с помощью простого запроса WMI.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
'---------------------------------------------------------------------------------------
' Procedure : WMI_IsProcessRunning
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Determine if a process or Program is running or not
'               Returns: True/False
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sExeName  : Name of the process to look for
' sHost     : Host computer to query, omit for the local PC
'
' Usage:
' ~~~~~~
' WMI_IsProcessRunning("firefox.exe")
' WMI_IsProcessRunning("outlook.exe")
' WMI_IsProcessRunning("msaccess.exe", "HomePC01")
' WMI_IsProcessRunning("msaccess.exe", "192.168.100.12")
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2010-Feb-03             Initial Release
' 2         2020-08-21              Renamed the Function
'                                   Updated Proc Header
'                                   Code updated
'                                   Updated Error Handler
'---------------------------------------------------------------------------------------
Public Function WMI_IsProcessRunning(sProcessName As String, Optional sHost As String = ".") As Boolean
    On Error GoTo Error_Handler
    Dim oWMI                  As Object    'WMI object to query about the PC's OS
    Dim sWMIQuery             As String    'WMI Query
    Dim oCols                 As Object
    Dim oCol                  As Object
 
    Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sHost & "\root\cimv2")
    sWMIQuery = "SELECT * FROM Win32_Process WHERE Name = '" & sProcessName & "'"
    Set oCols = oWMI.ExecQuery(sWMIQuery)
    If oCols.Count <> 0 Then WMI_IsProcessRunning = True
 
Error_Handler_Exit:
    On Error Resume Next
    Set oCols = Nothing
    Set oWMI = Nothing
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: WMI_IsProcessRunning" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Примечание.
WMI - Windows Management Instrumentation в дословном переводе — инструментарий управления Windows. WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows.

Источник WMI-Determine If a Process or Program Is Running Or Not
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
29.11.2020, 19:56
Это типа дополнение к предыдущему посту

WMI - убить процесс

Время от времени программы не завершаются должным образом. Поэтому может возникнуть необходимость прекратить процесс. Ниже представлена ​​простая функция, в которую вы передаете полное имя процесса, который нужно завершить.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
'---------------------------------------------------------------------------------------
' Procedure : WMI_KillProcesse
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Forcibly kill all the instances of a specified process
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sProcessName  : Name of the process to kill
' sHost         : Host computer to query, omit for the local PC
'
' Usage:
' ~~~~~~
' Call WMI_KillProcesse("explorer.exe")
' Call WMI_KillProcesse("excel.exe")
' Call WMI_KillProcesse("calculator.exe")
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2015-05-28              Initial Release
' 2         2020-08-21              Added Proc Header
'                                   Code updated
'                                   Updated Error Handler
'                                   Made it Option Explicit compliant
'---------------------------------------------------------------------------------------
Public Function WMI_KillProcesse(sProcessName As String, Optional sHost As String = ".") As Boolean
    On Error GoTo Error_Handler
    Dim oWMI                  As Object    'WMI object to query about the PC's OS
    Dim sWMIQuery             As String    'WMI Query
    Dim oCols                 As Object
    Dim oCol                  As Object
 
    Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sHost & "\root\cimv2")
    sWMIQuery = "SELECT Name FROM Win32_Process"
    Set oCols = oWMI.ExecQuery(sWMIQuery)
    For Each oCol In oCols
        If LCase(sProcessName) = LCase(oCol.Name) Then
            oCol.Terminate    ' Kill this instances of the process
        End If
    Next oCol
    WMI_KillProcesse = True
 
Error_Handler_Exit:
    On Error Resume Next
    Set oCol = Nothing
    Set oCols = Nothing
    Set oWMI = Nothing
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: WMI_KillProcesse" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Имейте в виду, что он закроет все экземпляры данного процесса. Допустим, у вас запущено 3 экземпляра Excel, и вы завершаете работу excel.exe, все три экземпляра будут остановлены.

Кроме того, этот метод представляет собой завершение процесса грубой силой, поэтому вам не будет предложено сохранить и несохраненную работу ... Это последний подход, обычно для зависших процессов.

Источник VBA – Kill a Process
1
Эксперт MS Access
 Аватар для Eugene-LS
13229 / 5913 / 1520
Регистрация: 05.10.2016
Сообщений: 16,562
29.11.2020, 20:21
Цитата Сообщение от Silur Посмотреть сообщение
WMI - убить процесс
Не сочтите за критиканство пожалуйста, но я делал проще (короче на 38 чтрок):
Кликните здесь для просмотра всего текста
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
Public Sub CloseProcess(sProcCaption As String)
'es 09.06.2017
'Закрытие Приложения (процесса) с названием указанным в аргументе (Маска: Название*)
'--------------------------------------------------------------------------
'Литература:
'Рецепты WMI: управление процессами : http://www.script-coding.com/WMI_Processes.html
'--------------------------------------------------------------------------
Dim objProcess As Object
On Error GoTo CloseProcess_Err
    'Перебор запущенных процессов
    For Each objProcess In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
        'Debug.Print objProcess.Caption
        If objProcess.Caption Like sProcCaption & "*" Then
           objProcess.Terminate    'Закрытие процесса
        End If
    Next
 
CloseProcess_Bye:
    Exit Sub
 
CloseProcess_Err:
    MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: CloseProcess", vbCritical, "Error in module mod00_Test"
    Resume CloseProcess_Bye
End Sub
3
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
05.12.2020, 14:34
Бывают случаи, когда необходимо организовать обмен данными через буфер обмена. Здесь предложен один из таких способов.

VBA - сохранить строку в буфер обмена и получить строку из буфера обмена

Здесь используется подход Microsoft Forms Data Object. Можно так же использовать Windows API (что требует гораздо большего количества кода!), Но это наверное самое простое решение, которое решает общие потребности разработчиков.

Получения значения из буфера обмена
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
36
37
38
39
40
'---------------------------------------------------------------------------------------
' Procedure : Clipboard_GetText
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Retrieve the clipboard value
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
'
' Usage:
' ~~~~~~
' Debug.Print Clipboard_GetText
' sClipboardValue = Clipboard_GetText
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2020-11-25              Initial Public Release
'---------------------------------------------------------------------------------------
Public Function Clipboard_GetText() As String
    On Error GoTo Error_Handler
 
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        Clipboard_GetText = .GetText
    End With
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: Clipboard_GetText" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Занесение значения в буфер обмена
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
36
37
38
39
40
41
42
43
'---------------------------------------------------------------------------------------
' Procedure : Clipboard_SetText
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Push a string value to the Clipboard
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sInput : The string to push to the clipboard
'
' Usage:
' ~~~~~~
' Call Clipboard_SetText("Hello World")
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2020-11-25              Initial Public Release
'---------------------------------------------------------------------------------------
Public Sub Clipboard_SetText(sInput As String)
    On Error GoTo Error_Handler
 
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText sInput
        .PutInClipboard
    End With
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Sub
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: Clipboard_SetText" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Sub
Как видите, код на самом деле очень прост и состоит всего из нескольких строк кода, использует позднюю привязку, поэтому не требуется определять ссылочные библиотеки и не использует какой-либо конкретный код приложения, поэтому он полностью переносимый и может использоваться в любом приложении VBA (Access, Excel, Outlook, PowerPoint, Word,…).

Источник VBA – Save String To Clipboard, Get String From Clipboard

Советую так же посмотреть Microsoft Forms reference

Добавлено через 30 минут
Пример работы с буфером обмена с помощью API можно посмотреть здесь Функции для работы с текстовым буфером обмена

Добавлено через 10 минут
Поскольку в последнее время сайт Андрея Митина бывает недоступен, решил скопировать код сюда

При копировании текста в буфер обмена функция временно переключает раскладку клавиатуры на русскую для того, чтобы избежать проблем, связанных с некорректным определением буфером обмена кодовой страницы русского текста в формате Unicode. При выоде из функции восстанавливается старая раскладка клавиатуры (которая была при вызове функции)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
Option Compare Database
Option Explicit
 
'am 030305_14:59:26  --begin-- **************
'так как проблема при копировании в буфер тектста
    'в юникода при латинской раскладке
Private Declare Function GetKeyboardLayoutName Lib "user32" _
        Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function LoadKeyboardLayout Lib "user32" _
        Alias "LoadKeyboardLayoutA" (ByVal HKL As String, _
                ByVal flags As Long) As Long
Private Const KL_NAMELENGTH = 9
'am 030305_14:59:26  --end-- **************
 
 
Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" _
            (ByVal wFlags&, ByVal dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
            ByVal lpString2 As Any) As Long
Declare Function lstrcpy2 Lib "kernel32" Alias "lstrcpy" _
        (ByVal lpString1 As Any, ByRef lpString2 As Byte) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
            ByVal hMem As Long) As Long
 
Public Const GHND = &H42
Public Const MAXSIZE = 4096
Public Const CF_TEXT = 1
 
 Function ClipBoard_GetData() As String
         Dim hClipMemory As Long
         Dim lpClipMemory As Long
         Dim MyString As String
         Dim RetVal As Long
         Dim lSize As Long
         If OpenClipboard(0&) = 0 Then
            MsgBox "Cannot open Clipboard. Another app. may have it open"
            Exit Function
         End If
 
         ' Obtain the handle to the global memory
         ' block that is referencing the text.
         hClipMemory = GetClipboardData(CF_TEXT)
         If hClipMemory = 0 Then
            MsgBox "Could not allocate memory"
            GoTo OutOfHere
         End If
         'am 040610 - размер нужно узнать
          lSize = GlobalSize(hClipMemory)
 
         ' Lock Clipboard memory so we can reference
         ' the actual data string.
         lpClipMemory = GlobalLock(hClipMemory)
 
         If lpClipMemory <> 0 Then
            MyString = Space$(lSize)
            RetVal = lstrcpy(MyString, lpClipMemory)
            RetVal = GlobalUnlock(hClipMemory)
 
            ' Peel off the null terminating character.
            MyString = mID(MyString, 1, InStr(1, MyString, Chr$(0), 0) - 1)
         Else
            MsgBox "Could not lock memory to copy string from."
         End If
 
OutOfHere:
 
         RetVal = CloseClipboard()
         ClipBoard_GetData = MyString
 
      End Function
 
 
Function ClipBoard_SetData(MyString As String)
         Dim hGlobalMemory As Long, lpGlobalMemory As Long
         Dim hClipMemory As Long, x As Long
 
         ' Allocate movable global memory.
         '-------------------------------------------
         hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
 
         ' Lock the block to get a far pointer
         ' to this memory.
         lpGlobalMemory = GlobalLock(hGlobalMemory)
 
         ' Copy the string to this global memory.
         lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
         'lpGlobalMemory = lstrcpy2(lpGlobalMemory, b(0))
 
         ' Unlock the memory.
         If GlobalUnlock(hGlobalMemory) <> 0 Then
            MsgBox "Could not unlock memory location. Copy aborted."
            GoTo OutOfHere2
         End If
 
         ' Open the Clipboard to copy data to.
         If OpenClipboard(0&) = 0 Then
            MsgBox "Could not open the Clipboard. Copy aborted."
            Exit Function
         End If
 
         ' Clear the Clipboard.
         x = EmptyClipboard()
 
 
        'am 030305_15:16:05  --begin-- **************
        'переключаемся на русскую раскладку чтобы не иметь
        'проблем с русским текстом в буфере
        '(некорректно понимается кодовая страница)
        Dim sOldLang As String
        sOldLang = switchLang("00000419")
        'am 030305_15:16:05  --end-- **************
 
         ' Copy the data to the Clipboard.
         hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
         If CloseClipboard() = 0 Then
            MsgBox "Could not close Clipboard."
         End If
        'am 030305_15:17:26  --begin-- **************
        'возвращаем раскладку на место
        If Len(sOldLang) > 0 Then _
            sOldLang = switchLang(sOldLang)
        'am 030305_15:17:26  --end-- **************
 
End Function
        
Private Function getCurrLang() As String
    Dim layoutname As String * KL_NAMELENGTH
    Dim z As Long
    z = GetKeyboardLayoutName(layoutname)
    If z = 0 Then
        getCurrLang = ""
    Else
        getCurrLang = StrZ(layoutname)
    End If
End Function
'Переключает на указанную sNewLang раскладку - возвращает старую раскладку
'am 030305_15:13:39
Private Function switchLang(sNewLang As String) As String
'"00000419" - русская
'"00000409" - латинская
    switchLang = getCurrLang
    If StrComp(switchLang, sNewLang) <> 0 Then
        LoadKeyboardLayout sNewLang, 1
    End If
End Function
'v_1.0.0 990630
Public Function StrZ(par As String) As String
Dim nSize As Long, i As Long, Rez As String
   nSize = Len(par)
   i = InStr(1, par, Chr(0)) - 1
   If i > nSize Then i = nSize
   If i < 0 Then i = nSize
   StrZ = mID(par, 1, i)
End Function
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4179 / 2464 / 513
Регистрация: 13.12.2016
Сообщений: 8,374
Записей в блоге: 5
05.12.2020, 16:59
Silur, роскошный код, однако я обходился всегда таким для помещения в буфер.
Ну а извлекал привычным способом в любом приложении...
Visual Basic
1
2
3
4
5
6
Sub SetClipboardText(ByVal txt$) ' Запись
   With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText txt$
        .PutInClipboard
    End With
End Sub
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
12.01.2021, 14:02
Недавно мне пришлось обратиться к работе с Реестром Windows.
После долгих поисков нашел лучший с моей точки зрения способ. Статья старая, от 2003 года. Но, как говорят, "Новое - это хорошо забытое старое"

Класс для работы с реестром со строковыми значениями на основе Microsoft Windows Script Host (WSH)
Автор: Егоров Алексей Владимирович (aka АлексейЕ)
взято тут

Описание: Класс для работы с реестром со строковыми значениями на основе Microsoft Windows Script Host (WSH)
Имя класса - OperationRegistry

Класс OperationRegistry имеет свойства:
- oprVersion (Версия класса. Только чтение)
- oprRootKeyName (Наименование корневого раздела. Чтение / Запись)
- oprStartup (Путь к разделу Автозагрузки. Только чтение)

Класс OperationRegistry имеет методы:
- oprRegWriteVal (создает раздел / параметр)
- oprRegGetVal (Возвращает значение раздела / параметра)
- oprRegDelete (Удаляет раздел / параметр)

- oprStartupAdd (Добавляет новый параметр автозагрузки)
- oprStartupDelete (Удаляет параметр автозагрузки)

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
Option Compare Database
Option Explicit
 
'К сожалению перечисления только для чисел типа Long
'Для перевода в строку воспользуемся функцией-конвертор ConverterRootKeyName()
'Т.к. начинаем отсчет с 0, то по умолчанию будет первичный раздел HKEY_CURRENT_USER
Public Enum RootKeyName
    rkn_HKEY_CURRENT_USER
    rkn_HKEY_LOCAL_MACHINE
    rkn_HKEY_CLASSES_ROOT
    rkn_HKEY_USERS
    rkn_HKEY_CURRENT_CONFIG
    rkn_HKEY_DYN_DATA
    'rkn_HKEY_PERFORMANCE_DATA
End Enum
 
Private WshShell As Object
Private rknRootKeyName As RootKeyName               'Корневой раздел
 
 
'///////////////   С В О Й С Т В А     ///////////////
 
' Версия
Public Property Get oprVersion() As String
oprVersion = "2.10.030916 L"
End Property
 
'Ключ автозагрузки
Public Property Get oprStartup() As String
oprStartup = "Software\Microsoft\Windows\CurrentVersion\Run\"
End Property
 
Public Property Get oprRootKeyName() As RootKeyName
oprRootKeyName = rknRootKeyName
End Property
 
Public Property Let oprRootKeyName(rknNewValue As RootKeyName)
rknRootKeyName = rknNewValue
End Property
 
 
'///////////////    С О Б Ы Т И Я     ///////////////
Private Sub Class_Initialize()
    Set WshShell = CreateObject("WScript.Shell")
End Sub
 
Private Sub Class_Terminate()
    Set WshShell = Nothing
End Sub
 
 
'///////////////   М Е Т О Д Ы    ///////////////
 
' Функция oprRegGetVal() возврвщает значение ключа реестра
Public Function oprRegGetVal(strSubKey As String) As Variant
On Error GoTo oprRegGetVal_Error
 
    Dim strName As String, varResult As Variant
    
    strName = CompletePath(strSubKey)
    varResult = WshShell.RegRead(strName)
 
oprRegGetVal_Exit:
    oprRegGetVal = varResult
    Exit Function
 
oprRegGetVal_Error:
    If Err.Number = -2147024894 Then varResult = ""
    Resume oprRegGetVal_Exit
End Function
 
' Процедура oprRegWriteVal() создает раздел / параметр.
Public Sub oprRegWriteVal(strSubKey As String, varValue As Variant)
Dim strName As String
    
    strName = CompletePath(strSubKey)
    WshShell.RegWrite strName, varValue
End Sub
 
' Процедура oprRegDelete() Удаляет раздел / параметр.
Public Sub oprRegDelete(strSubKey As String)
On Error GoTo oprRegGetVal_Error
    
    Dim strName As String
    
    strName = CompletePath(strSubKey)
    WshShell.RegDelete (strName)
    
oprRegGetVal_Exit:
    Exit Sub
 
oprRegGetVal_Error:
    If Err.Number = -2147024894 Then
    Else
        MsgBox Err.Description
    End If
    Resume oprRegGetVal_Exit
End Sub
 
' Процедура oprStartupAdd() Создает новый параметр автозагрузки.
Public Sub oprStartupAdd(strProgramName As String, strPathProgram As String)
Dim strSubKey As String, rknRootKeyName As RootKeyName
    
    strSubKey = Me.oprStartup & strProgramName
 
    rknRootKeyName = Me.oprRootKeyName
    
    Me.oprRootKeyName = rkn_HKEY_LOCAL_MACHINE
    Me.oprRegWriteVal strSubKey, strPathProgram
    
    Me.oprRootKeyName = rknRootKeyName
End Sub
 
' Процедура oprStartupDelete() Удаляет параметр автозагрузки.
Public Sub oprStartupDelete(strProgramName As String)
Dim strSubKey As String, rknRootKeyName As RootKeyName
    
    strSubKey = Me.oprStartup & strProgramName
    
    rknRootKeyName = Me.oprRootKeyName
    
    Me.oprRootKeyName = rkn_HKEY_LOCAL_MACHINE
    Me.oprRegDelete strSubKey
    
    Me.oprRootKeyName = rknRootKeyName
End Sub
 
 
'///////////////   Д О П .   Ф У Н К Ц И И    ///////////////
 
' Функция ConverterRootKeyName() возврвщает значение типа строка
Private Function ConverterRootKeyName(lngKey As Long) As String
Dim strKeyName As String
    Select Case lngKey
    Case 0
        strKeyName = "HKCU"
    Case 1
        strKeyName = "HKLM"
    Case 2
        strKeyName = "HKCR"
    Case 3
        strKeyName = "HKEY_USERS"
    Case 4
        strKeyName = "HKEY_CURRENT_CONFIG"
    Case 5
        strKeyName = "HKEY_DYN_DATA"
    Case 6
        strKeyName = "HKEY_PERFORMANCE_DATA"
    Case Else
        strKeyName = ""
    End Select
 
    ConverterRootKeyName = strKeyName
End Function
 
' Функция CompletePath() возврвщает полный путь к параметру
Private Function CompletePath(strPathKey As String) As String
Dim strName As String
 
    strName = Left(strPathKey, 1)
    
    ' Добавим обратный слеж если его нет
    If strName = "\" Then
        strName = ConverterRootKeyName(Me.oprRootKeyName) & strPathKey
    Else
        strName = ConverterRootKeyName(Me.oprRootKeyName) & "\" & strPathKey
    End If
 
    CompletePath = strName
End Function
Пример использования
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
36
37
38
39
40
41
42
43
44
Public Sub OperationRegistry()
Dim orgOperReg As OperationRegistry
 
Set orgOperReg = New OperationRegistry
 
'Определяем корневай узел HKEY_CURRENT_USER (Но можно не определять,
'по умолчанию HKEY_CURRENT_USER)
orgOperReg.oprRootKeyName = rkn_HKEY_CURRENT_USER
 
' Создаем раздел / параметр
orgOperReg.oprRegWriteVal "Software\MyProgram\Program1\", ""
orgOperReg.oprRegWriteVal "Software\MyProgram\Program2\StringKey", "String Key"
 
' Читаем раздел / параметр
Debug.Print orgOperReg.oprRegGetVal("Software\MyProgram\Program1\")
Debug.Print orgOperReg.oprRegGetVal("Software\MyProgram\Program2\StringKey")
 
' Удаляем раздел / параметр
orgOperReg.oprRegDelete "Software\MyProgram\Program1\"
orgOperReg.oprRegDelete "Software\MyProgram\Program2\StringKey"
orgOperReg.oprRegDelete "Software\MyProgram\"
 
Set orgOperReg = Nothing
End Sub
 
' Добавляем Автозагрузку
Public Sub AddStartup()
Dim orgOperReg As OperationRegistry
Set orgOperReg = New OperationRegistry
 
orgOperReg.oprStartupAdd "База ACCESS", "D:\Мои документы\Access\Refer2002.mde"
 
Set orgOperReg = Nothing
End Sub
 
' Удаляем Автозагрузку
Public Sub DeleteStartup()
Dim orgOperReg As OperationRegistry
Set orgOperReg = New OperationRegistry
 
orgOperReg.oprStartupDelete "База ACCESS"
 
Set orgOperReg = Nothing
End Sub
1
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
12.01.2021, 14:49
Цитата Сообщение от Silur Посмотреть сообщение
Читаем раздел / параметр
Кстати этим способом можно отлично защитить свою БД от "лишнего" периода использования
0
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
02.03.2021, 06:29
Какие приложения активны в сети и кто их открыл

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

Подробности - в архиве, в кратком описании.
Запускается с любого каталога. Версии для MSA2003 MSA2010 Win64x.

А описание здесь: Краткое описание.doc
Вложения
Тип файла: rar ApplicationViewer.rar (234.2 Кб, 262 просмотров)
Тип файла: doc Краткое описание.doc (32.0 Кб, 221 просмотров)
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4179 / 2464 / 513
Регистрация: 13.12.2016
Сообщений: 8,374
Записей в блоге: 5
18.03.2021, 14:52
Зачастую бывает нужно, что после доработки интерфейсного файла, его необходимо установить пользователям.
Это нудная операция может быть автоматизирована. По крайней мере я озадачился и к удивлению не нашел ничего стоящего. Пришлось придумывать самому. Реализовал так:
К файлу базы добавляется таблица и модуль. В таблице информация о версии. На запуске базы (у меня из формы по событию открытия) запускается проверка версии и если имеется обновление предлагается ее установить. Отдельное спасибо alvk, который уверял что решение в наработках есть, однако я его не нашел и накидал свое.

P.S. Не проверял как будет вести себя с русскими буквами в путях. В названии базы справляется нормально.
Вложения
Тип файла: rar testUpdate.rar (73.8 Кб, 220 просмотров)
3
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4179 / 2464 / 513
Регистрация: 13.12.2016
Сообщений: 8,374
Записей в блоге: 5
21.03.2021, 12:25
В дополнение к вышеопубликованному.
Чисто для разработчика поставил кнопочку, которая делает обратное. А именно: бэкапит интерфейс в сеть, добавляя перед именем версию (тогда в названии версий нельзя применять знаки, которые могут повлиять на допустимое имя файла) и заменяет обновленный файл в месте обновления. Поскольку у меня была проблема с перезаписыванием, я не вникая просто старый файл предварительно убиваю.
Процедурку вызываю из формочки с версией, чтобы упростить доступ к данным.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Кнопка6_Click()
ms = "Реально скопировать интерфейс в сетевую папку как новую версию?"
If MsgBox(ms, vbOKCancel, "Copy to base") = 1 Then
ndb = Me.PatchDB.Value & "\" & Me.NameDB
nverdb = Me.PatchDB.Value & "\" & Me.ver & Me.NameDB
Kill ndb
sDatabase = Application.CurrentDb.Name
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile sDatabase, ndb, OverwriteExisting
objFSO.CopyFile sDatabase, nverdb, OverwriteExisting
End If
End Sub
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
12.06.2021, 21:27
Для АЕ

Когда-то, лет 15 назад я таким тоже занимался. Тоже написал свою программу. Можно ознакомиться вот здесь Контроль и автоматическое обновление клиентских приложений
Там же я собрал небольшую коллекцию программ, посвященных этой теме. Может кому-то пригодится.
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4179 / 2464 / 513
Регистрация: 13.12.2016
Сообщений: 8,374
Записей в блоге: 5
13.06.2021, 10:30
Цитата Сообщение от Silur Посмотреть сообщение
Для АЕ
Почему демонстративно а не в личку?
Цитата Сообщение от Silur Посмотреть сообщение
Когда-то, лет 15 назад я таким тоже занимался.
И почему перестали?

Добавлено через 30 минут
Я бы приветствовал, если бы Silur изложил отличия и возможности своей версии. Например необходимость дополнительного файла, чувствительность к формату базы данных и т.п.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
13.06.2021, 23:13
Чтож, попробую описать различие между своей программой и методом АЕ
Хотел сделать таблицу различий, но что-то не разобрался, как её тут оформлять. А справки не нашел. Попробую немного по другому.

Контроль новых версий в обоих способах происходит по ниличию записей в специальной таблице. У меня это tblRelease у АЕ - ver

Основное различие.
У АЕ модуль обновления встраивается в каждую программу и контроль обновления происходит самой программой при запуске или можно сделать контроль по отдельной кнопке.

У меня для контроля обновлений используется отдельноя программа. Одна программа на все клиентские модули на данном компьютере. Весь фокус в её запуске.
Запускается программа контроля через ярлык на рабочем столе. Сколько программ надо контролировать, столько надо создать ярлыков. За один запуск контролируется только один клиентский модуль, который потом и будет запущен на выполнение. Причём ярлыки для запуска создаются самой программой контроля обновлений по кнопке "Установка ярлыка" (слева внизу)
Рабочая папка, архивная папка, параметры командной строки, иконка для ярлыка, название ярлыка - всё это задаётся в программе контроля обновлений (соответствующие кнопки и поля)
Весь фокус в последнем задаваемом параметре, который у меня в программе называется "Код командной строки:". это значение прописывается в параметр "Объект" ярлыка. Используя это значение, программа опредыляет, какой именно интерфейсняй модуль надо проверять. Именно это позводяет использовать одну программу контроля для всех интерфейсных модулей.
А потом всё просто. По результатам проверки или заменяется проверяемый модуль и запускается на выполнение. Либо сразы запускается.

Вроде всё описал понятно. Если что неясно - спрашивайте.
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4179 / 2464 / 513
Регистрация: 13.12.2016
Сообщений: 8,374
Записей в блоге: 5
13.06.2021, 23:55
Цитата Сообщение от Silur Посмотреть сообщение
У АЕ модуль обновления встраивается в каждую программу и контроль обновления происходит самой программой при запуске
Да, именно так. Достаточно добавить в события при загрузке главной формы и быть спокойным, что кроме этого интерфейса она ничего на компьютере не тронет.Табличка из нескольких полей и единственной записью не утяжеляет базу. Я еще добавил логическое поле "режим разработчика" - это позволяет открывать меню, список таблиц и т.п. + копировать и архивировать версии интерфейса.
Цитата Сообщение от Silur Посмотреть сообщение
Одна программа на все клиентские модули на данном компьютере.
Я не имею обыкновения менять сразу все интерфейсы за раз. Обычно трудишся над одним и когда он готов меняеш циферку версии. Запускать специальный ярлык или программу пользователя не надо. Он при запуске программы увидит предложение загрузить свежую версию с описанием отличий. Может и отказаться, но это предложение будет преследовать его каждый раз, пока не обновится.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 918
14.06.2021, 00:16
"В каждой избушке свои погремушки"
Например, в моём отделе работают женщины. Они привыкли запускать программы с ярлыков на рабочем столе. Это пошло ещё до меня. Вот под эти особенности работы я и писал свою программу.

У меня сразу ведётся 6 программ. по-этому я посчитал, что лучше сделать одну программу для контроля всех модулей, а не встраивать контрольв каждую программу.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
14.06.2021, 00:28
Цитата Сообщение от Silur Посмотреть сообщение
Хотел сделать таблицу различий, но что-то не разобрался, как её тут оформлять.
В панели инструментов кнопка Таблица.

Цитата Сообщение от Silur Посмотреть сообщение
А справки не нашел.
В нижней части окна редактирования сообщения.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2021, 00:28

Кто занимался работой с timer поделитесь пожалуйста наработками интеренсыми
Например есть форма и на форме кнопка закрыть нажимая кнопку закрыть идет отсчет 10 9 8... и когда доходит 0 то закрывается программа ,...

Делимся.
Доброго времени суток всем посетителям этой темы!=) Хочу попросить вас поделиться самой откровенной информацией по нескольким...

Делимся vpn)
Ребят, накидайте vpn серверов работающих на просторах СНГ.

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

Делимся знаниями по С++
По вашему зачем нужна виртуальная функция в программе? Какой от нее толк если она вызывается как обычная функция. Да я знаю что...


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

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru