[VB] Object met code maken

Pagina: 1
Acties:

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Ik zou eigelijk eender welk object met code willen maken.
Dus ipv een Commondialog control op mijn form te zetten zou ik zoiets als
code:
1
2
Dim X as Commondialog
Set X = New Commondialog

Echter de bovenstaande code werkt niet noch de vele variaties hierop die ik heb geprobeert...

Google bracht geen soelaas, noch de search...

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Dynamisch aanmaken van controls kan niet in VB, dacht ik. Je moet er in iedergeval 1 op je form hebben, deze Visible = False maken en kun je met Load nieuwe aanmaken.

In het geval van CommonDialog is het mogenlijk deze met API calls aan te roepen, daarvoor zul je toch even Google moeten gebruiken.

oogjes open, snaveltjes dicht


Verwijderd

voor zover ik weet kan je dit in VB6 alleen met control arrays doen, maar of dat in deze situatie nuttig is betwijfel ik.

Je moet überhaupt een Load statement gebruiken, heb je dat al geprobeerd?

In control arrays kan het volgende:
1) voeg een control toe en zet z'n index property op 0
2) in je code kan je vervolgens zoiets doen
Load control(control.UBound + 1)
control(control.UBound).caption = "NIEUWE!!"
control(control.UBound).visible = true

maar ik weet niet of je hier wat aan hebt...

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Ah, ok het kan dus niet, dan zal ik het doen zoals je zei met het op de form te plaatsten.

Echter voor mijn ADODB (ADO Database) lukt het niet met het form te houden. Met ADODB moet het WEL kunnen want dit ding verschijn in het NEW lijstje waar de commondialog het niet deed.

Dus, hoe kan ik zoals met DAO een ADO object laden ?

Met DAO ging het

Public T as as Database
Set T = Opendatabase("C:\Xterm.mdb")

Maar hoe met ADO ?

Verwijderd

Heb je wel een referentie naar Microsoft ActiveX Data Objects 2.x? Check onder Project -> References.

Maar je bent niet echt duidelijk...

  • gotcha
  • Registratie: Oktober 1999
  • Laatst online: 29-07 18:20
als ik het goed begrijp wil je een database aanspreken met ADO in VB. daar zijn natuurlijk miljarden codesamples van te vinden maar goed hier een aanzetje:

stap 1)
ga naar Project|References en vink aan
"Microsoft ActiveX Data objects 2.x" (preciese versie doet er ff niet toe)

stap 2)
klop code:

Dim conDB As New ADODB.Connection
Dim recDB As New ADODB.Recordset
Dim strSQL As String

conDB.Open "typ hier je database connection string"
strSQL = "SELECT iets uit je database"
recDB.Open strSQL,conDB
While Not recDB.EOF
. doe iets leuks met je records .
Wend
recDB.Close
conDB.Close

succes :)


(owja, wat betreft vanuit code aanmaken van commondialogs enzo... ik geloof dat ik wel eens truken heb gezien waarmee dat wel kon maar da's niet zoals microsoft het ooit bedoeld had en bovendien lang niet altijd toepasbaar)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Het staat zelfs in MSDN beschreven hoe en wat.
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
Private Declare Function GetOpenFileName _
  Lib "COMDLG32.DLL" Alias "GetOpenFileNameA" _
  (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName _
  Lib "COMDLG32.DLL" Alias "GetSaveFileNameA" _
  (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
  lStructSize    As Long
  hwndOwner    As Long
  hInstance    As Long
  lpstrFilter    As String
  lpstrCustomFilter As String
  nMaxCustFilter    As Long
  nFilterIndex  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

Sub GetFileFromAPI ()
  Dim OFN As OPENFILENAME
  With OFN
    .lStructSize = Len(OFN)     ' Size of structure. 
    .nMaxFile = 260      ' Size of buffer. 
    ' Create buffer.
    .lpstrFile = String(.nMaxFile - 1, 0) 
    Ret = GetOpenFileName(OFN)  ' Call function. 
    If Ret <> 0 Then        ' Non-zero is success. 
    ' Find first null char. 
    n = InStr(.lpstrFile, VbNullChar)   
    ' Return what's before it.  
    MsgBox Left(.lpstrFile, n - 1)  
    End If
  End With
End Sub

Er horen nog wat flags bij, die definites kun je erzelf wel bij vinden...

oogjes open, snaveltjes dicht


Verwijderd

Op donderdag 10 januari 2002 21:48 schreef gotcha het volgende:
...
Dim conDB As New ADODB.Connection
Dim recDB As New ADODB.Recordset
Dim strSQL As String

conDB.Open "typ hier je database connection string"
strSQL = "SELECT iets uit je database"
recDB.Open strSQL,conDB
While Not recDB.EOF
. doe iets leuks met je records .
Wend
recDB.Close
conDB.Close

succes :)
...
Misschien een beetje zaniken maar deze code is dus heel vaud, als je het mij vraagt (de essentie is wel goed).

De aangemaakte objecten (New) zijn namelijk niet opgeruimd met Set obj = Nothing. Je houdt dus een ADODB en ADORS object in je geheugen (memory leak).

Bovendien moet je oppassen met 'Dim X As New'. Het volgende voorbeeldje ter illustratie
code:
1
2
3
4
5
6
7
Dim X As New ADODB.Connection
Set X = Nothing
If X Is Nothing Then
   MsgBox "En dit wordt niet uitgevoerd"
Else
   MsgBox "Maar dit wel, want X is niet niks."
End If

Bovengenoemd voorbeeld kan beter zijn:
code:
1
2
3
4
5
6
7
8
Dim X As ADODB.Connection
Set X = New ADODB.Connection
Set X = Nothing
If X Is Nothing Then
   MsgBox "En dit wordt nu wel uitgevoerd"
Else
   MsgBox "Maar dit niet, want X is niks. "
End If

Het lijkt niet belangrijk, maar je kan voor leuke verassingen komen te staan als je d'r geen rekening mee houdt.
Pagina: 1