Avatar billede stigc Nybegynder
12. januar 2002 - 20:03 Der er 10 kommentarer og
2 løsninger

Syntaks

Sider og læser bogen \"desktop application with microsift Visual absci 6.0\" og har stødt ind i nogen uklarheder.


1. Så videt jeg forstår er det her;

dim temp as class1
set temp = new class1

langsommer end det her;

dim temp as new class1

Men alle steder i bogen bruger de den første kodestump til at oprette et object. Har jeg misforstået det, og er det første den hurtigste måde



2. Jeg har lavet et windows API kald, men undrer mig over at \"MsgBox strWinDir & \",\" & Len(strWinDir)\" ikke giver mig windows directory samt en komma samt længnden på strengen. Det giver mig kun windows directory. \"MsgBox Len(strWinDir)\" giver mig længden på strengen som er 255 tegn. Desuden undrer det mig jeg ikke kan se alle a\'er som jeg har fyldt ind i strengen fra starten, når den nu siger at strengen er 255 tegn lang. kode:

Private Declare Function GetWindowsDirectory Lib \"kernel32\" Alias \"GetWindowsDirectoryA\" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Sub Command1_Click()

    Dim strWinDir As String
    Dim lngLen As Long
    strWinDir = String(255, 65)
    MsgBox strWinDir
   
    lngLen = GetWindowsDirectory(strWinDir, Len(strWinDir))
   
    MsgBox strWinDir & \",\" & Len(strWinDir)
    MsgBox Len(strWinDir)


End Sub
Avatar billede kedde65 Praktikant
12. januar 2002 - 20:17 #1
1>> Ja det er dig der har misforstået det. Det er første kode stump der er den hurtigste....der laver man en early binding, som er klart hurtigere end late binding som bruges i eksempel nr. 2

Kedde
Avatar billede kedde65 Praktikant
12. januar 2002 - 20:21 #2
2>> prøv at bruge flg. kode istedet for.

Private Declare Function GetWindowsDirectory Lib \"kernel32\" Alias \"GetWindowsDirectoryA\" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Sub Command1_Click()

    Dim strWinDir As String
    Dim lngLen As Long
    strWinDir = String(255, \" \")
    MsgBox strWinDir
   
    lngLen = GetWindowsDirectory(strWinDir, Len(strWinDir))
   
    MsgBox strWinDir & \",\" & Len(strWinDir)
    MsgBox Len(Trim(strWinDir))


End Sub

Avatar billede kedde65 Praktikant
12. januar 2002 - 20:24 #3
Faktisk er det variablen lngLen der indeholder længden på biblioteket du hiver fat i.

Kedde
Avatar billede stigc Nybegynder
12. januar 2002 - 21:47 #4
Så vidt jeg ved har det ikke noget med early binding at gøre:

det her er late binding:

dim x as object


Det her:

dim temp as class1
set temp = new class1

er vel det samme som:

dim temp as new class1

det gøres bare på en linie.

Har du bogen?



Avatar billede stigc Nybegynder
12. januar 2002 - 21:48 #5
kedde65 >> Hvad gør din kode 2, andet end at fylde mellerum i strengen, og at trimme for mellemrum?
Avatar billede kedde65 Praktikant
12. januar 2002 - 22:38 #6
Hvad du siger med late binding er også rigtigt, men det jeg siger omkring late binding er nu også rigtigt....mener jeg :-))

Hvorom alting er, så sker der det at objektet først bliver lavet når det bliver refereret til, hvorimod den anden kode der bliver objektet oprettet samme sted som det står.

Min kode 2 gær det du siger, men det var bare for at kunne finde win biblioteket frem. Det er dog ikke den rigtige måde at gøre det. Brug istedet for lnglen variablen der indeholder streng længden.

Nej jeg har IKKE bogen.

Kedde
Avatar billede johs_j Novice
12. januar 2002 - 22:43 #7
dim temp as class1
set temp = new class1
langsommer end det her;
dim temp as new class1

For at du kan anvende disse linier skal du først oprette en Class1. Det gøres ved at du tilføjer en ClassModule til dit project, og her skriver du så den kode der skal til for at oprette en classe.

Avatar billede kedde65 Praktikant
12. januar 2002 - 22:51 #8
Nej Johs_j!!! Det er altså ikke rigtigt....

Flg. er taget fra MS hjemmeside

\"Note  Using variables declared using the New keyword can slow your application. Every time Visual Basic encounters a variable declared using New, it must test whether or not an object reference has already been assigned to the variable.\"

Avatar billede stigc Nybegynder
12. januar 2002 - 23:10 #10
hvis jeg laver et loop der kører 1000 gange med henholdvis

dim temp as class1
set temp = new class1

og

dim temp as new class1

så er det sidste hurtigst færdig.
Avatar billede kedde65 Praktikant
12. januar 2002 - 23:15 #11
Fint, så har du jo selv opklaret spørgsmålet. Men det er jo ikke sikkert at fordi din \"benchmark\" test giver det samme resultat hvergang. Når selv MS gør opmærksom på at der er lidt problemer med den nederste syntaks, så bør man nok tage det til efterretning.

Kedde
Avatar billede jennemaan Nybegynder
14. januar 2002 - 11:47 #12
Forskellen på:

Dim dingdong As New Bell

og

Dim dingdong As Bell
Set dingdong = New Bell

er som følger:


Ved:

Dim dingdong As New Bell

dingdong bliver først instansieret første gang jeg tilgår objektet, f.eks.:

dingdong.Ring \'Her instansieres objektet

Bag ved scenen foregår følgende:

If dingdong = Nothing Then
  Set dingdong = New Bell
End If
dingdong.Ring


Ved anden fremgangsmåde:

Dim dingdong As Bell
Set dingdong = New Bell

Instansieres objektet ved \"Set dingdong = New Bell\"

Der kan nu arbejdes med objektet uden \"If sætningen\".

Konklusion:

Dim dingdong As New Bell

For x=1 To 10000
  dingdong.Ring
Next x

ER langsommere end

Dim dingdong as Bell
Set dingdong = New Bell

For x=1 To 10000
  dingdong.Ring
Next x


idet der ved sidste eksempel ikke skal testes om objektet er instansieret, hver gang det tilgås.

Iøvrigt frarådes:

dim dingdong As New Bell

fordi at instansieringen ikke bliver foretaget eksplicit, hvilket betyder at du dybest set ikke selv kontrollere hvornår og hvordan objektet bliver instansieret.

Eksempel på fejlmulighed:


Dim dingdong As New Bell

dingdong.Volume=100

Set dingdong=Nothing

dingdong.Ring

Hvis man ikke lige er opmærksom på at objektet er blevet termineret kan man godt undre sig over at dingdong.Ring ikke foregår med en Volume på 100...

Dette er godtnok et banalt eksempel, tilgengæld ved jeg at autoinstansiering kan give anledning til nogle ret uforudsigelige eksekveringer.

Late Binding betyder at man ikke har en objekt reference i sit projekt, men at man bruger CreateObject(CLSID) til instansiering. -Dette medfører et opslag i registry for at finde den seneste version der har det pågældende Class ID. Dette opslag spares ved earlybinding og er derfor væsentlig hurtigere.

/Jennemaan

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