abonnement Unibet Coolblue Bitvavo
  woensdag 27 juli 2005 @ 14:17:47 #1
123792 JanMichiel
Melk, de witte motor!
pi_29169942
Voor alle Visual Basic 6 vragen.

Is Dir de beste methode om te checken of een bestand aanwezig is in de folder en zo niet het bestand aan te maken? Ik heb het volgende gemaakt (voor het bestand 'data.mdb'):

1
2
3
4
5
6
7
8
9
Private Sub CheckFile()
If LCase(Dir("data.mdb") = "data.mdb" Then
   'the file is present
   Exit Sub
Else
   'the file is not present
   'code to create file here
End If
End Sub
pi_29170595
Nee, u moet het FileSystemObject gebruiken dat geleverd wordt bij het Microsoft Scripting Runtime (Reference zetten).

Public FSO as FileSystemObject

Module:
dim bExists as boolean
bExists = fso.FileExists("data.mdb")
enz.

Aanmaken van een database bestand kan, geloof ik, met Microsoft DAO (= niet ADO, heeft wel raakvlak). Let erop dat als u zowel ADO als DAO gebruikt, u al uw definities volledig defineert, vanwege de dubbele klassenamen.
dim db as ADO.Database
en niet:
dim db as Database

[ Bericht 36% gewijzigd door Xsysstar op 27-07-2005 14:40:36 (Aanvulling) ]
pi_29170665
ha, ik heb ook een mooie vraag

ik heb (VBA, overigens) een input boxje waar je een dir in kan vullen.

Met
1ChDir (directory.Value)
switch ik naar de ingevulde directory, echter, dit houdt geen rekening met eventuele schijfwisseling... Weet iemand hoe ik dit beter kan doen?
Trotse poster van het 37000000ste bericht ^O^
pi_29170702
quote:
Op woensdag 27 juli 2005 14:40 schreef daReaper het volgende:
ha, ik heb ook een mooie vraag

ik heb (VBA, overigens) een input boxje waar je een dir in kan vullen.

Met
[ code verwijderd ]

switch ik naar de ingevulde directory, echter, dit houdt geen rekening met eventuele schijfwisseling... Weet iemand hoe ik dit beter kan doen?
Met ChDrive .
  woensdag 27 juli 2005 @ 15:08:11 #5
123792 JanMichiel
Melk, de witte motor!
pi_29171442
quote:
Op woensdag 27 juli 2005 14:38 schreef Xsysstar het volgende:
Nee, u moet het FileSystemObject gebruiken dat geleverd wordt bij het Microsoft Scripting Runtime (Reference zetten).

Public FSO as FileSystemObject

Module:
dim bExists as boolean
bExists = fso.FileExists("data.mdb")
enz.

Aanmaken van een database bestand kan, geloof ik, met Microsoft DAO (= niet ADO, heeft wel raakvlak). Let erop dat als u zowel ADO als DAO gebruikt, u al uw definities volledig defineert, vanwege de dubbele klassenamen.
dim db as ADO.Database
en niet:
dim db as Database
Ok, bedankt voor de uitleg. Ik zal het straks proberen als ik op de andere computer zit.
pi_29172012
quote:
Op woensdag 27 juli 2005 14:42 schreef Xsysstar het volgende:

[..]

Met ChDrive .
Ja maar doe eens mooi functietje ofzo

En hoe dit dat met netwerk directory's? ( //share/bla )
Trotse poster van het 37000000ste bericht ^O^
pi_29172496
quote:
Op woensdag 27 juli 2005 15:29 schreef daReaper het volgende:

[..]

Ja maar doe eens mooi functietje ofzo

En hoe dit dat met netwerk directory's? ( //share/bla )
Nou, het mooie functietje :
1
2
ChDrive myDir
ChDir myDir


Netwerk kan niet; helaas .
  donderdag 28 juli 2005 @ 11:40:53 #8
123792 JanMichiel
Melk, de witte motor!
pi_29196366
quote:
Op woensdag 27 juli 2005 14:38 schreef Xsysstar het volgende:
Nee, u moet het FileSystemObject gebruiken dat geleverd wordt bij het Microsoft Scripting Runtime (Reference zetten).

Public FSO as FileSystemObject

Module:
dim bExists as boolean
bExists = fso.FileExists("data.mdb")
enz.

Aanmaken van een database bestand kan, geloof ik, met Microsoft DAO (= niet ADO, heeft wel raakvlak). Let erop dat als u zowel ADO als DAO gebruikt, u al uw definities volledig defineert, vanwege de dubbele klassenamen.
dim db as ADO.Database
en niet:
dim db as Database
Het wil nog niet helemaal lukken, ik heb het volgende gedaan.

Een reference geplaatst naar Microsoft Scripting Runtime.
Een module gemaakt met de volgende code:

1
2
3
Public FSO As FileSystemObject
Dim bExists As Boolean
bExists = FSO.FileExists("data.mdb")


En dan de variabele bExists in een sub testen, bijvoorbeeld:

1
2
3
4
Private Sub Form_Load()
If bExists = False Then
...
...


Wanneer ik de code wil uitvoeren (F5) geeft Visual Basic op het "data.mdb" gedeelte de foutmelding: Invalid Outside Procedure. Wat doe ik nu verkeerd?
pi_29196418
Dat is mijn fout; ik haal module en sub door elkaar. Spijt me.

De FileSystemObject-definitie moet in de kop van de module (dat was goed).
In een sub kunt u met dat FSO-object vele functies aanroepen, waaronder FileExists. Oftewel: de bExists-definitie en het vullen ervan moet ook in Form_load.
  donderdag 28 juli 2005 @ 11:49:59 #10
123792 JanMichiel
Melk, de witte motor!
pi_29196605
quote:
Op donderdag 28 juli 2005 11:43 schreef Xsysstar het volgende:
Dat is mijn fout; ik haal module en sub door elkaar. Spijt me.

De FileSystemObject-definitie moet in de kop van de module (dat was goed).
In een sub kunt u met dat FSO-object vele functies aanroepen, waaronder FileExists. Oftewel: de bExists-definitie en het vullen ervan moet ook in Form_load.
1. Reference
2. Module:

1Public FSO As FileSystemObject


3. Sub:

1
2
3
4
5
6
Private Sub Form_Load()
Dim bExists As Boolean
bExists = FSO.FileExists("data.mdb")
If bExists = False Then
...
...


Correct? Ik dacht dat ik dit al geprobeerd had (zonder veel succes), maar zal het straks nog eens proberen.

Is het overigens noodzakelijk om de reference (object?) in een module te declareren? Of kan dat ook gewoon in een form?
pi_29196940
quote:
Op donderdag 28 juli 2005 11:49 schreef JanMichiel het volgende:
Is het overigens noodzakelijk om de reference (object?) in een module te declareren? Of kan dat ook gewoon in een form?
Dat kan in principe overal (het FileSystemObject kan ook in een gewone sub gedeclareerd worden), maar afhankelijk van het soort referentie kan het verstandig zijn om één enkele instantie te maken van die referentie.

Een FileSystemObject is onveranderlijk en hetzelfde object kan dus door het hele programma door gebruikt worden. Indien u veel met dit object wil doen, kan het handig zijn het object eenmalig in een module (Public) te declareren. Mocht u het maar nodig hebben in één sub of functie, dan kan het gewoon in de desbetreffende sub of functie gedeclareerd worden (Dim).
pi_29201349
Ik ben een online game aan het maken, werkt opzich al redelijk loop tegen iets kleins aan:

Bij het versturen van de info van de wereld (welke gebouwtjes er gebouwd zijn) maak ik 1 lange regel die op de server in een database wordt gezet. Deze regel is alsvolgt opgebouwd:

base#(insert X coordinaat hier)#(insert Y coordinaat hier)#(welk nr. gebouw hier)#(insert X coordinaat hier)#(insert Y coordinaat hier)#(welk nr. gebouw hier)# etc etc.

Nu staan die gegevens in het programma in inbase(500,500)

Ik wil dat de gegevens op de server up2date blijven. Dus ik verstuur bij het bouwen van een gebouw die info over. Probleem daarbij is om de X en de Y gegevens, en het bijhorende gebouw in 1 regel te krijgen. Ik doe dat als volgt:

1
2
3
4
5
6
7
8
9
10
SendString = ""
For i = 0 To 500

 For a = 0 To 500
 SendString = SendString & inBase(i, a) & "#"
 Next a

Next i

frmConnection.wnsdata.SendData "base#" & SendString



Maar daar wordt mn spelletje ERG traag van

(lees: Hij bevriest voor een minuut of 5). En dat komt uiteraard de gameplay niet ten goede


Dus beste medemensjes, hoe dit op te lossen?
pi_29201755
U kunt het beste klassen gebruiken. Indien u niet gewerkt hebt met klassen en verzamelingen (collecties), zegt u het dan even? Dan leg ik het wat verder uit.

[Class: clsBuilding]
1
2
3
4
5
6
7
8
Public Enum eBuildingType
     ebtHeadquarters = 0
     ebtTaxOffice = 1
End enum  'De nummers mogen weggelaten worden (de '=' moet dan ook weg)

Public BuildingType as eBuildingType
Public X as integer
Public Y as integer


[Module]
1Public InBase as Collection

In deze module:
1
2
+Sub Init+
Set InBase = new Collection


1
2
3
4
5
6
7
8
9
+Function GiveBuildings+
dim b as clsBuilding, s as string
s = "#"
for each b in InBase
    s = cstr(b.BuildingType) & "#" & cstr(b.X) & "#" & cstr(b.Y) & "#"
next

'Hier kunt u nu doen wat u wilt; ik doe even debug.print s.
debug.print s
pi_29201973
De gebouwen zijn ook genummerd 0 voor huis, 2 voor barracks etc etc.

Dit gebeurt in een aparte module..

Alleen je For-next lus snap ik niet echt, en Collection? (het gaat om een (Veels te groot, ik ga hem ook verkleinen) veld van 500x500 gebouwtjes, dus 250 000 gebouwtjes)
pi_29202531
Het nummeren van sóórten gebouwen doe ik met Enum (dat is gewoon een lijst met cijfers die een naampje krijgen).

Mocht dat niet genoeg zijn (dat zal snel het geval zijn), dan kunt u in plaats van een Enum, wéér een andere klasse maken (bijv. clsBuildingType) en nóg collection (bijv. Public Buildingtypes as Collection) in een module. In elk zo'n klasse (clsBuildingType) kunt u eigenschappen van het desbetreffende gebouw opgeven (BuildingName, DeltaStonePerTurn, BuildCostStone, enz).

+++
Ja, in de for-lus staat foutje; 'k zag het net
moet zijn: s = s & ....
("cstr" wordt gebruikt om integers e.d. om te zetten in een string.)

Met deze functie worden nu gewoon alle gebouwen uit de collectie gepakt en hun gegevens (x,y, type) achter elkaar geplakt.

Collections:
Een collection kan (i.t.t. een array) Objecten bevatten, elk met een unieke Key. Alle Toolbars (toolbar.buttons), Listviews (listview.listitem), treeviews (treeview.nodes) hebben een (of meerdere) collectie(s) waarin objecten (werkbalkknop, listviewpictogram, treeviewvertakking) geplaatst worden. Zelfgemaakte objecten (=klassen) kunt u hier ook in plaatsen.

Dat is wat ik hier ook heb gedaan:
Public colCollection as collection 'Collectie defineren=geheugenplaats vrijmaken

Sub init
set colCollection = new collection 'Setten=geheugenplaats vullen met een nieuwe collectie (want u zou ook een kopie van een bestaande collectie kunnen maken (set colCollection = colOld)
'Aangezien een collectie ook een object is, moet het geset worden; alle objecten die u in de programmacode maakt en wilt gebruiken, moeten geset worden.

dim c as clsNieuweKlasse 'Geheugenplaats vrijmaken
set c = new clsNieuweKlasse 'Nieuwe maken

debug.print "In de klasse zitten " & c.count & " objecten." 'Geen=0 objecten
colCollection.add tb, "Nieuwe klasse" 'Hiermee wordt "c" aan de collectie toegevoegd met de sleutel "Nieuwe klasse".
debug.print "In de klasse zit " & c.count & "object" 'Eén object.

If colCollection(1) is colCollection("Nieuwe klasse") then debug.print "Men kan een object in een collectie op twee manieren aanroepen: als getal (index) of als naam (key)"
if colCollection(1) is c then debug.print "Object 'c' is inderdaad gelijk aan colCollection(1)
end sub

Let u wel op dat bij een vergelijking (if-statement) objecten altijd met "is" (en niet =) worden vergeleken. Het setten van objecten gaat wel gewoon met het =-teken, maar i.t.t. strings en integers moet er dan het commando "set" voor, zoals u hebt kunnen zien.

Hopelijk is het duidelijk .
pi_29204311
Jup thnx overigens het probleem wel al op een andere manier opgelost: Simpelweg de maps kleiner maken. 250.000 gebouwtjes was wat te veel van het goede Nu gaat het overdragen snel genoeg. Echter, de volgende opdracht (Die een query uit laat voeren) geeft een foutmelding:

1AddRecord "INSERT INTO worldinfo (worldstring) VALUES ('" & convertstring & "')" & "WHERE username = '" & tempUsername & "'"
quote:
Er ontbreekt een puntkomma (;) aan het einde van de SQL instructie
Echter, dit is gewoon een iets aangepaste query die al werkte..
pi_29204470
Hmm, dat lijkt SQL. Ik weet niet hoe de functie AddRecord werkt, maar ik denk dat de oplossing wel weet: achteraan het commando (vóór het laatste aanhalingsteken: AddRecord "Commando(Hier)" ) moet u de puntkomma plaatsen.
Als dit inderdaad niet werkt, misschien moet u een spatie plaatsen tussen het aanhalingsteken en WHERE in het deel [& "WHERE username =].
  donderdag 28 juli 2005 @ 16:22:38 #18
123792 JanMichiel
Melk, de witte motor!
pi_29205327
quote:
Op donderdag 28 juli 2005 11:49 schreef JanMichiel het volgende:

[..]

1. Reference
2. Module:
[ code verwijderd ]

3. Sub:
[ code verwijderd ]

Correct? Ik dacht dat ik dit al geprobeerd had (zonder veel succes), maar zal het straks nog eens proberen.

Is het overigens noodzakelijk om de reference (object?) in een module te declareren? Of kan dat ook gewoon in een form?
Volgens mij moet er ook nog iets met het Set command gebeuren in mijn code. Ik ben nog een beetje aan het inlezen over objects, maar elke hulp is meegenomen.
pi_29205370
Ik heb niet zoëven iets gezien in uw code waar een Set commando gebruikt moet worden maar mocht u ergens met zitten (te twijfelen), dan zegt u het maar .
pi_29205435
quote:
Op donderdag 28 juli 2005 15:54 schreef Xsysstar het volgende:
Hmm, dat lijkt SQL. Ik weet niet hoe de functie AddRecord werkt, maar ik denk dat de oplossing wel weet: achteraan het commando (vóór het laatste aanhalingsteken: AddRecord "Commando(Hier)" ) moet u de puntkomma plaatsen.
Als dit inderdaad niet werkt, misschien moet u een spatie plaatsen tussen het aanhalingsteken en WHERE in het deel [& "WHERE username =].
De functie addrecord doet:

1
2
3
4
5
Public Sub AddRecord(query)
Dim AdoRec As ADODB.Recordset
Set AdoRec = AdoCon.Execute(query)
Set AdoRec = Nothing
End Sub


Dat met die puntkomma neerzetten heb ik geprobeerd, werkte helaas niet
  donderdag 28 juli 2005 @ 16:27:37 #21
123792 JanMichiel
Melk, de witte motor!
pi_29205445
Ik krijg bij het uitvoeren error code #91. Je kan het wel nalezen in de VB help index waarschijnlijk. Het helpdocument spreekt voor het gebruik van een object over het declareren van het object (gedaan) en het Set command. Maar ik heb momenteel te weinig kennis van objects om te weten het het Set command te gebruiken.
pi_29205525
Spatie was het ook niet.. zou het kunnen dat de query die ik doorgeef, te lang is?
pi_29205532
quote:
Op donderdag 28 juli 2005 16:27 schreef LeeHarveyOswald het volgende:

[..]

De functie addrecord doet:
[ code verwijderd ]

Dat met die puntkomma neerzetten heb ik geprobeerd, werkte helaas niet
Dat Set = nothing is overbodig; VB doet dat zelf.
Het probleem zal hem wel in adocon liggen. Goede RecordType ofzo (Unknown, Table, enz, Command) gekozen?
Probeer anders eens een debug.print van de Query; misschien ziet u het dan ineens.
pi_29205546
quote:
Op donderdag 28 juli 2005 16:30 schreef LeeHarveyOswald het volgende:
Spatie was het ook niet.. zou het kunnen dat de query die ik doorgeef, te lang is?
Zou kunnen; max 255 tekens ofzo?
pi_29205588
quote:
Op donderdag 28 juli 2005 16:27 schreef JanMichiel het volgende:
Ik krijg bij het uitvoeren error code #91. Je kan het wel nalezen in de VB help index waarschijnlijk. Het helpdocument spreekt voor het gebruik van een object over het declareren van het object (gedaan) en het Set command. Maar ik heb momenteel te weinig kennis van objects om te weten het het Set command te gebruiken.
In LeeHarveyOswalds code kunt u zien hoe het met Dim en Set werkt. Kijkt u anders eens op Google of http://www.vbgroup.nl/Default.aspx?tabid=41. Er zijn vast wel minicursi te vinden.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')