Hallo.
INLEIDING
------------------------------------
Ik ben bezig met een bugfix voor een programma dat ik heb geschreven. Het ziet er zo uit:

Het is hier te downloaden: http://www.eigenstart.nl/bookmark_programma/setup.exe
Het is een programma dat je favorieten-map inleest, en de geselecteerde bestanden verstuurd naar een site.
Het probleem zit hem in het inlezen van de favorietenmap, en de onderliggende submappen.
WERKWIJZE
------------------------
Om het enigzins overzichtelijk te houden, wil ik eerst de favorieten laten zien die in de root staan, en dan pas de favorieten te laten zien die in de submappen staan.
Hoe ga ik te werk?
- Ik vind de favorietenmap
- Ik lees alle .url bestanden in, en maak voor elk een object aan in de array aFavorieten()
- Als ik een subdirectory tegenkom, zet ik deze even weg in de array aCategories()
- Vervolgens loop ik inhoud van de submappen door (die dus in aCategories() zitten)
- Elke .url die ik tegenkom, belandt weer als object in de array aFavorieten()
Alles wat ik in de URL stop, laat ik ook meteen op het scherm zien. Zodat de select-lijst op het scherm identiek is qua index, en qua inhoud, met de array die eraan ten grondslag ligt
Dit werkt allemaal prima.....
PROBLEEM
----------------------------
TOTDAT iemand maar één of zelfs géén favorieten in zijn rootmap heeft staan. Daar ligt m'n probleem. De indexing loopt in de soep. Waarom? Het heeft met het volgende te maken:
Omdat ik de informatie enigszins geordend wil laten zien, moet ik op z'n minst aangeven dat de links die volgen een submap zijn. [plaatje volgt]
Hiervoor maak ik zowel in de listbox, als in de array twee entries aan. Als ik later deze ga versturen, negeer ik ze simpelweg.
Daar wringt de schoen. Als mensen gewoon twee of meer bestanden in hun root hebben staan, gaat het allemaal prima, en werkt het programma precies zoals het moet.
Als zij dat niet hebben, loopt de indexing in de soep. Ik snap waar, hoe, en wanneer hij dat doet. Ik snap na vier uur turen en het uitprinten van de array, nog steeds niet WAAROM.
Het gaat fout in het if-blok van regel 58 t/m 72. Let dus op: Dit werkt normaal gepsproken prima, behalve als iemand minder dan 2 .url bestanden in zijn root heeft staan
Daar heb ik jullie hulp bij nodig. Ik krijg geen inzicht in het feit dat alles prima gaat als men twee of meer items heeft in de root, en het in de soep loopt als men er minder heeft.
ARRAYS
--------------------------------
De array als alles goed gaat:
---------------------------------
0 bestandje in de root.url
1 nog een bestandje in de root.url
2 ""
3 -- CATEGORIE: A
4 Een favorietje in de categorie A.url
---------------------------------
De array als het fout gaat:
---------------------------------
0 ""
1 -- CATEGORIE: B
2 Favorietje in categorie B.url
3 Tweede favorietje bij B.url
4 Behaarde Baardapen bij B.url
ERROR: OBJECT VARIABLE OR WITH-BLOCK NOT SET
in regel: print aFavorieten(Index).Bestand
(Index = 5)
CODE
--------------------------------
De relevante code:
EN BTW:
-------------------------
Alle reacties zullen ongetwijfeld goed bedoeld zijn. Maar al vaak moest ik bij sommige problemen helaas verzanden in vreemde discussies of ik "dit en dat" niet beter op een AMD 64 Linux gecompilde kernel v23.43 xx2 99/23 distri in C++ had kunnen maken, met zus en zulke API's en flux-capacitators, etc... Maargoed, daar heb ik niet zo bijster veel aan
. Het gaat hier om een programma dat bij 98% v/d mensen prima naar behoren werkt, maar een vervelende bug heeft waar ik geen inzicht in heb.
Super bedankt voor de moeite alvast! (En sorry voor de lange post
Beter in 1x duidelijk dan een slepende topic he?)
INLEIDING
------------------------------------
Ik ben bezig met een bugfix voor een programma dat ik heb geschreven. Het ziet er zo uit:

Het is hier te downloaden: http://www.eigenstart.nl/bookmark_programma/setup.exe
Het is een programma dat je favorieten-map inleest, en de geselecteerde bestanden verstuurd naar een site.
Het probleem zit hem in het inlezen van de favorietenmap, en de onderliggende submappen.
WERKWIJZE
------------------------
Om het enigzins overzichtelijk te houden, wil ik eerst de favorieten laten zien die in de root staan, en dan pas de favorieten te laten zien die in de submappen staan.
Hoe ga ik te werk?
- Ik vind de favorietenmap
- Ik lees alle .url bestanden in, en maak voor elk een object aan in de array aFavorieten()
- Als ik een subdirectory tegenkom, zet ik deze even weg in de array aCategories()
- Vervolgens loop ik inhoud van de submappen door (die dus in aCategories() zitten)
- Elke .url die ik tegenkom, belandt weer als object in de array aFavorieten()
Alles wat ik in de URL stop, laat ik ook meteen op het scherm zien. Zodat de select-lijst op het scherm identiek is qua index, en qua inhoud, met de array die eraan ten grondslag ligt
Dit werkt allemaal prima.....
PROBLEEM
----------------------------
TOTDAT iemand maar één of zelfs géén favorieten in zijn rootmap heeft staan. Daar ligt m'n probleem. De indexing loopt in de soep. Waarom? Het heeft met het volgende te maken:
Omdat ik de informatie enigszins geordend wil laten zien, moet ik op z'n minst aangeven dat de links die volgen een submap zijn. [plaatje volgt]
Hiervoor maak ik zowel in de listbox, als in de array twee entries aan. Als ik later deze ga versturen, negeer ik ze simpelweg.
Daar wringt de schoen. Als mensen gewoon twee of meer bestanden in hun root hebben staan, gaat het allemaal prima, en werkt het programma precies zoals het moet.
Als zij dat niet hebben, loopt de indexing in de soep. Ik snap waar, hoe, en wanneer hij dat doet. Ik snap na vier uur turen en het uitprinten van de array, nog steeds niet WAAROM.
Het gaat fout in het if-blok van regel 58 t/m 72. Let dus op: Dit werkt normaal gepsproken prima, behalve als iemand minder dan 2 .url bestanden in zijn root heeft staan
Daar heb ik jullie hulp bij nodig. Ik krijg geen inzicht in het feit dat alles prima gaat als men twee of meer items heeft in de root, en het in de soep loopt als men er minder heeft.
ARRAYS
--------------------------------
De array als alles goed gaat:
---------------------------------
0 bestandje in de root.url
1 nog een bestandje in de root.url
2 ""
3 -- CATEGORIE: A
4 Een favorietje in de categorie A.url
---------------------------------
De array als het fout gaat:
---------------------------------
0 ""
1 -- CATEGORIE: B
2 Favorietje in categorie B.url
3 Tweede favorietje bij B.url
4 Behaarde Baardapen bij B.url
ERROR: OBJECT VARIABLE OR WITH-BLOCK NOT SET
in regel: print aFavorieten(Index).Bestand
(Index = 5)
CODE
--------------------------------
De relevante code:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
| Dim aFavorieten() As clsFavorieten 'De favorieten
Dim aCategories() As String 'Alle categorieen direct achter elkaar
Dim iFilesCount As Integer
Dim iCount As Integer 'Algemene variable om mee te tellen.
Dim iCountCategories As Integer 'Telt de categorieen.
Dim sFavoritesDir As String
Dim sFile As String
Private Sub Importeren_Click()
sFavoritesDir = fGetSpecialFolder(CSIDL_FAVORITES) 'Vraag favoritesfolder op, stop in string
If Dir(sFavoritesDir, vbDirectory) <> "" Then
ReDim Preserve aCategories(1)
ReDim Preserve aFavorieten(1)
sFile = Dir(sFavoritesDir, vbDirectory) ' Retrieve the first entry.
iCount = 0
iCountCategories = 0
' Start het scannen van de root van de favorieten map.
Do While sFile <> ""
'Niet deze en de bovenste directory meepakken
If sFile <> "." And sFile <> ".." And sFile <> "" Then
If (GetAttr(sFavoritesDir & sFile) And vbDirectory) = vbDirectory Then 'Is het een map, dus subcategorie!
'Breid de array met 1'tje uit
ReDim Preserve aCategories(UBound(aCategories) + 1)
'Sla deze op in een array, die hierna wordt uitgelezen.
aCategories(iCountCategories) = sFile
iCountCategories = iCountCategories + 1
ElseIf InStr(sFile, ".url") > 0 Then 'Het is een bestand! Maar is het wel een .url bestand?
If iCount > 1 Then
ReDim Preserve aFavorieten(UBound(aFavorieten) + 1)
End If
'Maak een object aan in de array, en zet de properties goed
Set aFavorieten(iCount) = New clsFavorieten
aFavorieten(iCount).Bestand = sFile 'Dit is een favoriet!
aFavorieten(iCount).Categorie = "Algemeen" 'Dit is de standaard categorie van een favoriet in de root map
aFavorieten(iCount).Selected = False
aFavorieten(iCount).URL = ""
Favorieten.AddItem aFavorieten(iCount).Bestand 'Laat 't zien op 't scherm
iCount = iCount + 1
Else
'Het is een bestand dat geen .url is, en dus geen link is.
End If
End If
sFile = Dir ' Volgende bestand.
Loop
sFile = ""
' Nu nog de subcategorieen doorlopen
For X = 0 To iCountCategories - 1
sFile = Dir(sFavoritesDir & aCategories(X) & "\", vbDirectory) ' Retrieve the first entry.
If sFile = "." Then
'Als dit een nieuwe categorie is die daadwerkelijk bestanden bevat:
'Maak twee lege entries aan in de array van objecten, deze worden bij het loopen overgeslagen, maar anders klopt het indexen niet meer.
ReDim Preserve aFavorieten(UBound(aFavorieten) + 1)
Favorieten.AddItem ""
Set aFavorieten(iCount) = New clsFavorieten
iCount = iCount + 1
ReDim Preserve aFavorieten(UBound(aFavorieten) + 1)
Favorieten.AddItem "-- CATEGORIE: " & aCategories(X)
Set aFavorieten(iCount) = New clsFavorieten
iCount = iCount + 1
End If
Do While sFile <> ""
'Niet deze en de bovenste directory meepakken
If sFile <> "." And sFile <> ".." Then
If (GetAttr(sFavoritesDir & aCategories(X) & "\" & sFile) And vbDirectory) = vbDirectory Then 'Is het nog een map! Dit kan niet!
lblHelp.Caption = "Let op! Je favorieten-map gaat dieper dan één sub-map. Alleen links in mappen die één niveau diep staan worden meegenomen!"
ElseIf InStr(sFile, ".url") > 0 Then 'Het is een link!
'Maak een nieuw object aan in de array
ReDim Preserve aFavorieten(UBound(aFavorieten) + 1)
Set aFavorieten(iCount) = New clsFavorieten
aFavorieten(iCount).Bestand = sFile 'Dit is een favoriet!
aFavorieten(iCount).Categorie = aCategories(X) 'Dit is de standaard categorie van een favoriet in de root map
aFavorieten(iCount).Selected = False 'Standaard niet geselecteerd
aFavorieten(iCount).URL = ""
'Zet 't in de lijst
Favorieten.AddItem aFavorieten(iCount).Bestand
iCount = iCount + 1
End If
End If
sFile = Dir ' Get next entry.
Loop
Next
Else
'Favorieten dir kan niet worden gevonden. Zorg voor een browsevenster
End If
End Sub |
EN BTW:
-------------------------
Alle reacties zullen ongetwijfeld goed bedoeld zijn. Maar al vaak moest ik bij sommige problemen helaas verzanden in vreemde discussies of ik "dit en dat" niet beter op een AMD 64 Linux gecompilde kernel v23.43 xx2 99/23 distri in C++ had kunnen maken, met zus en zulke API's en flux-capacitators, etc... Maargoed, daar heb ik niet zo bijster veel aan
Super bedankt voor de moeite alvast! (En sorry voor de lange post
[ Voor 8% gewijzigd door looskuh op 14-02-2004 21:50 ]