Avatar billede oyejo Nybegynder
09. september 2005 - 14:56 Der er 8 kommentarer og
1 løsning

Definere en classe og opprette et object

Har tenkt å lære meg å "tenke" Object-Orientert.
Men jeg har litt problemer med å finne ut hva jeg
skal benytte til objekter.

Har noe kode som jeg benytter i vba for excel.

Dette er kode som ser gjennom en mappe for å finne csv-filer.
Hvis den finner csv-filer bir disse endret til txt-filer.

Kan jeg løse denne oppgaven ved å definere en abstrakt klasse,
som løser oppgaven?


Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoFld = fso.GetFolder(sCsvFld)

For Each fsoFil In fsoFld.Files
  If UCase(Right(fsoFil.Name, 3)) = "CSV" Then
    sFilNavn = Left(fsoFil.Name, Len(fsoFil.Name) - 3) & "txt"
    If fso.FileExists(fsoFld & sFilNavn) Then
      fso.DeleteFile (fsoFld & sFilNavn)
    End If
    fsoFil.Name = sFilNavn
  End If
Next
Set fso = Nothing
Set fsoFld = Nothing
Avatar billede oyejo Nybegynder
09. september 2005 - 14:59 #1
Er det mulig å definere en avledet klasse av Folder?
Da kunne et folderobject "ta vare på" sine egne filer.
Avatar billede picard Nybegynder
17. september 2005 - 11:44 #2
Hvilken version af VB snakker vi om.
VB5/6 er ikke specielt objektorienteret og understøtter IKKE nedarvning.
I VB.Net kan du nedarve.

mvh.
Christian
Avatar billede oyejo Nybegynder
19. september 2005 - 08:35 #3
Hei Christian
Det er egentlig VBA i Excel 2003, så jeg kan nok glemme nedarving.
Bør jeg definere en tekstFilklasse, som kan endre sin endelse fra csv til txt?
Så kan jeg kansje ha en folderklasse, som inneholder en samlig med tekstfilobjekter?
Hvordan ville i så fall koden se ut?

mvh
Oye
Avatar billede picard Nybegynder
19. september 2005 - 22:59 #4
Hej igen.

Her er et meget simpelt eksempel på en MAKRO der omdøber filer i en mappe.
Håber du kan bruge eksemplet. :)

mvh.
Christian

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

Private Sub Makro1
Const FILEEXT As String = ".CVS"
Const NEWFILEEXT As String = ".TXT"

Dim FilePath As String
Dim FileName As String
Dim Extpos As Integer

    FilePath = "c:\Christian" 'For testens skyld
    FileName = Dir(FilePath & "\*" & FILEEXT, vbNormal)
   
    While FileName <> ""
        Extpos = InStr(1, FileName, FILEEXT, vbTextCompare) - 1
        Name FilePath & "\" & FileName As FilePath & "\" & Left$(FileName, Extpos) & NEWFILEEXT
        FileName = Dir()
    Wend

End sub

----------------------------------------------------------
Avatar billede oyejo Nybegynder
20. september 2005 - 07:36 #5
Hei Christian

Koden som står i mitt opprinnelige spørsmål, fikser også den oppgaven.
Men nå hadde jeg lyst til å løse oppgaven objectoriert.
Så spørsmåleg går mere på hvordan jeg definerer et object og etterpå bruker det.

mvh
Oye
Avatar billede picard Nybegynder
20. september 2005 - 19:04 #6
Hej igen.

En klasse i VBA er ikke en klasse som du måske kender fra java eller DotNet.
I VBA er en klasse sådan set bare en container for en række metoder og attributter.


Hvis du laver et nyt class module og kalder den f.eks. clsFolder.
Du instantiere en instans af denne klasse ved at gøre følgende:

dim cFolder as new clsfolder

eller

dim cfolder as clsfolder
set cfolder  = new clsfolder

Du kan IKKE lave din egen constructor!
I din klasse definerer to dine metoder og dine attributter.
Skal du kunne tilgå dem gennem klassens laves de public, skal du kun tilgå dem inde i selve klassen, laves de private.

Du kunne evt. lave følgende function inde i klassen:

Private Function RenameFileInFolder(Path as string, OldExt as string, NewExt as string) as long

Dim FILEEXT As String = oldext
Dim NEWFILEEXT As String = newExt
Dim FilePath As String
Dim FileName As String
Dim Extpos As Integer
Dim RenameCount as long

    RenameCount  = 0
    FilePath = Path  'For testens skyld
    FileName = Dir(FilePath & "\*" & FILEEXT, vbNormal)
   
    While FileName <> ""
        Extpos = InStr(1, FileName, FILEEXT, vbTextCompare) - 1
        Name FilePath & "\" & FileName As FilePath & "\" & Left$(FileName, Extpos) & NEWFILEEXT
renamecount =renameCount +1
        FileName = Dir()
    Wend

    RenameFileInFolder = RenameCount

End function

Du kan også udvide funktionen så den "raiser" en event for hver fil den renamer.

Så skal du i dine erklæringer øverst i modulet skrive:
Public Event FileRenamed(Path as string, OldFileName as string, NewFileName as string)

I funktionen RenameFileInFolder skal du under "name filepath....."
Skrive raise FileRenamed (Filepath,  FilePath & "\" & FileName,FilePath & "\" & Left$(FileName, Extpos) & NEWFILEEXT)

Når du erklærer en klasse, der kan "raise events" og du ønsker at fange disse, skal du skrive private/public WithEvents cFolder as new clsFolder.

Du kan nu se klassens events, ligesom du vil gøre hvis det var en textbox.

Hisk at sætte din klasse til nothing når du er færdig med den. (Set cfolder = nothing)

Håber du kommer lidt videre.

mvh.
Christian
Avatar billede oyejo Nybegynder
21. september 2005 - 14:26 #7
Heisann
Ja dette er interesant. jeg vet ikke hva en kontruktør er for noe (ennå)

Men kan jeg lage en collection?
..og så benytte en for each løkke til å itere gjennom alle filene?

PS! hvis du svarer denne gang, benytt et svar, så er pointene dine :-)
Oye
Avatar billede oyejo Nybegynder
11. oktober 2005 - 11:37 #8
Fant to(3) gode turorials her:
Som gav gode svar på mitt spørsmål
http://www.developerfusion.co.uk/scripts/print.aspx?id=3959
http://www.developerfusion.co.uk/scripts/print.aspx?id=3965
http://www.developerfusion.co.uk/scripts/print.aspx?id=3966
det er noen bugs i koden, og noe tekst er gjenngitt to ganger,
men her er det mye bra!
Avatar billede oyejo Nybegynder
11. oktober 2005 - 11:40 #9
man kan velge printer freindly utgave på siden
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