Hey daar. Ik heb een applicatie waarbij een lijst .jpg's van de harde schijf geselecteerd moet worden via een common dialog box. Dit moeten er makkelijk 150 kunnen zijn.
Nou doe ik dit niet via het ActiveX object, maar via de API. Heeft me wat hoofdpijn gekost, maar het werkte... dacht ik.
Nou kwam ik erachter dat ik er maar een stuk of 15 kan selecteren. Daarna houdt de string die de common dialog returned simpelweg op.
Ik dacht dus dat het aan de buffer moest liggen, aan nMaxFile dus. Dat die te klein is. Maar, nou lees ik op de MSDN:
De code die het doet:
tFilename.nMaxFile staat dus op &H7FFF, dit is toch 32k? Of zit ik er helemaal naast?
Bijkomend probleem is dat Visual Basic om de haverklap crasht. Het heeft er ongetwijfeld mee te maken.
Nou doe ik dit niet via het ActiveX object, maar via de API. Heeft me wat hoofdpijn gekost, maar het werkte... dacht ik.
Nou kwam ik erachter dat ik er maar een stuk of 15 kan selecteren. Daarna houdt de string die de common dialog returned simpelweg op.
Ik dacht dus dat het aan de buffer moest liggen, aan nMaxFile dus. Dat die te klein is. Maar, nou lees ik op de MSDN:
Maar hij doet het dus wel degelijk, ware het niet dat hij hem maar opvult tot, denkik, 255 tekens.If the buffer is too small, the function returns FALSE and the CommDlgExtendedError function returns FNERR_BUFFERTOOSMALL. In this case, the first two bytes of the lpstrFile buffer contain the required size, in bytes or characters.
De code die het doet:
code:
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
| Type CMDLG_FILENAME
lStructSize As Long
hWndOwner As Long
hInstance As Long
lpstrsFilter As String
lpstrCustomsFilter As String
nMaxCustsFilter As Long
nsFilterIndex 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
Declare Function GetOpenFileNameA Lib "COMDLG32.DLL" (tFilename As CMDLG_FILENAME) As Integer
Const CMDLG_OFN_READONLY = &H1
Const CMDLG_OFN_OVERWRITEPROMPT = &H2
Const CMDLG_OFN_HIDEREADONLY = &H4
Const CMDLG_OFN_NOCHANGEDIR = &H8
Const CMDLG_OFN_SHOWHELP = &H10
Const CMDLG_OFN_ENABLEHOOK = &H20
Const CMDLG_OFN_ENABLETEMPLATE = &H40
Const CMDLG_OFN_ENABLETEMPLATEHANDLE = &H80
Const CMDLG_OFN_NOVALIDATE = &H100
Const CMDLG_OFN_ALLOWMULTISELECT = &H200
Const CMDLG_OFN_EXTENSIONDIFFERENT = &H400
Const CMDLG_OFN_PATHMUSTEXIST = &H800
Const CMDLG_OFN_FILEMUSTEXIST = &H1000
Const CMDLG_OFN_CREATEPROMPT = &H2000
Const CMDLG_OFN_SHAREAWARE = &H4000
Const CMDLG_OFN_NOREADONLYRETURN = &H8000
Const CMDLG_OFN_NOTESTFILECREATE = &H10000
Const CMDLG_OFN_EXPLORER = &H80000
Const CMDLG_OFN_DONTADDTORECENT = &H2000000
Const CMDLG_OFN_SHAREFALLTHROUGH = 2
Const CMDLG_OFN_SHARENOWARN = 1
Const CMDLG_OFN_SHAREWARN = 0
Public Function GetOpenFileName(tFilename As CMDLG_FILENAME) As Integer
GetOpenFileName = GetOpenFileNameA(tFilename)
End Function
Function OpenFileDialog(hWnd As Long, sTitel As String, sFilter As String, sCurDir As String) As String
Dim tFilename As CMDLG_FILENAME
Dim sFilename As String
Dim sFiletitel As String
sTitel = sTitel + Chr$(0)
sFilter = sFilter & "Alle Bestanden (*.*)" & Chr$(0) & "*.*" & Chr$(0) & Chr$(0)
sFilename = Chr$(0) & Space$(255)
sFiletitel = Chr$(0) & Space$(255)
sCurDir = gvntNull2Arg(sCurDir, CurDir$) & Chr$(0)
tFilename.lStructSize = Len(tFilename)
tFilename.hWndOwner = hWnd
tFilename.lpstrsFilter = sFilter
tFilename.nsFilterIndex = 1
tFilename.lpstrFile = sFilename
tFilename.nMaxFile = &H7FFF
tFilename.lpstrFileTitle = sFiletitel
tFilename.nMaxFileTitle = Len(sFiletitel)
tFilename.lpstrTitle = sTitel
tFilename.Flags = CMDLG_OFN_FILEMUSTEXIST Or CMDLG_OFN_HIDEREADONLY Or CMDLG_OFN_ALLOWMULTISELECT
Or CMDLG_OFN_EXPLORER Or CMDLG_OFN_DONTADDTORECENT
tFilename.lpstrInitialDir = sCurDir
If GetOpenFileName(tFilename) <> 0 Then
OpenFileDialog = tFilename.lpstrFile
Else
OpenFileDialog = ""
End If
End Function |
tFilename.nMaxFile staat dus op &H7FFF, dit is toch 32k? Of zit ik er helemaal naast?
Bijkomend probleem is dat Visual Basic om de haverklap crasht. Het heeft er ongetwijfeld mee te maken.
offtopic:
Even een entertje op regel 74 gegeven om de topic niet helemaal lelijk te maken
Even een entertje op regel 74 gegeven om de topic niet helemaal lelijk te maken
[ Voor 7% gewijzigd door looskuh op 26-06-2004 01:05 ]