18. april 2006 - 16:09Der er
33 kommentarer og 2 løsninger
Flere af samme dim volder problemer
Hey
Jeg har bygget en side på som følger:
if action = "opret" then Her oprettes en række i en db. og her dim'es i dim i elseif action = "ret" then Her rettes en række i en db. og her dim'es i'en igen dim i end if
Hvorfor melder den, at: Name redefined Dim i ----^
Ja, men det er ikke det der er afgørende for om en dim kan bruges igen eller ej - det er scopet der afgør om du kan generklære et variabelnavn og i dit tilfælde ligger de to dim-sætninger i samme scope. Scope for dimensioneringer afgrænses f.eks. af sub og function, men altså ikke af if-sætninger.
Hvis du er rigtig doven lader du bare være med at dimensionere dine variabler (vil jeg dog ikke anbefale :)) - så slipper du for dette problem. Hvis du ikke kører med Option Explicit er der ikke umiddelbart nogen gevinst ved at dimensionere dine variabler i VBS.
Aha, den helt store problem er så, at dim'en "dimmens" i en .asp fil, der blir indkluderet på siden (jeg gør brug af en RTE editor, og ja, den blir jo inkludret de to steder, men i princippet ikke samtidig (og ja, så alligevel :)
Som sagt har det ringe eller ingen værdi at dimensionere en variabel, hvis du ikke kører med option explicit. På den anden side, hvis du kører med option explicit, så SKAL du dimensionere dine variable, hvilket har stor værdi ifht. at undgå stavefejl i variabelnavn, da siden fejler, hvis du forsøger at bruge en variabel der ikke er erklæret...
Ang. din kommentar fra 18/04-2006 16:19:08, så er jeg ikke helt sikker på at jeg forstår hvad du vil sige. Kan du evt. omformulere det?
Kan så nævne et includes bliver hentet ind FØR der dim's. Den samler altså det hele til en stor fil før den den overhoved læser koden. Derefter kikker den siden igennem for dim's og reservere plads til dem i hukommelsen (funktioner/subs undtaget. Der dim's først når funktionen køres og de får deres egen plads)
ps. Dette er meget forenklet, men det er sådan du skal opfatte kørslen af dine ASP sider.
Det lyder rigti interessant begge to. Jeg har lige to spm mere: 1. Uddyb option explicit ? 2. Jeg har stadig ikke set meningen i at dimensionere mine variabler? Virker det hurtigere, bedre eller hvad?
---------- Jo, ser i, jeg bruger en RTE editor til at skrive ting til databasen i et cms system, og siden tilfoej.asp er bygget op om en if-sætningen, hvor man enten kan rette i en tekst fra db eller oprette en tekst.
Derved er den linje så dobbelt: <!-- #include file="RTE_editor_inc.asp" --> og det er i denne fil, at i dimensioneres.
Ad 1. Option Explicit betyder blot at VBS-fortolkeren KRÆVER at alle variable er dimensioneret inden du kan bruge dem og det har som sagt den behagelige effekt, at du bliver mindet om hvis en variabel ikke er dimensioneret (og dermed er chancen for at du har variable med stavefejl mindre).
Ad 2. Uden Option Explicit har det som sådan ikke nogen effekt at dimensionere en variabel inden du bruger den, da VBS-fortolkeren sørger for at dimensionere dem hvis de ikke er dimensioneret i forvejen. Jeg vil altså fastholde (og jeg kan se at cpufan er enig) at der ikke er nogen grund til at dimensionere din variable hvis du ikke bruger Option Explicit.
Hvordan du løser det problem med at inkludere den samme fil 2 gange... tjaa... du kan jo lade være. Hvorfor ikke bare inkludere den ubetinget én gang... så er det problem løst? I øvrigt vil indeholdet blive inkluderet uanset om du lægger en betingelse omkring include eller ej (som fennec også er inde på). Hvis du ikke kan inkludere filen uden at der er en betingelse omkring, så har du et arkitektur-problem, som du bør løse i stedet for at forsøge, at vride armen rundt på ASP... :)
Som fennec siger: allokere plads i hukommelsen til den værdi som en variabel skal indeholde.
Option Explicit benyttes når du vil sikre dig at VBS ikke autoamtisk allokerer plads til variable (som den vil gøre hvis du IKKE bruger Option Explicit og IKKE dimensionerer dine variable inden du bruger dem) - dvs. den bør du altid bruge... :)
<%@ language="vbscript" %> <% Option Explicit ' Dette SKAL være den første kodelinie i modulet
' sidens VBScriptkode %>
Bemærk flg.:
1. Der må kun være en linie i en hel side (dvs. inklusiv alle includes der måtte være på en side) der har linien Option Explicit.
2. Linien Option Explicit SKAL være den første linie på en side, dvs. den SKAL placeres før noget VBScript-kode, men OGSÅ før noget somhelst HTML-kode (da HTML-kode af ASP omsættes til en Response.Write(HTML-kode) og dermed fungerer som en VBS kodelinie).
Mht. dim og nødvendigheden og brugen heraf, så er jeg nød til lige at korrigere migselv, for det har naturligvis en stor værdi at erklære lokale variable, dvs. variable som ligger i sub og functions selvom du ikke bruger Option Explicit. Dette sikrer at du ikke uforvarende kommer til at overskrive værdien af globale (PFUI!!!) variable der måtte have navnesammenfald. Det kan godt virke en smule overflødig i mindre siders VBS, men hvis du inkluderer mange filer med globale variable i flere sider, kan det godt være svært at gennemskue om en variabel er erklæret eller ej, så derfor et par tommelfingerregeler:
1. Brug såvidt muligt aldrig globale variable
2. Erklær ALTID lokale variable med dim, dvs. variable som opstår og nedlægges indenfor scopet af en sub eller function. Bemærk at parametre til en sub eller function allerede er erklæret lokalt idet de fremgår af parameterlisten.
softspot >> Er det ikke lidt svært at undgå globale variable?? Jeg har i hvertfald altid flere af dem... Mit trik er at navngive funktions variabler så de starter med f (f.eks fTemp), så jeg på den måde undgår, at de har samme navn som en af de globale.
fennec >> Jo, det kræver en del disciplin at undgå globale variable, men jeg tror godt det kan lade sig gøre, hvis man er rigtig artig... men man skal jo også tænke på omkostningerne ved at gennemføre sådan et projekt uden brug af globale variable, så derfor siger jeg også "såvidt muligt".
Det man skal opveje er risikoen for at få problemer med sammenblanding af globale og lokale variable og den tid man kan komme til at bruge på at fejlfinde pga. det kontra den tid man skal bruge ekstra for at håndtere at man ikke bruger globale variable (men det er nok mere et spørgsmål om at tænke på en bestemt måde, når man koder - og være konsekvent! :)
Din metode med en særlig navngivning af globale variable er også ganske effektiv og anbefalelsesværdig, men igen disciplineret udøvet - standarder er kun gode hvis de følges :)
En global variabel er en variabel der kan "ses" overalt i programmet. En lokal variabel kan kun ses indenfor det scope hvor den er defineret (i VBS er det praktisk talt vel kun i sub og functions).
Eksempel:
<% dim gTest ' Denne variabel er global gTest = 5
function funcTest() dim lokalTest ' Denne variabel er lokal og kan kun ses og aflæses i funktionen funcTest lokalTest = 10 * gTest funcTest = lokalTest end function
Som du måske kan se, så erklæres gTest globalt, dvs. udenfor nogen funktioner eller subs og er dermed global, hvorimod lokalTest erklæres inde i funktionen funcTest og er dermed lokal. lokalTest (som den er defineret i funktionen funcTest, dvs. med værdien 10) er ikke tilgængelig udenfor funktionen. Hvis du prøver at udføre koden, vil du opleve at den alligevel kan udføres, men at lokalTest er tom (og ikke 10 som man måske ville forvente).
Rent bort set fra det, så er dette et større område som du nok bør finde en bog der kan forklare dig, for det bliver nærmest til et onlinekursus, hvis alle disse begreber skal forklares her... :)
Aah, nu er jeg helt med.. Tak skal i have begge to.. Jeg forhøjer lige pointene, for det var jo ikke helt det problemet var i starten :)
----------------------
Men tilbage til spørgsmål: Problemet er, at denne Rich Text Editor jeg bruger, indgår to gange, fordi siden som sagt er delt i to vha af en if sætning. Og hver gang man skal bruge denne editor, skal man en fil. og det er er i denne fil at der jo så dim'es de samme variabler. Er jeg nødt til at splitte siden i 2 dokumenter så eller kan man slet ikk komme rundt om det?
Ja, at lægge dimensioneringer af (eller kendskab til) variable, som logisk hører til i en includefil, ud i den side der benytter includefilen er i direkte modstrid med almindelige principper om indkapsling, så hvis det er det du mener - har du fuldstændig ret i at jeg er modstander af det :D
Det være sagt, så lægger den gængse metode at kode ASP-sider på (dvs. ad-hoc programmering) ikke op til at man indkapsler, så det er et stykke hen ad vejen et spørgsmål om temperament... men jeg synes nu stadig at den finte med at dimensionere variable i siden der inkluderer er lige grov nok ;-)
softspot >> Det er vi så også enige om, og det er en løsning jeg heller ikke vil fortrække. Her ville jeg indkapsle indholdet af includes i en funktione også kalde den.
Men måske vi skulle se noget mere specifikt kode fra cyberkox. For afhængig af hvordan det ser ud, vil jeg anbefale forskellige løsninger...
<!-- Her smides Web Wiz Rich Text Editor ind --> <!-- #include file="RTE_editor_inc.asp" --> <- Den er den fil der har en MASSE dimmer i <textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>
Skriv til databasen
elseif action = "ret" then
<!-- Her smides Web Wiz Rich Text Editor ind --> <!-- #include file="RTE_editor_inc.asp" --> <- Den er så den samme fil som før der har en MASSE dimmer i <textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea>
Joe, det kan jeg vel godt - Problemmet er bar at en side også kalder 2 sider mer og de næste gør det samme igen. Så det er ret omfattende at ændre det hele.?
'If this is an RTE enabled web browser load in the RTE content If RTEenabled() <> "false" Then
' 'Load in Javascript for RTE browsers Response.Write(vbCrLf & "<script language=""JavaScript"" src=""RTE_javascript.asp?textArea=" & Server.URLEncode(strTextAreaName) & """ type=""text/javascript""></script>")
'If this is not an RTE enabled web browser load in the NON-RTE content Else
'Load in Javascript for non-RTE browsers Response.Write(vbCrLf & "<script language=""JavaScript"" src=""non_RTE_javascript.asp?textArea=" & Server.URLEncode(strTextAreaName) & """ type=""text/javascript""></script>")
'Display an message that the user is using the non-RTE editor Response.Write(vbCrLf & "<script language=""JavaScript"">") Response.Write(vbCrLf & " alert('Your web browser is not Rich Text Enabled.\nYou are using the standard text box area.');") Response.Write(vbCrLf & "</script>") End If
if action = "opret" then <!-- #include file="RTE_editor_inc.asp" --> <textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea> elseif action = "ret" then <!-- #include file="RTE_editor_inc.asp" --> <textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea> end if
Det kan jo skrives sådan:
if mode = "opret" or mode = "ret" then <!-- #include file="RTE_editor_inc.asp" --> <textarea name="tekst" cols="83" rows="15" id="myTextarea"></textarea> end if
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.