17. december 2003 - 14:52Der er
19 kommentarer og 1 løsning
retunere et 2 dimentionelt array
For dem der har fulgt lidt med i tråden er dette en ongoing ting for mig :-)
jeg har denne funktion i et alm. modul Function testCheckQueue(QueueName() As String)
Dim Conn As ADODB.Connection Dim rs As ADODB.Recordset Dim StoppedQueues() As MyQueue
Dim x
Set Conn = New ADODB.Connection Set rs = New ADODB.Recordset strConn = "Driver={SQL Server}; Server=SOVS; Option=16834; Database=mosaic;"
Conn.Open strConn, "mosaic", "nopasswd" Dim testQueue As Byte ReDim StoppedQueues(UBound(QueueName)) For i = 0 To UBound(QueueName) sqlstr = "select name,id,state from Queue" _ & " where name = '" & QueueName(i) & "'"
Debug.Print sqlstr rs.Open sqlstr, Conn Do While Not rs.EOF
testQueue = rs!State If testQueue = 4 Then StoppedQueues(x).MyState = 4 Else testQueue = 0 End If StoppedQueues(x).MyQueue = rs!Name x = x + 1
rs.MoveNext DoEvents
Loop rs.Close Next i ReDim Preserve StoppedQueues(x, x) testCheckQueue = StoppedQueues()
End Function
i toppen af modulet har jeg defineret typen
Public Type MyQueue MyQueue As String MyState As Integer End Type
Når jeg kalder funktionen fra en sub i en form får jeg følgende fejl
Only user-defined types defined in public object modules can be coerced to or from a variant or passwd to late-bound functions
funktionen for et alm string array som param men det har jo ikke noet med det andet st gøre :-)
forklaring følger :-) brugeren vælger nogle queue i en list box som han gerne vil have overvåget. Disse queues hiver jeg ud i et array og sender dem til omtalte funktion. ud fra dette bliver der selected i databasen. nu vil jeg gerne retunere både queue navn og state således at jeg grafisk kan vise på en form hvad status er. er den f.eks 4 er den rød etc.....
Jo jo, men du har jo lige fyldt et type objekt ind i et array, så er der vel ikke nogen grund til at lave det 2. dimensionel, type objektet kan jo indeholde de 2 værdier for dig. Du fylder jo også ind i arrayet mens det kun er i en dimension.
Jeg tror faktisk der er noget grundlæggende omkring typer jeg ikke har fattet, nu virker den faktisk, men får så efterfølgende fejl når jeg vil læse dette array som jo åbenbsrt ikke længere er et srrsy men min type..
her kalder jeg funktionen of forsøger st læse men det går gslt
Dim tst As MyQueue 'tst = mosFunction.CheckQueue(Queue) tst = generalFunctions.testCheckQueue(Queue) End For i = 0 To UBound(tst.MyQueue) If Not tst(i).MyQueue = "" Then MsgBox "Denne kø ikke kører:" & tst(i) End If Next i
her er funktionen ,derefter den sub der kalder den :-)
Function testCheckQueue(QueueName() As String) As MyQueue
Dim Conn As ADODB.Connection Dim rs As ADODB.Recordset Dim StoppedQueues() As MyQueue
Dim x
Set Conn = New ADODB.Connection Set rs = New ADODB.Recordset strConn = "Driver={SQL Server}; Server=SOVS; Option=16834; Database=mosaic;"
Conn.Open strConn, "mosaic", "nopasswd" Dim testQueue As Byte ReDim StoppedQueues(UBound(QueueName)) For i = 0 To UBound(QueueName) sqlstr = "select name,id,state from Queue" _ & " where name = '" & QueueName(i) & "'"
Debug.Print sqlstr rs.Open sqlstr, Conn Do While Not rs.EOF
testQueue = rs!State If testQueue = 4 Then StoppedQueues(x).MyState = 4 Else testQueue = 0 End If StoppedQueues(x).MyQueue = rs!Name x = x + 1
rs.MoveNext DoEvents
Loop rs.Close Next i 'ReDim Preserve StoppedQueues(x, x) testCheckQueue = StoppedQueues()
End Function
********************************************************************* Denne funktion bliver kaldt her
public Sub
Dim i As Integer Dim Queue() As String Dim queueCnt As Integer
queueCnt = lstQueueSelected.ListCount ReDim Queue(lstQueueSelected.ListCount) For i = 0 To UBound(Queue) Queue(i) = lstQueueSelected.List(i)
Next i
Dim tst() As MyQueue tst() = generalFunctions.testCheckQueue(Queue)
For i = 0 To UBound(tst) If Not tst(i).MyQueue = "" Then MsgBox "Denne kø ikke kører:" & tst(i) End If Next i End Sub
Hej! ja nu virker det manglede () i min funktions definering. Ja så blev det vel til at jeg returnere at array af typen myqueue og ikke et 2 dimentionelt array. Dette er også meget smartere. Men :-)
Efter st jeg fik det til st virke i mit modul proøvede jeg at lave det i min klasse. Og her brokker den sig over
"cannot define a public user-defined type within a private object module" typen er deklareret i general declarations og jeg har både prøvet med private public m.m hmmm nogen forklaring eller løsning på dette
Jeg tror det er fordi jeg også anvender typen uden for klassen i min form og så er hele ideen med klasse moduler vel væk hvis man kunne det. ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.