Oprettet ons. d. 10. juni 2009 kl. 12:58:01

staticdata
staticdata (14.994 point. Point ude: 0)

Dim nulstiller IKKE min variabel

Jeg har en procedure med erklæringen

Dim X as string

Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop.

Dette sker både i 2003 og 2007.

Når jeg ser hjælpen for Dim foranlediges jeg til at tro, at jeg så skal bruge "New":

Dim X as New String

Men så får jeg "Identifier expectet"

Hvad skal der til for at X er "" med statsgaranti lige efter erklæringen? Jeg kan ikke bruge "Så sæt den til blank", for det gælder også komplekse typer, hvor jeg ikke har lyst til at gå igennem dem allesammen for at nulstille dem.

Skrevet ons. d. 10. juni 2009 kl. 13:04:41| #1

mugs
mugs (162.412 point)
Der er vist ingen Dim af typen New String

Dim er jo en forkortelse af Dimension, altså hvilekn dimension kan variablen indeholde:

Dim As String > Både alfasnumerisk og numeriske værdier
Dim as Byte > Kun numeriske værdier op til en vis størrelse. Her er også Long og Double
Dim as Variant > Alt muligt
Og jeg har sikkert glemt nogle

Prøv efter loopet at sæte x til:

X = ""

Skrevet ons. d. 10. juni 2009 kl. 13:11:40| #2

staticdata
staticdata (14.994 point)
--Jeg kan ikke bruge "Så sæt den til blank", --
Fra Help har jeg:
___
Dim Statement

Declares variables and allocates storage space.

Syntax

Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
___

Det læser jeg som, at syntaksen ved brug af New i mit tilfælde er

Dim X as new string

Eller?

Skrevet ons. d. 10. juni 2009 kl. 14:09:38| #3

Eller?

Ellers godt forsøgt - du spotter noget du lige mangler ;)

Men ...

'as new' går på objekter - følgende er synonyme:

1.
Dim C as new Collection

2.
Dim c as Collection
Set c=new Collection


de simple typer som string er ikke en klasse der kan instantieres objekter fra, så new kan ikke bruges her.


Iøvrigt er ordet dim, der har været med os siden de første basic versioner sidst i 70'erne, stort set intetsigende - det giver højst lidt mening når det drejer sig arrays.

Det du siterer fra, er det noget Microsoft info? Måske allokeres der space (i nogle tilfælder), men det giver også et fejlagtigt indtryk af at der 'sker noget' i en  dim statement.

Første gang en variable BRUGES ELLER REFERERES initialiseres den.

Hvorfor er det for komplekst selv at tildele værdi- har du noget kode vi må se?

Skrevet ons. d. 10. juni 2009 kl. 14:27:44| #4

staticdata
staticdata (14.994 point)
Type BrPar
ReturKode As String
OrgNo As String
KommuneKode As String
Kommune_navn As String
Sektor As String
Sektor_navn As String
Sektor_VPS As String
Nace As String
Nace_navn As String
OrgNavn As String
Isin As String
LangtOrgNavn As String
LangtVpNavn As String
TimeStampDato As Date
TransMode As Integer
End Type

'' og i koden:


Dim brvar As BrPar
Dim OrgNoMsg As String
If OrgNoMsg <> "" Then MsgBox "What"  'Her stopper den <<---
brvar.Nace_navn = "" ' mystiks fejl. Denne (og de andre) er IKKE blanke, selvom de netop er erklæret!

___

Det vil være lidt tungt at skulle nulstille alle disse variable før jeg gik i gang med programmeringen - også med "with":

brvar.ReturKode = ""
brvar.Nace_navn = ""

osv...

Skrevet ons. d. 10. juni 2009 kl. 14:28:51| #5

staticdata
staticdata (14.994 point)
ps jeg citerer fra den hjælp, der kommer, når jeg står på Dim og trykker F1.

Skrevet ons. d. 10. juni 2009 kl. 15:39:12| #6

Jeg kan ikke se noget fejl i det du har postet - der må have været noget kode før der har tildelt værdi til BrPar.


Sub verifyThatDimDontInitaliseAnything()
    Do
        Dim br As BrPar
        br.KommuneKode = br.KommuneKode & "-komkode-"
    Loop Until Len(br.KommuneKode) > 80
    Debug.Print br.KommuneKode
End Sub

På overfladen er  vba et røvsygt sprog - først når man dykker ned i disse detaljer bliver det interessant.


To workarounds for at kunne genbruge en BrPar

1.
Sub testtypestuff()

    Dim br(2) As BrPar
    'br(0) er den der bruges
    br(0).KommuneKode = "komkode"
    Debug.Print br(0).KommuneKode
   
    'her slettes br(0)
    br(0) = br(1)
    Debug.Print br(0).KommuneKode
   
End Sub


2.
Omstrukturer koden så anvendelse af BrPar pakkes ind i et funktionsscope

Skrevet ons. d. 10. juni 2009 kl. 16:11:16| #7

staticdata
staticdata (14.994 point)
"Jeg kan ikke se noget fejl i det du har postet "

Det er jo dét, der er problemet

"- der må have været noget kode før der har tildelt værdi til BrPar"

Nope, det sker i starten af proceduren.

Din verify kunne gøres simplere som så:

    for i=1 to 2
      Dim br As BrPar
      if br.kommunekode<>"" msgbox"Ups"
      br.kommunekode="Manamana"
    next   

Men det er ikke dét, der er problemet! Problemet kommer, når jeg kalder proceduren inde i et loop, jf. spørgsmålet:

"Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop"

Jeg har UDEN HELD prøvet at genskabe med noget simplere kode:

Function ThisDrivesMeMad()

Dim X As String
Dim I As Integer

For I = 1 To 2
X = "Whoops" & Str(I)
Mad
Next

End Function

Private Static Function Mad2()
Dim X As String
If X <> "" Then MsgBox "Ups"
End Function
Private Static Function Mad()
Dim X As String
If X <> "" Then MsgBox "Ups"
Mad2
End Function



mugs - har du nogen idé om det?

Skrevet ons. d. 10. juni 2009 kl. 16:53:24| #8

For 3. og sidste gang:
'Dim nulstiller IKKE min variabel' er normal behavoir.

Skrevet ons. d. 10. juni 2009 kl. 17:13:39| #9

staticdata
staticdata (14.994 point)
Tryk F1 på "dim" i Access:

When variables are initialized, a numeric variable is initialized to 0, a variable-length string is initialized to a zero-length string (""), and a fixed-length string is filled with zeros. Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable.


Hvad har vi misforstået her?

Skrevet ons. d. 10. juni 2009 kl. 17:26:24| #10

mugs
mugs (162.412 point)
I er inde i den højere VBA-teori,som jeg ikke har meget forstand på.

Men det kunne være interessant at følge variablerne brvar og BrPar fra kodestart og se, hvornår de får en værdi og i givet fald hvilken for at sammenligne med andre variabler's indhold.

Skrevet ons. d. 10. juni 2009 kl. 17:42:38| #11

staticdata
staticdata (14.994 point)
Jeg kan IKKE lave et tilsvarende program helt fra startet, så jeg er sikker på, at her er en fejl... enten i programmet eller i dokumentationen.

Problemet ligger faktisk ikke i brvar/brpar - det er bare her, at det er besværligt at skulle nulstille dem hvergang jeg erklærer dem med Dim


Jeg har netop isoleret tildelingen således, hvor proceduren er kogt HELT ned til kun Dim og Set:

...
for i = 1 to 2
A
next i
...



Function A(....)

Dim OrgNoMsg as string
OrgNoMsg="Sat" '<--- her sætter jeg stop for at se indholdet.

End function.


Første gang A bliver kaldt, er OrgNoMsg blank umiddelbart efter "Dim", anden gang jeg kalder A er den "Sat".

Skrevet ons. d. 10. juni 2009 kl. 17:52:06| #12

'Hvad har vi misforstået her?'

At det har noget med Dim at gøre.

Det står der sådan set heller ikke at det har, det fortæller bare noget helt korrekt om initialisering af variabler.

Ud fra sammestillingen i hjælpen, kunne man så antage at denne initialisering fandt sted i en dim statement - men det har du jo så lige eftervist ikke er tilfældet. 1-0 til emperisk erkendelse ;)

Det forhold at Dim kun er en 'programmeringshjælp' - afslører stavefejl - kan undlades med mindre 'option explicit' forekommer, understreger også at det forholder sig sådan.

Skrevet tor. d. 11. juni 2009 kl. 09:12:29| #13

staticdata
staticdata (14.994 point)
Altså, det er ikke sandt, hvad der står i dokumentationen:

When variables are initialized, a variable-length string is initialized to a zero-length string ("").

Læg et svar ællebælle. Selvom du ikke har bidraget til forståelsen har jeg anvendt dit workaround med

Dim IamNew as BrPar
Dim IamToBeUsed as BrPar

IamToBeUsed=IamNew
...

--men det virker megasygt på mig -- og lad det samtidig være en advarsel til alle Access programmører.

og som andre programmører må jeg lade mig distrahere af virkeligheden.

Skrevet tor. d. 11. juni 2009 kl. 09:34:40| #14

Hej igen staticdata

Ingen flere Dim kommentarer herfra - men det må være træls at noget så grundlæggende som variablers scope pludselig opfører sig mærkeligt - at f.eks OrgNoMsg opfører sig som var den global eller static.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Dato og Klokkeslet "Live"

Oprettet den 11. februar 2012 kl. 19.39
jmarques giver 60 point for svar | Giv et svar »

Link til et dokument

Oprettet den 10. februar 2012 kl. 14.15
omn giver 60 point for svar | Giv et svar »

Formular med flere paramtre

Oprettet den 9. februar 2012 kl. 16.48
stuegnu giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger