[VB6] Directorystructuur in een array zetten lukt niet.

Pagina: 1
Acties:

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Hallo.

INLEIDING
------------------------------------
Ik ben bezig met een bugfix voor een programma dat ik heb geschreven. Het ziet er zo uit:
Afbeeldingslocatie: http://www.eigenstart.nl/bookmark_programma/voorbeeld.gif

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 :). 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?)

[ Voor 8% gewijzigd door looskuh op 14-02-2004 21:50 ]


Verwijderd

code:
1
For X = waardecount - 1 To -1 Step -1


Zoiets was het volgens mij, je moet die for lus iig omkeren in regel 56


Heb verder niet echt meer naar de code gekeken e.d. maar omdat je op een gegeven moment zegt van dat het WEL werkt bij meerdere entries en niet bij 2 of minder ga ik er vanuit dat dit de oplossing is omdat ik ooit met een soortgelijk probleem zat

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Zou het probleem niet zitten in het feit dat je twee lege waardes aanmaakt in je array als je met de eerste sub-categorie aan de slag gaat? Het kan moeilijk zijn (op zondag ochtend zeker :P) om de intenties van een andere programmeur te lezen in zijn code.

Misschien kun je eens een watch zetten op je arrays en je tel-variabele, om vervolgens regel voor regel door je code heen te steppen. Misschien zie je dan iets gebeuren waarvan je zelf dacht dat het anders zou gaan....?

Oftewel: breakpoint erin en debuggen! ;)

[ Voor 3% gewijzigd door OZ-Gump op 15-02-2004 10:56 ]

My personal website


  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Zou het probleem niet zitten in het feit dat je twee lege waardes aanmaakt in je array als je met de eerste sub-categorie aan de slag gaat? Het kan moeilijk zijn (op zondag ochtend zeker ) om de intenties van een andere programmeur te lezen in zijn code.
Tsja, ik snap niet wat dat uit zou moeten maken. Echt leeg is de array op die punten trouwens niet. Het zijn alleen waarden waar ik niets mee kan, en dus negeer ik ze.

Voor mijn gevoel is het eigenlijk niets anders dan een array met appeltjes en eitjes.

appeltje
eitje
eitje

Mag wel... Maar:

eitje
appeltje
eitje

Mag niet...

Of zit ik er nu naast? Waar laat mijn logica mij in de steek?

Ennem, breaken en debuggen heb ik al behoorlijk gedaan :). Ik heb ook niet echt het gevoel dat er iets mis is met mijn code, meer met mijn manier van denken.

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Verwijderd schreef op 14 februari 2004 @ 21:54:
code:
1
For X = waardecount - 1 To -1 Step -1

Zoiets was het volgens mij, je moet die for lus iig omkeren in regel 56
Hmmm. Dus van boven naar beneden tellen? Waarom zou dat wel werken denk je?

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 20-05 00:48

ZaZ

Tweakers abonnee

heb niet je hele code gelezen, maar bij het begin doe je:

ReDim Preserve aCategories(1)
ReDim Preserve aFavorieten(1)

het woordje Preserve kan je wel weglaten daar (want je hoeft de oude values niet te behouden), en je hebt dan al een array die 2 groot is.
aCategories(0) en aCategories(1)
in C moet het wel zo, maar je hebt het in VB geschreven dus in vb zou je dus beter
Redim aGategories(0)
kunnen gebruiken.
die foutmelding die je krijgt is omdat je een object probeert te lezen die er niet is.
bijv.

dim aFavorieten(0) as clsFavorieten
aFavorieten(0).Bestand = "boe"

geeft een foutmelding

Dim aFavorieten(0) as clsFavorieten
Set aFavorieten(0) = New clsFavorieten
aFavorieten(0).Bestand = "boe"

werkt wel.

ergens in je hele loop gebeuren probeer je waarschijnlijk te lezen van object wat niet 'ge-set' is, en dat zou heel goed kunnen komen door dat wat ik hierboven zei.
maar dat is m aan jou om uit te zoeken. :)
hopelijk heb je er iets aan

Lekker op de bank

Pagina: 1