He he, ben eindelijk weer terug!
Hallo Jan,
Allereerst even het volgende. We hebben het hier over
bestandsorganisatie. Het voert hier te ver om al over die
zaken te gaan bespreken. Ik probeer het kort te houden.
Probleem van aanpak zal ik hier als volgt bechrijven.
Misschien is wat ik hier beschrijf niet helemaal wat je bedoelt,
(althans v.w.b. de indeling van je .txt bestand) maar neem het maar even voor
lief als je het niet erg vingt, want het gaat hier om de benadering
om tot het juiste resultaat te komen.
Met FSO (File System Object) zal het niet gaan lukken en met
Visual Data Manager evenmin, omdat er een .mdb bestand aangemaakt
wordt. Je wilt immers een .txt bestand gebruiken.
Toch zitten wij met die .mdb (Microsoft DataBase) gedachte dicht in de
buurt, want het gaat hier tenslotte ook om een DataBase.
Toch kun je je .txt bestand ook als zodanig definieren door in het VB-Module
een UDT (User Define Type=Eigen gemaakte type variabele) te declareren en
de Mode voor het Open statement als Random te kiezen en verder het bestand
met Get en Put te manipuleren.
Het meest elementaire element v.e. database is een bit, maar aan
deze informatie heb je niet zoveel aan. Dus even globaal de opbouw v.d.
boomstructuur:
Database -> records -> velden. M.a.w. een database bestaat uit
records(regels), bv. de records van je NAW-gegevens. Deze NAW-gegevens
bevinden zich in velden (ook kolommen genoemd).
Ik ga er hier vanuit, dat je .txt bestand op deze manier ingedeeld is
en niet anders!:
xposition=10
yposition=12
zposition=15
............
............
............
enz.........
We stellen nu vast, dat de lengte per regel ALTIJD 12 posities zal zijn.
En stellen wij ook verder vast, dat een record uit SLECHTS één veld (kolom)
bestaat. Hetgeen een vaste (fixed) lengte heeft en niet variabel is.
Je databasje is nu gedefineerd.
Hierboven heb ik het over een veld, dat een vaste lengte van 12 posities heeft.
Toch moet het veld nog 2 posities erbij hebben en waarom? Omdat aan het einde
van elke regel zich onzichtbare ascii-codes (13 en 10;VbCrLf) bevinden.
Zie hieronder (wordt verderop ook uitgelegd) hoe je dit in je module (.bas)
moet definieren.
Public Type Resolutie
Waarde As String * 14 'Dus niet 12 posities maar 14.
End Type
Nu komt de volledige beschrijving hoe het probleem aan te pakken.
Helaas kan ik jou de volledige code niet geven, omdat ik je
eigen source niet ken. Ik weet niet welke variabelen, controls enz...
je in je programma hebt gebruikt. Dus ik houd het een beetje algemeen
en moet je nog verder bijschaven. Ook het ondervangen van ONGELDIGE
invoer van de texboxen moet je nog programmeren. Dit is van het grootste
belang. En nog andere meer, bv correcte variabelenamen te gebruiken enz..
Ik heb de kern v.h. probleem even willen oplossen, en dat is dat je bij
verandering van één regel in je bestand niet het hele bestand opnieuw
behoeft te worden geschreven. En dit gaat uitstekend.
1) Maak een Module aan. Dit doe je door Project/Add Module
2) en declareer in je module:
Public Type Resolutie
Waarde As String * 14 'Dus niet 12
End Type
3) Plaats 2 extra TexBoxen op je Form. Een knop moet je al hebben om
een bestand te selecteren/openen middels het CommonDialog control dat
ook op je Form al aanwezig is.
In de ene TexBox voer je de waarde in die moet worden vervangen en
de andere bevat de nieuwe waarde. De knop bevat het feitelijke
doel v.h. programma (oude resolutie waarde met een niuwe vervangen)
4) Nogmaals, je had al een CommonDialog control op je Form. Na het
selecteren v.e. bestand is het pad en je bestandsnaam bekend. (sFile)
5) Plaats de code hieronder op je eigen bestaande knop, die dient om een
bestand te selecteren en het vervolgens te openen EN NU ook om het
geselecteerde bestand te manipuleren.
Code:
'==== Begin aanvulling declaratie/toekenning
Dim NieuweWaarde As Resolutie
Dim vervang As String
Dim oude As String
Dim teller As Integer
Dim num
num = FreeFile
teller = 1
'==== Einde aanvulling declaratie/toekenning
'===== Begin dit stond er al
With dlgCommonDialog
.DialogTitle = "Choose your adboard"
.CancelError = False
.Filter = "Bitmapfiles (.bmp)|*.bmp"
.ShowOpen
If Len(.FileName) = 0 Then
Exit Sub
End If
sFile = .FileName
End With
picShow.Picture = LoadPicture(sFile)
Text1.text = sFile 'Dit moet je nog erbij doen.
'===== Einde dit stond er al
'===== Begin toegevoegde code
Open sFile For Random Access Read Write As #num Len = Len(NieuweWaarde)
While Not EOF(num)
Get #num, teller, NieuweWaarde
'Text1.text zul je al hebben, dus even aanpassen.
'In deze textbox vul je de waarde die moet worden gezocht
'en met de waarde v.d. andere textbox wordt vervangen.
oude = Text1.Text & vbNewLine
If oude = NieuweWaarde.Waarde Then
'Text2 zul je ongetwijfeld ook al
'hebben, dus ook even aanpassen.
vervang = Trim(Text2.Text) & vbNewLine
NieuweWaarde.Waarde = vervang
Put #num, teller, NieuweWaarde.Waarde
Close #num
Exit Sub
End If
teller = teller + 1
Wend
Close #num
'===== Einde toegevoegde code
Volgorde nadat het programma gerund is: de 2 textboxen invullen en
op de knop klikken (jouw eigen gedefinieerde knop voor Common-
Dialog control). Heb zelf gauw een testprogrammaatje gemaakt en getest.
En het werkt naar behoren.
Mvg,
Dennis.
P.S. Heb onderste code even goed geordend.
(Gestructureed in compound-statement)