/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
hjælp til at returnere en værdi fra en fun~
Fra : Christian M. Nielsen


Dato : 07-12-04 21:26

Hej.

Jeg har en side som viser nogle billeder der er uploadet via asp. Billederne
vises i thumbnails på en oversigtsside. Første gang en thumbnail skal vises,
så laver serveren det automatisk ud fra det billeder der er uploadet
tidligere. (så sparer jeg arbejdet med at uploade thumbnails også).

Jeg har lavet det således, at for hvert thumbnail, ser serveren efter om det
allerede eksisterer. Hvis ikke, så laves det ellers sker der ingen ting.
Dette sker i en funktion der kaldes når thumbnailen skal vises. Thumbnailen
gemmes med et andet navn end originalen. Mit problem er at få overført
navnet på thumbnailen til koden der skal vise den frem. Jeg kan ikke se hvad
jeg gør galt, men det er sikkert en banal fejl?

Koden (renset)

<% do while not ors.eof

Exist(strImageName) %>

<td ......... en masse kode>

<img src="<%=SmallImageName%>">

<td ......... noget andet kode>

<%oRs.movenext
Loop%>

Funktionen er vist herunder. Den værdi jeg gerne vil have vist (som
skitseret ovenfor) er: SmallImageName

Hvis jeg udskriver værdien lige før End Function, så virker den som den
skal.

<%
Function Exist(strImageName)

DIM FileObject, file, Image, VarSmallImageName, tmpSmallImageName,
tmpImageNameLength, ImageNameLength, SmallImageName, ImageType

ImageNameLength = len(""&Server.MapPath(""&strImageName&"")&"")
tmpSmallImageName = Right(strImageName, 5)
ImageType = Right(strImageName, 4)
VarSmallImageName = Left(tmpSmallImageName, 1)

IF NOT VarSmallImageName = "l" then

tmpImageNameLength = ImageNameLength - 4
SmallImageName = mid(Server.MapPath(""&strImageName&"")
,1,tmpImageNameLength) + "l" + ImageType

Set FileObject = CreateObject("Scripting.FileSystemObject")
file= SmallImageName

If NOT FileObject.FileExists(file) Then
'kode der laver thumbnail
end if

ELSE
SmallImageName = strImageName
end if

end Function 'Exist
%>

--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.




 
 
terje (07-12-2004)
Kommentar
Fra : terje


Dato : 07-12-04 23:36

Christian M. Nielsen wrote:

> Funktionen er vist herunder. Den værdi jeg gerne vil have vist (som
> skitseret ovenfor) er: SmallImageName

Hei Christian.
Det ser ut til at du forsøker å benytte en variabel som har såkalt scope
kun inne i funksjonen, et annet sted i koden. Det går ikke. La
funksjonen "Exist" returnere denne verdien, eller gjør den om til en
modul variabel og definer den øverst i filen: Dim m_sSmallImageName.
Merk prefixet m_ som forteller at dette er en modul variabel.

Deretter kan du bruke den overalt i filen etter at du har gitt den en verdi.

Så vil jeg si litt om måten du skriver din kode på. Den er svært
vanskelig å lese og forstå. Her er noen synspunkter:

1) Du benytter for lange og misvisende variabelnavn. Gjør dem
beskrivende og logiske, men også så korte som mulig. Dessuten skal du
som sagt gi dine variabler et prefix. En string variabel skal hete
sString eller strString osv. Søk litt på internett så finner du mer
veiledning om dette.

2) Også navnet du gir dine funksjoner er viktig. Denne heter "Exist".
Det er ok, men FileExists eller ImageExists er ennå bedre. Det er mer
dekkende for hva funskjonen faktisk gjør.

3) Bruk innrykk, "indention", for da blir din kode enklere å lese.

4) Ellers har jeg store problemer med å forstå hva din funksjon gjør.
Hvis du kan skrive på plain dansk hva den skal gjøre trinn for trinn så
kanskje vi kan hjelpe deg med f. eks. å komprimere den.

terje




Christian M. Nielsen (08-12-2004)
Kommentar
Fra : Christian M. Nielsen


Dato : 08-12-04 16:21

"terje" <late@night.zz> wrote in message
news:31mpklF3bdsqnU1@individual.net...

Hej Terje

> Hei > Det ser ut til at du forsøker å benytte en variabel som har såkalt
> scope kun inne i funksjonen, et annet sted i koden. Det går ikke. La
> funksjonen "Exist" returnere denne verdien, eller gjør den om til en modul
> variabel og definer den øverst i filen: Dim m_sSmallImageName. Merk
> prefixet m_ som forteller at dette er en modul variabel.
> Deretter kan du bruke den overalt i filen etter at du har gitt den en
> verdi.

Jeg er ikke helt klar over hvordan dette gøres? Kan du give et eksempel?

> Så vil jeg si litt om måten du skriver din kode på. Den er svært vanskelig
> å lese og forstå. Her er noen synspunkter:
>
> 1) Du benytter for lange og misvisende variabelnavn. Gjør dem beskrivende
> og logiske, men også så korte som mulig.

Mine variabelnavne er beskrivende. Når de læses giver det næsten sig selv
hvad de bruges til. Om de er lange eller korte, det er jo en smag sag.

>Dessuten skal du som sagt gi dine variabler et prefix. En string variabel
>skal hete sString eller strString osv. Søk litt på internett så finner du
>mer veiledning om dette.

Jeg bruger normalt også et præfiks, ala strSQL, og intArticleID men jeg
havde ikke brugt dem til denne funktion, mest fordi jeg ikke vidste hvad de
skulle være.

> 2) Også navnet du gir dine funksjoner er viktig. Denne heter "Exist". Det
> er ok, men FileExists eller ImageExists er ennå bedre. Det er mer dekkende
> for hva funskjonen faktisk gjør.

Du har ret

> 3) Bruk innrykk, "indention", for da blir din kode enklere å lese.

Det har jeg også i koden, men den er ikke "copy/pastet" direkte ind i
outlook express.

> 4) Ellers har jeg store problemer med å forstå hva din funksjon gjør. Hvis
> du kan skrive på plain dansk hva den skal gjøre trinn for trinn så kanskje
> vi kan hjelpe deg med f. eks. å komprimere den.

Jeg har smidt hele koden til funktionen her:
http://cmnielsen.dk/funktion.txt

forklaring er som følger:

Kontroller om 5 sidste bogstav er et l (lille L)
Hvis nej, så lav et thumbnail fra original og gem billedet
ellers så er SmallImageName = strImageName

Eksempel.

Originalbillede ligger i mappen "images"

mappath til billedet er:

e:\website\images\9942.jpg

funktionen laver et thumbnail og gemmer det med navnet 9942l.jpg

Mit prioblem er at få sendt navnet på thumbnail til min kode der skal vise
billedet.

--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.



Christian M. Nielsen (08-12-2004)
Kommentar
Fra : Christian M. Nielsen


Dato : 08-12-04 19:11

Jeg har løst problemerne. Forklaring følger senere.

--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.



terje (08-12-2004)
Kommentar
Fra : terje


Dato : 08-12-04 22:15

Christian M. Nielsen wrote:
> Jeg har løst problemerne. Forklaring følger senere.

Mens jeg venter på forklaringen så har jeg lekt meg litt med din kode og
har laget en litt annerledes utgave. Jeg må ta det forbehold at koden
ikke er testet og at jeg ikke kjenner detaljene i din applikasjon. Jeg
kjenner heller ikke AspImage. Dessuten la jeg ved en ekstra funksjon som
jeg ofte bruker for å lukke objekter.
Se om koden virker, Christian!


Function ThumbNailExists(sImgName)

Dim sImgPath
   Dim oFSO
   Dim oImage

   If Instr(sImgName, "l") > 0 Then ThumbNailExists = sImageName: Exit
Function
   sImgPath = Server.MapPath(Mid(sImgName, 1, Instr(sImgName, ".") - 1) & _
    "l." & Mid(sImgName, Instr(sImgName, ".") + 1, Len(sImgName)))

   Set oFSO = CreateObject("Scripting.FileSystemObject")

   If Not oFSO.FileExists(sImgPath) Then

    Set oImage = Server.CreateObject("AspImage.Image")

      With oImage
       .LoadImage(sImgPath)
         .FileName = sImgName
         .ResizeR 125, (125 / .MaxX) * .MaxY
         .SaveImage
      End With

      Call KillObject(oImage)

   End If

   Call KillObject(oFSO)

   ThumbNailExists = sImgPath

End Function


'--------------------------------------------------------------------------------------------------
' Comment: Killing Objects
'--------------------------------------------------------------------------------------------------
Sub KillObject(o)
On Error Resume Next

If IsObject(o) And Not (o Is Nothing) Then
Set o = Nothing
End If

Err.Clear
End Sub

Christian M. Nielsen (09-12-2004)
Kommentar
Fra : Christian M. Nielsen


Dato : 09-12-04 20:01

Jeg har skrevet koden lidt om, samt fjernet en af parameterne i min Dim
(SmallImageName).

Jeg har ikke testet din kode endnu, men jeg vil gøre det søndag hvor jeg har
tid næste gang.
BTW: Smart med KillObject. Den vil jeg bruge fremover.

Den kode jeg fik til at virke er som følger
-----------------------------------------------
Function ImageExist(strImageName)

DIM FileObject, file, Image, VarSmallImageName, tmpSmallImageName,
tmpImageNameLength, ImageNameLength, SmallImageName, ImageType

ImageNameLength = len(""&Server.MapPath(""&strImageName&"")&"")
tmpSmallImageName = Right(strImageName, 5)
ImageType = Right(strImageName, 4)
VarSmallImageName = Left(tmpSmallImageName, 1)
tmpImageNameLength = ImageNameLength - 4
SmallImageName = mid(Server.MapPath(""&strImageName&"")
,1,tmpImageNameLength) + "l" + ImageType

Set FileObject = CreateObject("Scripting.FileSystemObject")
file= SmallImageName

If NOT FileObject.FileExists(file) Then
Set Image = Server.CreateObject("AspImage.Image")
Image.LoadImage(Server.MapPath(""&strImageName&""))
Image.FileName = SmallImageName

Dim intYSize
intYSize = (125 / Image.MaxX) * Image.MaxY
Image.ResizeR 125, intYSize
Image.SaveImage

set Image = Nothing

end if

set FileObject = Nothing

Thumbnail = ""&SmallImageName&""

end Function
--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.



Christian M. Nielsen (17-12-2004)
Kommentar
Fra : Christian M. Nielsen


Dato : 17-12-04 20:04

"terje" <late@night.zz> wrote in message
news:31p9a1F3et26pU1@individual.net...

Hej Terje

Der gik lidt længere tid end jeg havde forventet før end jeg fik tid til at
se på din funktion.

Den ser ud til at virke fint. Jeg har dog ikke brugt det hele af den, da jeg
har lavet om på min sides opbygning siden jeg spurgte om hjælp.

Jeg fandt fejlen i mit oprindelige kode. Jeg havde en Dim af strImageName to
steder. Både inde i funktionen og i selve koden hvor den blev brugt første
gang. Grunden til dette var at jeg fik en fejlmeddelelse om at variablen
ikke var defineret i funktionen, så derfor kom den med der også.

Tak for hjælpen.
--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.



terje (17-12-2004)
Kommentar
Fra : terje


Dato : 17-12-04 22:36

Christian M. Nielsen wrote:

> Jeg fandt fejlen i mit oprindelige kode. Jeg havde en Dim af strImageName to
> steder. Både inde i funktionen og i selve koden hvor den blev brugt første
> gang. Grunden til dette var at jeg fik en fejlmeddelelse om at variablen
> ikke var defineret i funktionen, så derfor kom den med der også.

Det var i grunnen dette jeg var inne på i mitt første svar. Uansett,
fint at du fikk det til å fungere.

Dersom du skriver _Option Explicit_ øverst i alle dine asp filer så
unngår du alle problemer av denne typen. _Alle_ asp filer skal starte
med disse to ordene. Dessuten bør alle nybegynnere i ASP lære seg det
aller mest elementære:

- Alle variabler skal dimmes. Gjør dette øverst i funksjonen (lokale
variabler) eller øverst i filen (modul variabler). Ikke dim én variabel
her og en der. Hold dem samlet. I utgangspunktet bør hver variabel
dimmes på en egen linje. Har du veldig mange variabler så kan du
eventuelt dimme alle long variabler på en linje, alle string variabler
på en annen osv. Men om du har veldig mange variabler så bør du også
vurdere om ikke din kode kan forenkles. Ikke press tre asp filer inn i
én fil. Har du mer enn omtrent 300 linjer så bør du vurdere å splitte
opp koden i flere filer.

- Dernest skal variablene gis beskrivende og logiske navn. Gjerne også
så korte som mulig. Man skal faktisk bruke litt tid på dette. Vurder
ulike navnealternativer opp mot hverandre og velg så det beste. Du har
f. eks. en variabel som heter _tmpImageNameLength_ som ikke er spesielt
bra, for å si det diplomatisk. Av sammenhengen forstår jeg at den holder
en tallverdi fordi du skriver: tmpImageNameLength = ImageNameLength - 4.

For det første er denne variablen unødvendig fordi du like gjerne kunne
skrevet: ImageNameLength = (ImageNameLength - 4). For det andre er
navnet misvisende fordi den egentlig inneholder lengden på den fysiske
filbanen. Den burde derfor hete f. eks. _lngPathLen_ som også forteller
oss at dette er datatypen long.

- Så skal altså alle variabler ha et prefiks som forteller hva slags
datatype det er. I din funksjon har du en annen variabel som heter
"file". Hvis dette er f. eks. et filnavn så er det en string variabel.
Men det kan også godt være et object. For å finne ut av dette så må man
lese hele din kode. Det er faktisk _mye_ enklere da å navngi din
variabel som strFileName eller bare sFileName. Da ser man umiddelbart
hva det dreier seg om.

- Ikke skriv 300 linjer fra toppen og ned i "kronologisk" rekkefølge. Du
skal bygge opp dine asp filer med funksjoner og subber. Kode som du
bruker mer enn en gang skal du legge i en egen fil der du samler slike
funksjoner. Denne filen inkluderer du så i de andre filene som trenger
disse funksjonene. F.eks. legger du alle funksjoner som angår email i en
egen fil. Alle som angår FileSystemObject (fil funksjoner) i egen fil osv.

terje

PS: Vi knuser dere i finalen


Christian M. Nielsen (18-12-2004)
Kommentar
Fra : Christian M. Nielsen


Dato : 18-12-04 12:27

"terje" <late@night.zz> wrote in message
news:32h1siF3jtjgmU1@individual.net...

> Dersom du skriver _Option Explicit_ øverst i alle dine asp filer så unngår
> du alle problemer av denne typen. _Alle_ asp filer skal starte med disse
> to ordene. Dessuten bør alle nybegynnere i ASP lære seg det aller mest
> elementære:

Jeg har Option Explicit i toppen af alle filer. Alligevel brokkede den sig
over at variablen ikke var erklæret. Jeg fandt ikke ud af hvad der var galt,
men det virker fint nu.

> PS: Vi knuser dere i finalen


Hvis vi kommer i finalen, så tager vi guldet med hjem. Men I må da gerne
komme og se på det en gang i mellen

--

Mvh Christian http://www.cmnielsen.dk
What capital has 164 letters in its name? See my web page to find out.
Nyeste Artikel : Crenicichla compressiceps.
http://cmnielsen.dk/crenicichla.htm
The scary thing about looking for truth is that you might find it.



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste