Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72

Обработка ошибок на этапе запуска программы

26.02.2024, 11:31. Показов 1187. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги-программисты.
Уткнулся в проблемку, не знаю как решить. Надеюсь на ваши подсказки.

Собрал я программку с компонентами, которые далеко не на всех компах с Windows7 установлены в системе по-умолчанию.
Понятное дело - батник, запущенный через правый клик от имени администратора решает проблему...
Однако не всякий юзер на такое способен или тем более читает мои инструкции, приложенные к программе.
Но вот когда у него при запуске моей проги вылазит окошко с красным крестиком и текстом на импортном типа: "Control COMDLG32.OCX does not installed.... бла бла бла..." он начинает мне выносить мозг. И он такой не один.
Я хотел бы сделать программу юзер-френдли. Чтобы при отсутствии в системе необходимых контролов она на человеческом языке сообщала об этом и предлагала нажатием ОК их сразу установить.

Да вот только проверка наличия этих контролов происходит раньше, чем обрабатывается сам код обработки условия/ошибки из Form_Load() или Form_Initialize().

Может запихать код обработки в модуль? Это даст что-нибудь? Модули грузятся раньше формы? Или это бестолку?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2024, 11:31
Ответы с готовыми решениями:

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: <route url="Home/{par1}/{par2}" controller="Home"...

Подключение MODF - 1427 ошибок на этапе сборки
Добрый день! В папке с проектом лежит папка FMOD в ней lib,inc и fmodex.dll qt 5.2.0, minGW g++, windows, тоесть мне нужна библиотка...

Выявление ошибок на этапе написания исходного кода
Если в IDE пишешь какой-то абсурдный код, то она тебе подчеркивает место, где ошибка, например как в строке int = "String"; ...

20
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
26.02.2024, 11:55
MrRoxMJ, здравствуйте
Вообще не понимаю проблемы. Проверяйте библиотеки на наличие — при запуске Excel и всё.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
27.02.2024, 10:30  [ТС]
Цитата Сообщение от Jack Famous Посмотреть сообщение
... при запуске Excel и всё ...
Это не VBA. Эксель вообще ни при чём. Здесь немного про другое - самостоятельная приложуха на VB6.

код типа такой:
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
'запуск reg-dll от админа
Private Const BCM_SETSHIELD As Long = &H160C&
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function ShellExecute Lib "shell32" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
 
'путь папки system32
 Private Const MAX_PATH = 512
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public Function GetSystemPath()
Dim strFolder As String
Dim lngResult As Long
strFolder = String(MAX_PATH, 0)
lngResult = GetSystemDirectory(strFolder, MAX_PATH)
If lngResult <> 0 Then
    GetSystemPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)
Else
    GetSystemPath = ""
End If
End Function
 
 
 
Private Sub Form_initialize()
On Error Resume Next
Exit Sub
 
Resume Next
If Dir(GetSystemPath & "\MSFLXGRD.OCX") = "" or _
    Dir(GetSystemPath & "\COMDLG32.OCX") = "" or _
    Dir(GetSystemPath & "\INKED.DLL") = "" Then
ss = MsgBox("Для работы программы требуются элементы, сейчас отсутствующие в операционной системе компьютера." & vbCrLf & "Установить недостающие элементы?", 20, "В системе отсутствуют необходимые компоненты.")
If ss = 6 Then
    ShellExecute hWnd, "runas", "reg-dll.bat", "", CurDir$(), vbNormalFocus
Else
    End
End If
End If
 
End Sub
Только до выполнения кода дело не доходит - при запуске прога ищет в системе нужные ей контролы и вылезает соотвествующий меседжбокс.
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
27.02.2024, 11:29
Лучший ответ Сообщение было отмечено MrRoxMJ как решение

Решение

Цитата Сообщение от MrRoxMJ Посмотреть сообщение
Может запихать код обработки в модуль? Это даст что-нибудь? Модули грузятся раньше формы? Или это бестолку?
В настройках проекта можно выбрать процедуру Main в качестве стартовой загрузки. В таком случае сначала будет выполнятся процедура Main из стандартного модуля, а уже из нее можно запустить форму
3
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
27.02.2024, 11:43
Можно просто сделать SxS-Reg-Free манифест через специальную утилиту и просто положить все OCX/DLL в папку с программой. А вообще testuser2 правильно написал - если хотите регистрировать, регистрируйте в Main, до создания форм и внешних ActiveX объектов. Чтобы зарегистрировать необязательно создавать bat файл. Достаточно либо запустить через Shell "regsvr32" либо напрямую подгрузить DLL и вызвать DllRegisterServer. Нужно учесть что для регистрации нужны права админа, поэтому в утилиту нужно будет добавить манифест соответствующий, либо сделать ключи запуска через runas.
1
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
27.02.2024, 16:08  [ТС]
наверно я чёта не так делаю...

Перенёс весь "стартовый код" в модуль Module1.
В качестве Startup object в свойствах проекта указал Sub Main.
В модуле создал:
Visual Basic
1
2
3
4
5
6
7
8
Private Sub Main()
 
'где после обработчика на отсутствие в системной папке контролов, добавлены строчки:
 
Load Form1
Form1.Show
 
End Sub
Стартую проет - и ничего не происходит(
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
28.02.2024, 12:22  [ТС]
Разобрался, там был мой косяк в коде. Исправил, и... УРА! Заработало!
Кстати, я так понял, можно просто писать Sub Main(), без слова Private.
testuser2, спасибо.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.03.2024, 21:25
Но самым лучшим вариантом это будет отказ от зависимостей. COMDLG32.OCX это прошлый век.

Добавлено через 10 минут
Или если лень переписывать программу на более правильный код, без зависимостей, то можно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Private Sub Main()
    On Error Resume Next
    
    Form1.Show ' Здесь мы будем игнорировать все ошибки
    
    If Err.Number > 0 Then
        MsgBox "Ошибка DLL или OCX не найден!"
    End If
End Sub
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
02.03.2024, 18:50  [ТС]
Именно - отказ от зависимостей. Я всегда стараюсь делать свои программы так, чтобы пользователю не приходилось ничего дополнительно устанавливать. Этакая "stand-alone portable".
Казалось бы - стандартное (майкрософтовское) диалоговое окошко для выбора папки при открытии/сохранении файла или распечатке. Эта функция есть в каждой винде. Однако при запуске проги на Windows 7 оно требует зарегистрировать компонент.

Я пробовал пересобрать программу на более современной платформе - VB.Net. Специально для этого выбрал не из самых последних, а VisualStudio 10, как наиболее "совместимую" с Win7. Но там вскрылась другая проблемка - ущербные программисты майкрософта вместо того чтобы довести до ума OLE объект, его просто исключили. А у меня в программе для вывода диаграмм используется OLE. Ну окей, вместо OLE пересобрал на основе контрола MS Charts. В целом и внешне программка на .Net платформе выглядит симпатичней. ...Да вот только для запуска её на Win7 нужно установить пакет обновлений NetFramework4 (это по причине MSCharts).
Я понимаю, мы живём современном мире где уже рулит Win10, и на Семёрке пакеты типа NetFramework4 или Офис (если мы выводим диаграммы и экспортируем их в эксель) - это маст-хэвные вещи. Однако если уж мы говорим за то, чтобы у программы не было зависимостей... Я решил, что в данной ситуации уж лучше пользователю просто прогнать regsvr понажимав три раза на Ok, чем устанавливать целый пакет обновлений на сотню мегабайт с перезагрузкой компа.

Ну не могут блин рукожопы из майкрософта собрать нормальный компилятор, на котором можно было бы делать программы универсальные как для Win10, так и для Win7, или чтобы все необходимые библиотеки зашивались прямо в тело экзешника. Либо контролы без поддержки уникода, либо ОЛЕ удалили, либо.... Короче постоянные танцы с бубном.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
02.03.2024, 23:21
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
мы живём современном мире где уже рулит Win10
Я на семёрке, на десятку даже не собираюсь переходить

Добавлено через 1 минуту
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
Ну не могут блин рукожопы из майкрософта собрать нормальный компилятор
А ты не думал, что рукожопами могут быть и программисты, которые не умеют правильно программировать, чтобы программа работала на всех виндах))))

Добавлено через 40 секунд
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
чтобы все необходимые библиотеки зашивались прямо в тело экзешника
Если так хочешь зашей сам в ресурсы, кто тебе мешает?

Добавлено через 1 минуту
Я уже говорил об этом тысячу раз, что COMDLG32.OCX для диалоговых окон использовать не надо. Вместо этого нужно использовать обычные API.

Добавлено через 4 минуты
Есть же простые API, например GetOpenFileName Lib "comdlg32.dll"
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
02.03.2024, 23:22
Вот посмотри пример-проект для диалоговых окон, без единой зависимости. А сам файл comdlg32.dll есть в поставке любой версии Windows, в отличии от файла COMDLG32.OCX...

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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
'This project needs 6 command buttons
Option Explicit
Const FW_NORMAL = 400
Const DEFAULT_CHARSET = 1
Const OUT_DEFAULT_PRECIS = 0
Const CLIP_DEFAULT_PRECIS = 0
Const DEFAULT_QUALITY = 0
Const DEFAULT_PITCH = 0
Const FF_ROMAN = 16
Const CF_PRINTERFONTS = &H2
Const CF_SCREENFONTS = &H1
Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS)
Const CF_EFFECTS = &H100&
Const CF_FORCEFONTEXIST = &H10000
Const CF_INITTOLOGFONTSTRUCT = &H40&
Const CF_LIMITSIZE = &H2000&
Const REGULAR_FONTTYPE = &H400
Const LF_FACESIZE = 32
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32
Const GMEM_MOVEABLE = &H2
Const GMEM_ZEROINIT = &H40
Const DM_DUPLEX = &H1000&
Const DM_ORIENTATION = &H1&
Const PD_PRINTSETUP = &H40
Const PD_DISABLEPRINTTOFILE = &H80000
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Private Type PAGESETUPDLG
    lStructSize As Long
    hwndOwner As Long
    hDevMode As Long
    hDevNames As Long
    flags As Long
    ptPaperSize As POINTAPI
    rtMinMargin As RECT
    rtMargin As RECT
    hInstance As Long
    lCustData As Long
    lpfnPageSetupHook As Long
    lpfnPagePaintHook As Long
    lpPageSetupTemplateName As String
    hPageSetupTemplate As Long
End Type
Private Type CHOOSECOLOR
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    rgbResult As Long
    lpCustColors As String
    flags As Long
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Private Type LOGFONT
        lfHeight As Long
        lfWidth As Long
        lfEscapement As Long
        lfOrientation As Long
        lfWeight As Long
        lfItalic As Byte
        lfUnderline As Byte
        lfStrikeOut As Byte
        lfCharSet As Byte
        lfOutPrecision As Byte
        lfClipPrecision As Byte
        lfQuality As Byte
        lfPitchAndFamily As Byte
        lfFaceName As String * 31
End Type
Private Type CHOOSEFONT
        lStructSize As Long
        hwndOwner As Long          '  caller's window handle
        hDC As Long                '  printer DC/IC or NULL
        lpLogFont As Long          '  ptr. to a LOGFONT struct
        iPointSize As Long         '  10 * size in points of selected font
        flags As Long              '  enum. type flags
        rgbColors As Long          '  returned text color
        lCustData As Long          '  data passed to hook fn.
        lpfnHook As Long           '  ptr. to hook function
        lpTemplateName As String     '  custom template name
        hInstance As Long          '  instance handle of.EXE that
                                       '    contains cust. dlg. template
        lpszStyle As String          '  return the style field here
                                       '  must be LF_FACESIZE or bigger
        nFontType As Integer          '  same value reported to the EnumFonts
                                       '    call back with the extra FONTTYPE_
                                       '    bits added
        MISSING_ALIGNMENT As Integer
        nSizeMin As Long           '  minimum pt size allowed &
        nSizeMax As Long           '  max pt size allowed if
                                       '    CF_LIMITSIZE is used
End Type
Private Type PRINTDLG_TYPE
    lStructSize As Long
    hwndOwner As Long
    hDevMode As Long
    hDevNames As Long
    hDC As Long
    flags As Long
    nFromPage As Integer
    nToPage As Integer
    nMinPage As Integer
    nMaxPage As Integer
    nCopies As Integer
    hInstance As Long
    lCustData As Long
    lpfnPrintHook As Long
    lpfnSetupHook As Long
    lpPrintTemplateName As String
    lpSetupTemplateName As String
    hPrintTemplate As Long
    hSetupTemplate As Long
End Type
Private Type DEVNAMES_TYPE
    wDriverOffset As Integer
    wDeviceOffset As Integer
    wOutputOffset As Integer
    wDefault As Integer
    extra As String * 100
End Type
Private Type DEVMODE_TYPE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type
Private Declare Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function PrintDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long
Private Declare Function PAGESETUPDLG Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PAGESETUPDLG) As Long
Private Declare Function CHOOSEFONT Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Dim OFName As OPENFILENAME
Dim CustomColors() As Byte
Private Sub Command1_Click()
    Dim sFile As String
    sFile = ShowOpen
    If sFile <> "" Then
        MsgBox "You chose this file: " + sFile
    Else
        MsgBox "You pressed cancel"
    End If
End Sub
Private Sub Command2_Click()
    Dim sFile As String
    sFile = ShowSave
    If sFile <> "" Then
        MsgBox "You chose this file: " + sFile
    Else
        MsgBox "You pressed cancel"
    End If
End Sub
Private Sub Command3_Click()
    Dim NewColor As Long
    NewColor = ShowColor
    If NewColor <> -1 Then
        Me.BackColor = NewColor
    Else
        MsgBox "You chose cancel"
    End If
End Sub
Private Sub Command4_Click()
    MsgBox ShowFont
End Sub
Private Sub Command5_Click()
    ShowPrinter Me
End Sub
Private Sub Command6_Click()
    ShowPageSetupDlg
End Sub
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: [url]http://www.allapi.net/[/url]
    'E-Mail: [email]KPDTeam@Allapi.net[/email]
    'Redim the variables to store the cutstom colors
    ReDim CustomColors(0 To 16 * 4 - 1) As Byte
    Dim i As Integer
    For i = LBound(CustomColors) To UBound(CustomColors)
        CustomColors(i) = 0
    Next i
    'Set the captions
    Command1.Caption = "ShowOpen"
    Command2.Caption = "ShowSave"
    Command3.Caption = "ShowColor"
    Command4.Caption = "ShowFont"
    Command5.Caption = "ShowPrinter"
    Command6.Caption = "ShowPageSetupDlg"
End Sub
Private Function ShowColor() As Long
    Dim cc As CHOOSECOLOR
    Dim Custcolor(16) As Long
    Dim lReturn As Long
 
    'set the structure size
    cc.lStructSize = Len(cc)
    'Set the owner
    cc.hwndOwner = Me.hWnd
    'set the application's instance
    cc.hInstance = App.hInstance
    'set the custom colors (converted to Unicode)
    cc.lpCustColors = StrConv(CustomColors, vbUnicode)
    'no extra flags
    cc.flags = 0
 
    'Show the 'Select Color'-dialog
    If CHOOSECOLOR(cc) <> 0 Then
        ShowColor = cc.rgbResult
        CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
    Else
        ShowColor = -1
    End If
End Function
Private Function ShowOpen() As String
    'Set the structure size
    OFName.lStructSize = Len(OFName)
    'Set the owner window
    OFName.hwndOwner = Me.hWnd
    'Set the application's instance
    OFName.hInstance = App.hInstance
    'Set the filet
    OFName.lpstrFilter = "Text Files (*.txt)" + Chr$(0) + "*.txt" + Chr$(0) + "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0)
    'Create a buffer
    OFName.lpstrFile = Space$(254)
    'Set the maximum number of chars
    OFName.nMaxFile = 255
    'Create a buffer
    OFName.lpstrFileTitle = Space$(254)
    'Set the maximum number of chars
    OFName.nMaxFileTitle = 255
    'Set the initial directory
    OFName.lpstrInitialDir = "C:"
    'Set the dialog title
    OFName.lpstrTitle = "Open File - KPD-Team 1998"
    'no extra flags
    OFName.flags = 0
 
    'Show the 'Open File'-dialog
    If GetOpenFileName(OFName) Then
        ShowOpen = Trim$(OFName.lpstrFile)
    Else
        ShowOpen = ""
    End If
End Function
Private Function ShowFont() As String
    Dim cf As CHOOSEFONT, lfont As LOGFONT, hMem As Long, pMem As Long
    Dim fontname As String, retval As Long
    lfont.lfHeight = 0  ' determine default height
    lfont.lfWidth = 0  ' determine default width
    lfont.lfEscapement = 0  ' angle between baseline and escapement vector
    lfont.lfOrientation = 0  ' angle between baseline and orientation vector
    lfont.lfWeight = FW_NORMAL  ' normal weight i.e. not bold
    lfont.lfCharSet = DEFAULT_CHARSET  ' use default character set
    lfont.lfOutPrecision = OUT_DEFAULT_PRECIS  ' default precision mapping
    lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS  ' default clipping precision
    lfont.lfQuality = DEFAULT_QUALITY  ' default quality setting
    lfont.lfPitchAndFamily = DEFAULT_PITCH Or FF_ROMAN  ' default pitch, proportional with serifs
    lfont.lfFaceName = "Times New Roman" & vbNullChar  ' string must be null-terminated
    ' Create the memory block which will act as the LOGFONT structure buffer.
    hMem = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(lfont))
    pMem = GlobalLock(hMem)  ' lock and get pointer
    CopyMemory ByVal pMem, lfont, Len(lfont)  ' copy structure's contents into block
    ' Initialize dialog box: Screen and printer fonts, point size between 10 and 72.
    cf.lStructSize = Len(cf)  ' size of structure
    cf.hwndOwner = Form1.hWnd  ' window Form1 is opening this dialog box
    cf.hDC = Printer.hDC  ' device context of default printer (using VB's mechanism)
    cf.lpLogFont = pMem   ' pointer to LOGFONT memory block buffer
    cf.iPointSize = 120  ' 12 point font (in units of 1/10 point)
    cf.flags = CF_BOTH Or CF_EFFECTS Or CF_FORCEFONTEXIST Or CF_INITTOLOGFONTSTRUCT Or CF_LIMITSIZE
    cf.rgbColors = RGB(0, 0, 0)  ' black
    cf.nFontType = REGULAR_FONTTYPE  ' regular font type i.e. not bold or anything
    cf.nSizeMin = 10  ' minimum point size
    cf.nSizeMax = 72  ' maximum point size
    ' Now, call the function.  If successful, copy the LOGFONT structure back into the structure
    ' and then print out the attributes we mentioned earlier that the user selected.
    retval = CHOOSEFONT(cf)  ' open the dialog box
    If retval <> 0 Then  ' success
        CopyMemory lfont, ByVal pMem, Len(lfont)  ' copy memory back
        ' Now make the fixed-length string holding the font name into a "normal" string.
        ShowFont = Left(lfont.lfFaceName, InStr(lfont.lfFaceName, vbNullChar) - 1)
        Debug.Print  ' end the line
    End If
    ' Deallocate the memory block we created earlier.  Note that this must
    ' be done whether the function succeeded or not.
    retval = GlobalUnlock(hMem)  ' destroy pointer, unlock block
    retval = GlobalFree(hMem)  ' free the allocated memory
End Function
Private Function ShowSave() As String
    'Set the structure size
    OFName.lStructSize = Len(OFName)
    'Set the owner window
    OFName.hwndOwner = Me.hWnd
    'Set the application's instance
    OFName.hInstance = App.hInstance
    'Set the filet
    OFName.lpstrFilter = "Text Files (*.txt)" + Chr$(0) + "*.txt" + Chr$(0) + "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0)
    'Create a buffer
    OFName.lpstrFile = Space$(254)
    'Set the maximum number of chars
    OFName.nMaxFile = 255
    'Create a buffer
    OFName.lpstrFileTitle = Space$(254)
    'Set the maximum number of chars
    OFName.nMaxFileTitle = 255
    'Set the initial directory
    OFName.lpstrInitialDir = "C:"
    'Set the dialog title
    OFName.lpstrTitle = "Save File - KPD-Team 1998"
    'no extra flags
    OFName.flags = 0
 
    'Show the 'Save File'-dialog
    If GetSaveFileName(OFName) Then
        ShowSave = Trim$(OFName.lpstrFile)
    Else
        ShowSave = ""
    End If
End Function
Private Function ShowPageSetupDlg() As Long
    Dim m_PSD As PAGESETUPDLG
    'Set the structure size
    m_PSD.lStructSize = Len(m_PSD)
    'Set the owner window
    m_PSD.hwndOwner = Me.hWnd
    'Set the application instance
    m_PSD.hInstance = App.hInstance
    'no extra flags
    m_PSD.flags = 0
 
    'Show the pagesetup dialog
    If PAGESETUPDLG(m_PSD) Then
        ShowPageSetupDlg = 0
    Else
        ShowPageSetupDlg = -1
    End If
End Function
Public Sub ShowPrinter(frmOwner As Form, Optional PrintFlags As Long)
    '-> Code by Donald Grover
    Dim PrintDlg As PRINTDLG_TYPE
    Dim DevMode As DEVMODE_TYPE
    Dim DevName As DEVNAMES_TYPE
 
    Dim lpDevMode As Long, lpDevName As Long
    Dim bReturn As Integer
    Dim objPrinter As Printer, NewPrinterName As String
 
    ' Use PrintDialog to get the handle to a memory
    ' block with a DevMode and DevName structures
 
    PrintDlg.lStructSize = Len(PrintDlg)
    PrintDlg.hwndOwner = frmOwner.hWnd
 
    PrintDlg.flags = PrintFlags
    On Error Resume Next
    'Set the current orientation and duplex setting
    DevMode.dmDeviceName = Printer.DeviceName
    DevMode.dmSize = Len(DevMode)
    DevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
    DevMode.dmPaperWidth = Printer.Width
    DevMode.dmOrientation = Printer.Orientation
    DevMode.dmPaperSize = Printer.PaperSize
    DevMode.dmDuplex = Printer.Duplex
    On Error GoTo 0
 
    'Allocate memory for the initialization hDevMode structure
    'and copy the settings gathered above into this memory
    PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevMode))
    lpDevMode = GlobalLock(PrintDlg.hDevMode)
    If lpDevMode > 0 Then
        CopyMemory ByVal lpDevMode, DevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
    End If
 
    'Set the current driver, device, and port name strings
    With DevName
        .wDriverOffset = 8
        .wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
        .wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
        .wDefault = 0
    End With
 
    With Printer
        DevName.extra = .DriverName & Chr(0) & .DeviceName & Chr(0) & .Port & Chr(0)
    End With
 
    'Allocate memory for the initial hDevName structure
    'and copy the settings gathered above into this memory
    PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevName))
    lpDevName = GlobalLock(PrintDlg.hDevNames)
    If lpDevName > 0 Then
        CopyMemory ByVal lpDevName, DevName, Len(DevName)
        bReturn = GlobalUnlock(lpDevName)
    End If
 
    'Call the print dialog up and let the user make changes
    If PrintDialog(PrintDlg) <> 0 Then
 
        'First get the DevName structure.
        lpDevName = GlobalLock(PrintDlg.hDevNames)
        CopyMemory DevName, ByVal lpDevName, 45
        bReturn = GlobalUnlock(lpDevName)
        GlobalFree PrintDlg.hDevNames
 
        'Next get the DevMode structure and set the printer
        'properties appropriately
        lpDevMode = GlobalLock(PrintDlg.hDevMode)
        CopyMemory DevMode, ByVal lpDevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
        GlobalFree PrintDlg.hDevMode
        NewPrinterName = UCase$(Left(DevMode.dmDeviceName, InStr(DevMode.dmDeviceName, Chr$(0)) - 1))
        If Printer.DeviceName <> NewPrinterName Then
            For Each objPrinter In Printers
                If UCase$(objPrinter.DeviceName) = NewPrinterName Then
                    Set Printer = objPrinter
                    'set printer toolbar name at this point
                End If
            Next
        End If
 
        On Error Resume Next
        'Set printer object properties according to selections made
        'by user
        Printer.Copies = DevMode.dmCopies
        Printer.Duplex = DevMode.dmDuplex
        Printer.Orientation = DevMode.dmOrientation
        Printer.PaperSize = DevMode.dmPaperSize
        Printer.PrintQuality = DevMode.dmPrintQuality
        Printer.ColorMode = DevMode.dmColor
        Printer.PaperBin = DevMode.dmDefaultSource
        On Error GoTo 0
    End If
End Sub
Вложения
Тип файла: zip Вызов диалоговых окон с помощью API.zip (5.9 Кб, 3 просмотров)
2
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
03.03.2024, 04:12
Цитата Сообщение от HackerVlad Посмотреть сообщение
"ChooseColorA"
А чего все ансишное то?
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.03.2024, 22:10
Цитата Сообщение от testuser2 Посмотреть сообщение
А чего все ансишное то?
Ой ну это просто пример ну

Добавлено через 4 часа 44 минуты
testuser2, это же очень легко, при желании, переписать на W-функции, я лишь привёл пример, коих в Интернете тысячи... а так же, я неоднократно уже говорил на этом форуме и приводил много примеров, что нужно использовать API к comdlg32.dll для вызова диалоговых окон.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
04.03.2024, 16:22  [ТС]
Коллеги, а вот вдогонку ещё один вопросик касаемо автономности программы:
Возможно ли заставить работать OLE Диаграмму Excel без установленного MS Office ?

Благодаря Вашим подсказкам, (HackerVlad тоже спасибо за API касаемо comdlg32, я ещё покумекаю над этим кодом), программа успешно запускается.
На машинах где установлен Office - упомянутый мной ранее OLE отображает диаграммы, всё как нужно.
А вот на машинах где Офиса нет - при попытке отобразить OLE крашится с ошибкой:
Run-time error '91': Object variable od With block variable not set.
Если в коде заигнорить эту ошибку, то вижу, что OLE отображается: на странице диаграммы нарисована область построения с осями, на странице таблицы видна собственно экселевская сетка. Но нет данных. То есть "OLE Диаграмма" как контрол кагбэ автономен от Офиса. Проблема как его заставить работать.
Стал разбираться с кодом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
    Dim i As Long
    Dim xls As Object
    Dim wsh As Object
    
    Set xls = OLE1.object
    Set wsh = xls.Worksheets("Лист1")    'НЕ ПРИНИМАЕТ ВОТ ЭТУ СТРОКУ
    
    For i = 2 To b + 1
    wsh.Cells(i, 1) = cat0(i - 2)
    wsh.Cells(i, 2) = cat(2, i - 2)
    Next i
xls.Sheets("dia").SetSourceData (xls.Sheets("Лист1").Range("A1:B" & b + 1))
Объявлял в коде Лист по-разному, добавлял новый... Ему всё едино. Без установленного Офиса OLE оживать не хочет. Это возможно как-нить обойти, DLLку какую с офиса выдрать и аналогично через regsvr регистрировать...?

p.s. Я пробовал контрол MSCharts. Не в пример быстрее OLE работает, но в VB6 уж больно он убогий... Даже подписи к осям почти нечитабельные, шрифт не меняется.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2024, 16:45
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
OLE1.object
Разве в VB6 такое есть?
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
04.03.2024, 17:52  [ТС]
У меня вроде как есть))
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.03.2024, 23:51
MrRoxMJ, да я никогда таким не занимался, если честно, чтобы вам что-то подсказать, но может The Trick что знает...
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.03.2024, 08:13
MrRoxMJ, вы бы проект приложили я бы больше тогда сказал
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
05.03.2024, 09:51  [ТС]
Чтобы лишним кодом не перегружать, выделил проблему в отдельный простой проектик.
Динамическая OLE диаграмма на форме.
Приложил даже экзешник (если в нём проблема, может не так настройки делаю при компиляции, там всё по-умолчанию стояло).
На компе с Офисом - диаграмму отображает.
На компе без Офиса - пустая сетка.

Если строчку "On error..." закрыть, то на машине без Офиса вылезет, собственно, сама ошибка:
Run-time error '91': Object variable or With block variable not set.
Вложения
Тип файла: zip OLE-chart.zip (28.5 Кб, 2 просмотров)
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
05.03.2024, 09:56
MrRoxMJ, диаграммы Excel это внутренние объекты пространста Excel, т.е. семейства его объектов. Чтобы перенести (попытаться) ole-объекты , нужно переносить вместе прогой, как я думаю, главную библиотеку Excel. А главной библой Экселя является его ексешник, возможно еще какие-то зависимости. Но при всем при том, на компе без установленного МС офиса надо будет зарегать библиотеку(и) Экселя, для чего могут понадобиться админские права.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2024, 09:56
Помогаю со студенческими работами здесь

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

Создание программы на начальном этапе
Подскажите, пожалуйста, какого типа проекта в С++ надо создать и куда именно вставить следующий программный код, что бы программа...

Сортировка на этапе индексации, а на этапе запроса выдавать готовый отсортированный вариант
Как сделать сортировку ответа на этапе индексации, а на этапе запроса выдавать уже готовый отсортированный вариант, а не сортировать каждый...

Почему на 6 этапе последний шар не отклоняется, а отклоняются сразу 3 шара на последнем этапе?
Здравствуйте. Нашел объяснение того, как работает колыбель Ньютона. Вопрос - почему на картинке, на 6 этапе последний шар не...

Создать tuple на этапе выполнения программы в C++ 11
Предположим в целочисленных переменных типа int есть некоторые значения. Нужно во время выполнения программы создать tuple, с этими...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru