Avatar billede benneharli Juniormester
15. maj 2007 - 23:49 Der er 15 kommentarer og
2 løsninger

Lave et safearray

Er der nogen der har nogen idé om hvordan man gør det?

Havde et spørgsmål 778390 men har besluttet mig for at smide flere point efter det, da det åbenbart ser ud til at være et spejet tema
Avatar billede benneharli Juniormester
15. maj 2007 - 23:49 #1
Avatar billede kjulius Novice
16. maj 2007 - 08:37 #2
Det ville måske hjælpe, hvis du skrev hvad fejlmeldingen er, og hvor den opstår.

Er arrayet dimensioneret uden for subrutinen? Ellers skal du vel have dimensioneret det, f.eks. Dim Arr(10) As Long
Avatar billede benneharli Juniormester
17. maj 2007 - 20:48 #3
Det her er beskrivelsen:

SetSearchFilterEx(VARIANT * pvarSearchFilter)
Sets the cameras to be included or excluded from the search method.

Parameter: pvarSearchFilter
Type: VARIANT *

Safearray of search camera list. The first byte is the number of cameras in the array. The size of the array is the number of cameras plus 1. Set the byte corresponding to the camera index to 1 for search and 0 for excluding in the search. For example, to search camera 1,2, and 5 for a 5 camera system. The array should look like.

Long filterCamera[5];
filterCamera[0] = 5;
filterCamera[1] = 1;
filterCamera[2] = 1;
filterCamera[3] = 0;
filterCamera[4] = 0;
filterCamera[5] = 1;

Komandoen skulle så være noget i stil med:
RVCtl_SetSearchFilterEx("MIT_SAFEARRAY" * pvarSearchFilter)
Avatar billede benneharli Juniormester
17. maj 2007 - 20:51 #4
Den kode jeg har lige nu ser sådan her ud:

ReDim cameraFilter(9)

cameraFilter(0) = "9"
cameraFilter(1) = "1"
cameraFilter(2) = "0"
cameraFilter(3) = "0"
cameraFilter(4) = "0"
cameraFilter(5) = "0"
cameraFilter(6) = "0"
cameraFilter(7) = "0"
cameraFilter(8) = "0"
cameraFilter(9) = "0"

RVCtl.setSearchFilterEx(cameraFilter() * pvarSearchFilter)

----------------------------------------------------------------

Og det giver mig fejlen: Indekset er uden for området: 'cameraFilter'

Har også prøvet med:
ReDim cameraFilter(9) As Long - men så får jeg en besked om at der blev forventet en ")"
Avatar billede kjulius Novice
17. maj 2007 - 23:04 #5
Hmmm.. Hvis jeg ellers læser beskrivelsen rigtigt, så skal der kun sendes én variabel til funktionen. *-tegnet angiver vist bare, at den skal sendes som en ByRef type, og det er jo VBA's normale måde at sende parametre (hvis en funktion kræver, at en parameter sendes "by value", skal man explicit angive ByVal foran parameternavnet).

Så for mig at se, skal du kun sende dit array til dit COM objekt. Så jeg ville prøve med:

RVCtl.setSearchFilterEx(cameraFilter())
Avatar billede benneharli Juniormester
17. maj 2007 - 23:27 #6
ok... og med hensyn til at konstruere safearray'et??? får stadig samme fejl selvom jeg bruger din syntaks...
Avatar billede benneharli Juniormester
17. maj 2007 - 23:28 #7
og ja, det er et array jeg skal sende til et COM objekt
Avatar billede kjulius Novice
18. maj 2007 - 01:23 #8
Har du prøvet at tildele arrayelementerne et tal i stedet for en streng? Jeg antager, at når du tildeler elementerne strenge, vil de indeholde adressen til strengen, hvilket, hvis COM objektet opfatter det som et tal, for element 0 vil pege "forbi" de definerede elementer i arrayet. Det kunne foranledige objektet til at returnere den angivne fejlmelding. Prøv:

ReDim cameraFilter(9)

cameraFilter(0) = 9
cameraFilter(1) = 1
cameraFilter(2) = 0
cameraFilter(3) = 0
cameraFilter(4) = 0
cameraFilter(5) = 0
cameraFilter(6) = 0
cameraFilter(7) = 0
cameraFilter(8) = 0
cameraFilter(9) = 0

RVCtl.setSearchFilterEx(cameraFilter())

Jeg er lidt forvirret mht. den Long der står i definitionen ud for element 0. Måske skal man tildele en "Long" værdi (en array af Variant typen kan jo indeholde informationer i alle de andre variabeltyper). Så måske skal det i virkeligheden være:

cameraFilter(0) = 9&

(hvor & tegnet indikerer, at værdien er at opfatte som en Long værdi)
Avatar billede benneharli Juniormester
18. maj 2007 - 01:57 #9
nope...

Indekset er uden for området: 'cameraFilter'
Avatar billede kjulius Novice
19. maj 2007 - 00:14 #10
Måske er det bare en fiks idé, men jeg bliver ved at kredse om den Long instruktion på element 0. Jeg tror det betyder, at elementet skal udfyldes med en værdi af long typen. Desværre så understøtter VBScript ikke den direkte tildeling af en long-værdi angivet som f.eks. arr(0)=1&, sådan som jeg skrev tidligere. Det kan man i VB og VBA, men altså ikke i VBScript. Når man bare skriver arr(0)=1, bliver det lagret som en integer (det kan man se, hvis man laver en "msgbox vartype(arr(0))", som skal udskrive værdien 3, for at det er lagret som en long. Men den skriver 2 i stedet - altså en integer.

Det fik mig en stund til at tvivle på, at det kunne lade sig gøre i VBScript, men det kan faktisk lade sig gøre. Det ser bare lidt mærkeligt ud, for man er nødt til at lave noget aritmetik med to værdier, som behøver long (altså er større end den højeste værdi der kan lagres i en integer). Hvis man tildeler værdien 9 kan man skrive:

cameraFilter(0) = 9999999-9999990
Avatar billede benneharli Juniormester
20. maj 2007 - 18:43 #11
same same... indekset er uden for området... Hm...
Avatar billede benneharli Juniormester
24. oktober 2007 - 16:19 #12
nogen nye paa banen?
Avatar billede kjulius Novice
24. oktober 2007 - 20:54 #13
Hvis ikke der er nogen nye på banen, så kunne jeg godt tænke mig, at du prøver dette her:

cameraFilter = chr(5) & chr(1) & chr(1) & chr(0) & chr(0) & chr(1)

altså simpelthen en streng med en række bytes, der indeholder informationerne.

Det er så godt nok ikke et array i VBScript forstand, men det er jo dybest set et array af bytes. Og beskrivelsen taler jo om bytes.


Men strenge bliver jo ikke bare lagret som en række af bytes, de bliver lagret som en adresse til strengen + længden af strengen, så det dit COM objekt får "overrakt" er derfor noget, den først skal finde selv (den reelle streng). COM objekter er ofte skrevet C API'er og kan ikke umiddelbart bruges af VB, VBA og VBScript, som bruger specielle variabel typer. Ofte kræver det en wrapper, altså en "overbygning". Står der noget i dokumentationen om, hvilke sprog den understøtter?
Avatar billede benneharli Juniormester
15. januar 2008 - 21:06 #14
det giver mig den her meddelelse

Typer stemmer ikke overens: 'cameraFilter'
Avatar billede kjulius Novice
18. januar 2008 - 22:33 #15
Hmmm... jeg tror jeg giver op så (definitivt). :-(

Jeg er bange for, at der ikke er mange nye som finder vej til dette "gamle" spørgsmål. Så hvis jeg var dig, ville jeg lukke spørgsmålet og oprette det igen i en ny "indpakning". Man må jo ikke oprette det samme spørgsmål flere gange!! Måske har du så held til at tiltrække en "superekspert" eller to, som kan hjælpe dig. Måske burde du også alvorligt overveje at skifte sprog. VBScript er jo ikke verdens mest oplagte til den slags.
Avatar billede benneharli Juniormester
21. januar 2008 - 03:28 #16
ok... ellers tak for hjælpen... smid et svar så får du nogle point for slæbet...
Avatar billede kjulius Novice
21. januar 2008 - 23:15 #17
Beklager ikke at kunne hjælpe! :-(
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester