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

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

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

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

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

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

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

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

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

282
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
24.03.2025, 15:15
Студворк — интернет-сервис помощи студентам
Прошу прощения, но примеры interface_1 и Panel уже размещены в данной ветке Вот здесь
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
14.07.2025, 13:32
Как повернуть, обрезать, масштабировать или отразить изображение?

Вот четыре наиболее распространённых действия обрезка, переворот, поворот и изменение размера (будет ещё больше).

Вращать
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub imgRotate(inFile As String, outFile As String, degreesRotate As Long) '90, 180, 270
    Dim Img As Object, IP As Object
    Set Img = CreateObject("WIA.ImageFile") 'create WIA objects
    Set IP = CreateObject("WIA.ImageProcess")
    IP.Filters.Add IP.FilterInfos("RotateFlip").filterid 'setup filter
    IP.Filters(1).Properties("RotationAngle") = degreesRotate
    Img.LoadFile inFile 'load image
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save new image
End Sub
Перевернуть
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub imgFlip(inFile As String, outFile As String, Optional Horizontal As Boolean = True)
    Dim Img As Object, IP As Object
    Set Img = CreateObject("WIA.ImageFile") 'create WIA objects
    Set IP = CreateObject("WIA.ImageProcess")
    IP.Filters.Add IP.FilterInfos("RotateFlip").filterid 'setup filter
    IP.Filters(1).Properties("FlipHorizontal") = Horizontal
    IP.Filters(1).Properties("FlipVertical") = Not Horizontal
    Img.LoadFile inFile 'load image
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save new image
End Sub
Изменение размера
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub imgResize(inFile As String, outFile As String, Optional maxWidth As Long, Optional maxHeight As Long, Optional KeepAspect As Boolean = True)
'if KeepAspect = True then both maxWidth and maxHeight must be specified
    Dim Img As Object, IP As Object
    Set IP = CreateObject("WIA.ImageProcess") 'create WIA objects
    Set Img = CreateObject("WIA.ImageFile")
    Img.LoadFile inFile 'load image
    IP.Filters.Add IP.FilterInfos("Scale").filterid 'setup filter
    If maxWidth <> 0 Then IP.Filters(1).Properties("MaximumWidth") = maxWidth
    If maxHeight <> 0 Then IP.Filters(1).Properties("MaximumHeight") = maxHeight
    IP.Filters(1).Properties("PreserveAspectRatio") = KeepAspect
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save image
End Sub
Обрезка
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub imgCrop(inFile As String, outFile As String, left As Long, top As Long, right As Long, bottom As Long)
    Dim Img As Object, IP As Object
    Set IP = CreateObject("WIA.ImageProcess") 'create WIA objects
    Set Img = CreateObject("WIA.ImageFile")
    Img.LoadFile inFile 'load image
    IP.Filters.Add IP.FilterInfos("Crop").filterid 'setup filter
    With IP.Filters(1)
        .Properties("Left") = Img.Width \ 4
        .Properties("Top") = Img.Height \ 4
        .Properties("Right") = Img.Width \ 4
        .Properties("Bottom") = Img.Height \ 4
    End With
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save image
End Sub
Поддерживаемые форматы: JPG, PNG, BMP, GIF, TIFF

Взято тут

Подсказал АЕ

В примере реализовано поворот и отображение
Вложения
Тип файла: rar sd_dbFoto5_2k_RF.rar (182.2 Кб, 25 просмотров)
2
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
22.07.2025, 11:42
Размер графического файла

Продолжаю выкладывать примеры с графикой. Новая версия моего примера. Теперь добавлено вычисление размера файла в пикселях (не твипах).
Работает с форматами BMP, JPG, GIF, PNG.
Формат базы MDB. Проверялся в Access 2003 и Access 2019 (32 и 64 бит)

Файл тяжеловат. Много API. Можно упростить.

Часть кода позаимствовал здесь
Вложения
Тип файла: rar sd_dbFoto5_2k_RFS.rar (132.5 Кб, 29 просмотров)
1
Эксперт MS Access
 Аватар для Eugene-LS
13254 / 5933 / 1526
Регистрация: 05.10.2016
Сообщений: 16,598
30.07.2025, 06:48
Цитата Сообщение от Silur Посмотреть сообщение
Проверялся в Access 2003 и Access 2019 (32 и 64 бит)
Спасибо за шикарный пример!

На MSA 2024 x64 выдал ошибку компиляции:


Подправил по своему скромному разумению.
Вложения
Тип файла: zip sd_dbFoto5_2k_RFS_V02.zip (190.5 Кб, 18 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
31.07.2025, 14:22
Продолжаю выкладывать примеры работы с графикой.

Поскольку здесь главное - работа с графикой, то я убрал из примера всё, что связано с выбором картинки (открытие файла). Пример сразу полегчал. Исчезла куча вызовов API.

Вместо определения размера файла через API я воспользовался библиотекой Shell.ddl.
Для этого в референсах подключил Microsoft Shell Controls And Automation
Кроме того добавил определение размера файла изображения в байтах.
Вложения
Тип файла: rar sd_dbFoto5_2k_RFS_lite.rar (103.3 Кб, 20 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
01.08.2025, 12:31
Как запретить закрытие задачи (для VB и VBA) по Alt+F4

Иногда (а у меня довольно часто) бывает необходимо заставить пользователя правильно закрыть приложение: т.е. последовательно закрыть все открытые формы, а потом и само приложение специальной кнопкой (или пунктом меню) на которой весит команда DoCmd.Quit. Но некоторые пользователи имеют дурную привычку закрывать приложение при помощи крестика оконного меню (справа вверху). Или при помощи комбинации клавиш Alt+F4.
Как заблокировать кнопку закрытия окна Access можно прочитать в статье Disable кнопку закрытия окна MsAccess. А вот с блокировкой закрытия Access через Alt+F4 пришлось немного повозиться. Поиск в Интернете привел меня на сайт VB Forums . Здесь в топике Disable ALT-F4 пользователь под ником Lord Orvell предложил код для блокировки сочетаний клавиш Ctrl+Esc, Alt+Tab, Alt+Esc для программ на VB.
Lord Orvell писал:
well, here's some code for vb6. You didn't specify your vb but here you go. It's disables alt-esc and then windows key. You can see how it works though and use it to block ANY key. Basically you reroute all keypresses through the sub in the module and prevent ones you don't like from getting back to the OS.
Вот этот код.
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
Private Const WH_KEYBOARD_LL = 13&     'enables monitoring of keyboard
                                       'input events about to be posted
                                       'in a thread input queue
                                       
Private Const HC_ACTION = 0&           'wParam and lParam parameters
                                       'contain information about a
                                       'keyboard message
 
Private Const LLKHF_EXTENDED = &H1&    'test the extended-key flag
Private Const LLKHF_INJECTED = &H10&   'test the event-injected flag
Private Const LLKHF_ALTDOWN = &H20&    'test the context code
Private Const LLKHF_UP = &H80&         'test the transition-state flag
 
Private Const VK_TAB = &H9             'virtual key constants
Private Const VK_CONTROL = &H11
Private Const VK_ESCAPE = &H1B
 
Private Type KBDLLHOOKSTRUCT
  vkCode As Long        'a virtual-key code in the range 1 to 254
  scanCode As Long      'hardware scan code for the key
  flags As Long         'specifies the extended-key flag,
                        'event-injected flag, context code,
                        'and transition-state flag
  time As Long          'time stamp for this message
  dwExtraInfo As Long   'extra info associated with the message
End Type
 
Private Declare Function SetWindowsHookEx Lib "user32" _
   Alias "SetWindowsHookExA" _
  (ByVal idHook As Long, _
   ByVal lpfn As Long, _
   ByVal hmod As Long, _
   ByVal dwThreadId As Long) As Long
   
Private Declare Function UnhookWindowsHookEx Lib "user32" _
  (ByVal hHook As Long) As Long
 
Private Declare Function CallNextHookEx Lib "user32" _
  (ByVal hHook As Long, _
   ByVal nCode As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long
   
Private Declare Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" _
  (pDest As Any, _
   pSource As Any, _
   ByVal cb As Long)
 
Private Declare Function GetAsyncKeyState Lib "user32" _
   (ByVal vKey As Long) As Integer
 
Private m_hDllKbdHook As Long  'private variable holding
                               'the handle to the hook procedure
 
'---------------------------------------------------------------------------------------
' Procedure : Main
' Author    : Lord Orvell
'---------------------------------------------------------------------------------------
'
Public Sub Main()
 
  'set and obtain the handle to the keyboard hook
   m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
                                   AddressOf LowLevelKeyboardProc, _
                                   App.hInstance, _
                                   0&)
  
  If m_hDllKbdHook <> 0 Then
  
     'It's hooked! Show a messagebox
     'to temporarily suspend the app here
     '(the LowLevelKeyboardProc will continue
     'to process messages), and follow the
     'messagebox, for this demo, with the
     'unhook call. See the text above for
     'specific information.
      MsgBox "Ctrl+Esc, Alt+Tab and Alt+Esc are blocked. " & _
             "Click OK to quit and re-enable the keys.", _
             vbOKOnly Or vbInformation, _
             "Keyboard Hook Active"
     
     'Placement for this demo only.
     'Move to the unload event of the
     'main form when used in an application.
      Call UnhookWindowsHookEx(m_hDllKbdHook)
      
   Else
      
      MsgBox "Failed to install low-level keyboard hook - " & Err.LastDllError
 
  End If
  
End Sub
 
 
'---------------------------------------------------------------------------------------
' Procedure : LowLevelKeyboardProc
' Author    : Lord Orvell
'---------------------------------------------------------------------------------------
'
Public Function LowLevelKeyboardProc(ByVal nCode As Long, _
                                     ByVal wParam As Long, _
                                     ByVal lParam As Long) As Long
 
  'Application-defined callback function
  'used with the SetWindowsHookEx function.
  'The system calls this function every
  'time a new keyboard input event is about
  'to be posted into a thread input queue.
  'The keyboard input can come from the local
  'keyboard driver or from calls to the
  'keybd_event function. If the input comes
  'from a call to keybd_event, the input
  'was "injected".
 
   Static kbdllhs As KBDLLHOOKSTRUCT
  
  'If nCode is less than zero, the hook
  'procedure must return the value returned
  'by CallNextHookEx.
  '
  'If nCode is greater than or equal to zero,
  'and the hook procedure did not process the
  'message, it is highly recommended that you
  'call CallNextHookEx and return the value it
  'returns; otherwise, other applications that
  'have installed WH_KEYBOARD_LL hooks will not
  'receive hook notifications and may behave
  'incorrectly as a result.
  '
  'If the hook procedure processed the message,
  'it may return a nonzero value to prevent the
  'system from passing the message to the rest
  'of the hook chain or the target window procedure.
    
   
   If nCode = HC_ACTION Then
   
     'nCode specifies a code the hook
     'procedure uses to determine how
     'to process the message. HC_ACTION
     'is the only valid code.
     
     'On receipt of the HC_ACTION code,
     'wParam and lParam contain information
     'about a keyboard message, and lParam
     'holds the pointer to a KBDLLHOOKSTRUCT
     'structure.
      Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))
 
     'Ctrl+Esc --------------
      If (kbdllhs.vkCode = VK_ESCAPE) And _
          CBool(GetAsyncKeyState(VK_CONTROL) _
          And &H8000) Then
        Debug.Print "Ctrl+Esc blocked"
        LowLevelKeyboardProc = 1
        Exit Function
      End If  'kbdllhs.vkCode = VK_ESCAPE
        
     'Alt+Tab --------------
      If (kbdllhs.vkCode = VK_TAB) And _
          CBool(kbdllhs.flags And _
          LLKHF_ALTDOWN) Then
        Debug.Print "Alt+Tab blocked"
        LowLevelKeyboardProc = 1
        Exit Function
      End If  'kbdllhs.vkCode = VK_TAB
    
     'Alt+Esc --------------
      If (kbdllhs.vkCode = VK_ESCAPE) And _
          CBool(kbdllhs.flags And _
          LLKHF_ALTDOWN) Then
        Debug.Print "Alt+Esc blocked"
        LowLevelKeyboardProc = 1
        Exit Function
      End If  'kbdllhs.vkCode = VK_ESCAPE
   End If  'nCode = HC_ACTION
  
  LowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, _
                                        nCode, _
                                        wParam, _
                                        lParam)
  
End Function
Бенедикт с сайта SQL.RU доработал предложенный код для использования его в программах Access VBA. Для работы требуется ОС Windows NT4 с SP 3 и выше.

Продолжение следует
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
01.08.2025, 12:38
Продолжение

aka Бенедикт с сайта SQL.RU доработал предложенный код для использования его в программах Access VBA. Для работы требуется ОС Windows NT4 с SP 3 и выше.
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
Option Compare Database
Option Explicit
 
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
   ByVal hWnd As Long, lpdwProcessId As Any) As Long
 
Private Declare Function GetModuleHandle Lib "kernel32" _
   Alias "GetModuleHandleA" ( _
   ByVal lpModuleName As String) As Long
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   pDest As Any, pSource As Any, ByVal cb As Long)
 
Private Const WH_KEYBOARD_LL = 13&     'enables monitoring of keyboard
                                       'input events about to be posted
                                       'in a thread input queue
 
Private Const HC_ACTION = 0&           'wParam and lParam parameters
                                       'contain information about a
                                       'keyboard message
 
Private Type KBDLLHOOKSTRUCT
   vkCode As Long        'a virtual-key code in the range 1 to 254
   scanCode As Long      'hardware scan code for the key
   flags As Long         'specifies the extended-key flag,
                         'event-injected flag, context code,
                         'and transition-state flag
   time As Long          'time stamp for this message
   dwExtraInfo As Long   'extra info associated with the message
End Type
 
Private Const LLKHF_ALTDOWN = &H20&    'test the context code
 
Private Declare Function SetWindowsHookEx Lib "user32" _
   Alias "SetWindowsHookExA" ( _
   ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _
   ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
   ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" ( _
   ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, _
   ByVal lParam As Long) As Long
 
Private m_hLLKbdHook As Long  'private variable holding
                              'the handle to the hook procedure
Private m_AccAppProcessId As Long
 
'----------------------------------------------------------------------------
' Procedure : BlockAltF4
' DateTime  : 12.03.2008
' Author    : Бенедикт
' Purpose   : Блокировка сочетания клавишь Alt+F4
'----------------------------------------------------------------------------
'
Public Sub BlockAltF4()
 If m_hLLKbdHook Then
    Debug.Print "Low level keyboard hook already installed!"
    Exit Sub
 End If
 
 GetWindowThreadProcessId Application.hWndAccessApp, m_AccAppProcessId
 
 'set and obtain the handle to the keyboard hook
 m_hLLKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
                                 AddressOf LowLevelKeyboardProc, _
                                 GetModuleHandle(vbNullString), _
                                 0&)
 If m_hLLKbdHook Then
    Debug.Print "Alt+F4 blocked."
 Else
    MsgBox "Failed to install low-level keyboard hook - " & Err.LastDllError
 End If
End Sub
 
'----------------------------------------------------------------------------' Procedure : UnblockAltF4
' DateTime  : 12.03.2008
' Author    : Бенедикт
' Purpose   : Разблокировка сочетания клавишь Alt+F4
'----------------------------------------------------------------------------
'
Public Sub UnblockAltF4()
 If m_hLLKbdHook Then
    UnhookWindowsHookEx m_hLLKbdHook
    m_hLLKbdHook = 0
    Debug.Print "Alt+F4 unblocked."
 End If
End Sub
 
'----------------------------------------------------------------------------
'
Public Function LowLevelKeyboardProc(ByVal nCode As Long, _
                                     ByVal wParam As Long, _
                                     ByVal lParam As Long) As Long
 'Application-defined callback function
 'used with the SetWindowsHookEx function.
 'The system calls this function every
 'time a new keyboard input event is about
 'to be posted into a thread input queue.
 'The keyboard input can come from the local
 'keyboard driver or from calls to the
 'keybd_event function. If the input comes
 'from a call to keybd_event, the input
 'was "injected".
 Debug.Print "LowLevelKeyboardProc", nCode, wParam, Hex$(lParam)
 
 Dim kbdllhs As KBDLLHOOKSTRUCT
 
 'If nCode is less than zero, the hook
 'procedure must return the value returned
 'by CallNextHookEx.
 '
 'If nCode is greater than or equal to zero,
 'and the hook procedure did not process the
 'message, it is highly recommended that you
 'call CallNextHookEx and return the value it
 'returns; otherwise, other applications that
 'have installed WH_KEYBOARD_LL hooks will not
 'receive hook notifications and may behave
 'incorrectly as a result.
 '
 'If the hook procedure processed the message,
 'it may return a nonzero value to prevent the
 'system from passing the message to the rest
 'of the hook chain or the target window procedure.
 
 If nCode = HC_ACTION Then
 
    'nCode specifies a code the hook
    'procedure uses to determine how
    'to process the message. HC_ACTION
    'is the only valid code.
 
    'On receipt of the HC_ACTION code,
    'wParam and lParam contain information
    'about a keyboard message, and lParam
    'holds the pointer to a KBDLLHOOKSTRUCT
    'structure.
     CopyMemory kbdllhs, ByVal lParam, Len(kbdllhs)
 
     'Alt+F4 --------------
     If (kbdllhs.vkCode = vbKeyF4) And (kbdllhs.flags And LLKHF_ALTDOWN) Then
        Dim ForeProcessId As Long
        GetWindowThreadProcessId GetForegroundWindow, ForeProcessId
 
        If m_AccAppProcessId = ForeProcessId Then
           Debug.Print "Alt+F4 blocked."
           LowLevelKeyboardProc = 1
           Exit Function
        End If
     End If  'kbdllhs.vkCode = VK_F4
  End If  'nCode = HC_ACTION
 
 LowLevelKeyboardProc = CallNextHookEx(m_hLLKbdHook, nCode, wParam, lParam)
End Function
Бенедикт писал:
комментарий, почему низкоуровневый клавиатурный хук, а не обычный

Для отлова клавиатурных комбинаций в своём приложении более логичным и традиционным (совместимым) было бы использование функции SetWindowsHookEx с первым параметром, равным WH_KEYBOARD, а не WH_KEYBOARD_LL. Зачем, казалось бы, организовывать глобальный перехват и распозновать, в своём ли процессе произошло некое событие, когда можно организовать перехват в своём процессе? Ан нет. Выяснилось, что Access использует цикл обработки сообщений (message loop) с вызовом функции PeekMessage с флагом PM_NOREMOVE. Таким образом, пока сообщение (WM_KEYDOWN) не будет извлечено из очереди сообщений, на каждой итерации цикла обработки сообщений будет вызываться процедура-хук. Производительности VBA-шной процедуры в этом случае, видимо, недостаточно, Access просто "тонет", загрузка процессора 100%. Аналогичное поведение можно увидеть при сабклассинге некоторых Access-овских окон. Поэтому приходится искать альтернативные
пути.


В качестве приложения пример блокировки крестика закрытия окна Access
Вложения
Тип файла: rar sd_DisableApp.rar (33.0 Кб, 11 просмотров)
2
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
12.08.2025, 11:41
Альтернатива использования типа поля "Вложение" в базах данных
---------------------------------------------------------------------------------------
Почему не стоит использовать тип данных «Вложение» в Microsoft Access
Тип данных "Вложение", появившийся в Access 2007, позволяет пользователям вставлять файлы непосредственно в базы данных. Однако у этой функции есть существенные недостатки:

Раздувание базы данных
Использование полей для вложений приводит к быстрому увеличению размера базы данных. Каждый прикреплённый файл увеличивает размер базы данных на весь свой объём, и небольшая база данных быстро превращается в большую.

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

Сложное Взаимодействие
Для программного управления полями "Вложения" требуется специальный код, что затрудняет вставку, извлечение и обработку вложенных файлов.

Альтернатива
--------------------------
Вместо использования полей для вложений рекомендуется хранить пути к файлам и их имена (включая расширения) в базе данных. Такой подход:

- Уменьшает размер базы данных
- Поддерживает более высокую производительность
- Упрощает управление файлами и доступ к ним
- Обеспечение совместимости со старыми системами

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

Можно использовать два подхода
- просто записывать в базу местоположение выбранного файла
- копировать файлы в определённую папку, возможно общего доступа

Пример

Демонстрационная версия использует два тесно связанных подхода и включает все необходимые компоненты для написания кода (такие как выбор файлов, открытие файлов, удаление файлов и т. д.). Вы можете свободно изучать её и изменять в соответствии со своими требованиями.

Пример выполнен в формате accdb

Взято тут

И ещё раз. Не используйте поля типа "Вложение" в своих базах! Их можно использовать, если вам нужно сохранить всего пару вложений, например логотипы и т. д
Вложения
Тип файла: zip HowToHandleAttachments_Demo.zip (88.5 Кб, 22 просмотров)
Тип файла: rar HowToHandleAttachments_Demo_rus.rar (61.6 Кб, 29 просмотров)
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
12.08.2025, 12:25
Для любопытных Поле типа Вложение (Attachment). Описание и использование
Здесь описано, что такое поле Вложение и как с ним работать.
Возможно позже я помещу эту статью в топик Написание статей. Там ей наверное самое место.
Можно глянуть сюда
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
13.08.2025, 16:39
Продолжаю выкладывать примеры работы с графикой.

Добавил преобразование форматов рисунков BMP, JPEG, GIF, TIFF, PNG.
Вложения
Тип файла: rar sd_dbFoto5_2k_RFSC.rar (174.7 Кб, 18 просмотров)
2
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
15.08.2025, 08:49
Вроде последнее действие над изображениями - масштабирование (изменение размеров)

Примечание.
Хочу сказать, что для операций с графикой, таких, как масштабирование и конвертация, если Вы хотите получить качественное изображение лучше пользоваться графическими редакторами. Там больше настроек и методов конвертации и масштабирования. Но для большинства задач подходят и эти.
Вложения
Тип файла: rar sd_dbFoto5_2k_RFSCR.rar (172.2 Кб, 10 просмотров)
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
26.08.2025, 09:40
ZoomBox

Бывает так, что есть текстовое поле, содержимое которого может варьироваться в широких пределах. От одного слова до нескольких предложений. На форме размещать большое поле может быть некрасиво, да и иногда нет под это места. Полосы прокрутки не всегда спасают. Лично я давно разработал специальную форму, состоящую из большого текстового поля и пары кнопок (""Принять" и "Отменить"), куда и вывожу содержание выбранного поля. Вызвать его можно или специальной кнопкой, расположенной рядом с полем, или дважды щёлкнув мышью на нужное поле. Выбор за разработчиком. И вот гуляя по интернету нашел похожий образец. Где взял - не помню. Автор кода - Terry Kreft, модифицирован Stephen Lebans. В отличии от моего решения, для выводимой информации можно выбрать фонт, размер и цвет. Рекомендую.

Примечание.
Необходимо подключить библиотеку Microsoft Scripting Runtime
Вложения
Тип файла: rar ZoomBoxTest.rar (44.4 Кб, 21 просмотров)
0
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,300
27.08.2025, 04:30
Цитата Сообщение от Silur Посмотреть сообщение
ZoomBox
штатный вызывается Shift+F2. Такой же, локализованный.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
27.08.2025, 09:58
Цитата Сообщение от Панург Посмотреть сообщение
штатный вызывается Shift+F2. Такой же, локализованный.
Век живи - век учись, всё равно ...
0
788 / 67 / 4
Регистрация: 28.05.2015
Сообщений: 114
27.08.2025, 13:25
Если бы при сокрытии окна Access
можно было бы управлять расположением штатного окна области ввода,
то в таком нештатном не было бы необходимости.
0
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,300
27.08.2025, 17:59
Цитата Сообщение от UUMprimor Посмотреть сообщение
Если бы при сокрытии окна Access
можно было бы управлять расположением штатного окна области ввода,
то в таком нештатном не было бы необходимости.
в этом случае всё не очень штатное... не показатель
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
29.08.2025, 13:38
Дополнение к посту Как запретить закрытие задачи (для VB и VBA) по Alt+F4 здесь

С сайта Андрея Митина от одного из пользователей
Порывшись на форуме и поспрашивавши у форумчан на MSAccess 2016 Я отключил комбинации клавиш так: в событиях формы включил "перехват нажатия клавиш" и в "кнопка вниз" написал.
Visual Basic
1
2
3
4
5
6
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   If KeyCode = vbKeyF4 And Shift = acAltMask Then KeyCode = 0 'отключить Alt+F4
   If KeyCode = vbKeyF4 And Shift = acShiftMask Then KeyCode = 0 'отключить Shift+F4
   If KeyCode = vbKeyF4 And Shift = acCtrlMask Then KeyCode = 0 'отключить Ctrl+F4
   If KeyCode = vbKeyW And Shift = acCtrlMask Then KeyCode = 0 'отключить Ctrl+W
End Sub
Только включать этот код надо в каждую форму
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
01.09.2025, 12:17
Модуль класса VBA для работы с изображениями WIA

Классовые модули предоставляют широкие возможности.

В приложении представлен модуль класса, создан на основе различных функций WIA.

Пример(ы) использования
На первый взгляд модули могут показаться сложными, но они упрощают процесс написания кода.

Получение некоторой информации об Изображении
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
    Dim cWIA                  As New cls_WIA
 
    With cWIA
        .InputFile = "C:\Temp\Landscape_3.jpg"
 
        ' Access the WIA objects and filters count
        With .ImageFile
            Debug.Print .Width
            Debug.Print .Height
            Debug.Print .HorizontalResolution
            Debug.Print .VerticalResolution
            Debug.Print .IsAnimated
            Debug.Print .ActiveFrame
            Debug.Print .FrameCount
            Debug.Print .FileExtension
            Debug.Print .IsAlphaPixelFormat
            Debug.Print .PixelDepth
            Debug.Print .FormatID
            Debug.Print .IsExtendedPixelFormat
            Debug.Print .IsIndexedPixelFormat
        End With
 
        .Clear
    End With
 
    Set cWIA = Nothing
Поворот изображения

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Dim cWIA              As New cls_WIA
 
    With cWIA
        .InputFile = "C:\Temp\Landscape_3.jpg"
        .OutputFile = "C:\Temp\Landscape_3_rotated.jpg"
 
        .Rotate 180
        .ApplyFilters
 
        .Save
        .Clear
    End With
    
    Set cWIA = Nothing
Конвертируйте изображение из JPG в BMP

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Dim cWIA                  As New cls_WIA
 
    With cWIA
        .InputFile = "C:\Temp\Landscape_3.jpg"
        .OutputFile = "C:\Temp\Landscape_3.bmp"
 
        .ConvertImage wiaFormatBMP
        .ApplyFilters
 
        .Save
        .Clear
    End With
 
    Set cWIA = Nothing
Автоповорот, изменение размера и преобразование изображения

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Dim cWIA                  As New cls_WIA
 
    With cWIA
        .InputFile = "C:\Temp\Landscape_3.jpg"
        .OutputFile = "C:\Users\Dev\Desktop\MyPic.png"
 
        .AutoOrient
        .Resize 300, 300, True
        .ConvertImage wiaFormatPNG
        .ApplyFilters
 
        .Save
        .Clear
    End With
 
    Set cWIA = Nothing
Отображение изменений
Одно из главных преимуществ WIA заключается в том, что вы можете вносить изменения в базовое изображение и отображать результат без необходимости сохранять файл на диск.

Если у вас есть элемент управления Image, вы можете сделать что-то вроде этого:
Visual Basic
1
Me.ImageControlName.PictureData = .GetBinaryData
Итак, в качестве полного примера, взяв за основу предыдущий пример, мы можем сделать следующее:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Dim cWIA                  As New cls_WIA
 
    With cWIA
        .InputFile = "C:\Temp\Landscape_3.jpg"
        .OutputFile = "C:\Users\Dev\Desktop\MyPic.png"
 
        .AutoOrient
        .Resize 300, 300, True
        .ConvertImage wiaFormatPNG
        .ApplyFilters
 
        Me.ImageControlName.PictureData = .GetBinaryData
    End With
 
    Set cWIA = Nothing
Затем надо бы добавить отдельную кнопку для сохранения результатов, но только тогда, когда пользователь будет готов сохранить данные навсегда.

Порядок имеет значение
При выполнении операций с изображениями важно помнить, что порядок операций может повлиять на конечный результат.

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

Заключение
Вот и всё, что нужно знать о манипуляциях с изображениями!

Одно из главных преимуществ WIA заключается в том, что вы можете выполнять все манипуляции в памяти, даже отображать/просматривать результаты в элементе управления изображением, без необходимости постоянно сохранять изменения на жёстком диске, что исключает бесполезные операции ввода-вывода. Таким образом, вы выполняете операцию .Save только тогда, когда вас устраивают результаты.

WIA встроен в Windows, поэтому его не нужно устанавливать. Он не зависит от разрядности, поэтому вам не нужно беспокоиться о 32- или 64-разрядной установке. Он работает во всех приложениях VBA (Access, Excel, Word, Outlook и т. д.).

Взято тут
Вложения
Тип файла: rar cls_WIA.rar (4.8 Кб, 4 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
01.09.2025, 14:07
Дополнение к посту ZoomBox

Код для ZoomBox взят тут автор статьи Том ван Стифут

отрывок из статьи
Системный зум-бокс оставляет желать лучшего. Среди проблем можно выделить следующие:

- Текст в ZoomBox выделен, из-за чего его трудно читать.
- Шрифт текста очень мелкий.
- Вы можете изменить размер шрифта, но Access забывает об этом, когда вы закрываете приложение.
- Размер формы нельзя изменить, поэтому её неудобно использовать для больших объёмов текста.
- ZoomBox не поддерживает форматированный текст.

Улучшенная версия устраняет все перечисленные выше ограничения


.....

Как организовать вызов ZoomBox с новым кодом? Всё начинается с макроса AutoKeys. Это специальный макрос, который должен иметь такое название. Access использует его для поиска специальных сочетаний клавиш. +{F2} обозначает сочетание клавиш Shift+F2, после чего макрос открывает frmZoom.

Пример AutoKeys можно глянуть в приложении
Вложения
Тип файла: rar ZoomBoxTest_V0.2.rar (44.8 Кб, 9 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
02.09.2025, 09:29
Изменение размера и/или преобразование форматов изображений с помощью GDI+ API

Ещё немного о работе с графикой.

Windows GDI+ — это API на основе классов для программистов C/C++. Это позволяет приложениям использовать графический и форматированный текст как на дисплее видео, так и на принтере. Приложения на основе API Microsoft Win32 напрямую не обращаются к графическому оборудованию. Вместо этого GDI+ взаимодействует с драйверами устройств от имени приложений. GDI+ также поддерживается Microsoft Win64.

Если кто-то захочет использовать GDI+ для изменения размера/масштабирования изображений и/или изменения формата файла изображения, то может использовать следующий код (смотри приложение GDIplus):

Лично я считаю, что WIA намного проще, но GDI+ позволяет делать гораздо больше, чем просто масштабировать и менять формат изображения. Так что всё зависит от ваших потребностей, но, по крайней мере, теперь у вас есть выбор!

Также обратите внимание, что GDI+ поддерживает вывод изображений только в следующих форматах:

BMP
GIF
JPG
PNG
TIFF

Взято Resizing and/or Converting Image Formats Using GDI+ API

Примечание
Если размер поста более 15000 знаков, то пост не сохраняется и приходится его делить или часть кода помещать в приложения
Вложения
Тип файла: rar GDIplus.rar (3.2 Кб, 11 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.09.2025, 09:29

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
280
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru