Den här koden måste snabbas upp!!!! Ja, det förstår jag, Men jag vet inte hur jag ska lösa det... Det är den snabbaste lösningen jag kommit på hitills. Har gjort ett försök att snabba upp din kod. Men den är väldigt grötig. Har ej kunnat testa den: Followup delen är fel... Den första publica relesen kan ni ladda ner här: http://medlem.tripodnet.nu/Timpa/DM2.zip (828k) Du kan hämta en node genom dess nyckel(key). Om den saknas ger den ett fel. Ok, toror jag fatar vad du menar... ok, det gick snabbare med <code> Tycker inte Goto gör koden mindre överskådlig. Men om du vill att den ska gå ut båda looparna så lägger du till en Exit Do i slutet på If-Satsen: Kan du förklara lite snabbt vad du vill göra så ska jag se om jag kan hjälpa dig! Detta bör gå fort.... Jag vet att jag har dåliga variabler... men jag är så j*vla dålig på att komma på variabel namn. Jag aldrig gått någon kurs i vb så jag kan inte det så bra. Ja, men det är inte det som är grejjen med koden som jag har gjort.. hAmpzter, sorry att behöva säga det men din kod funkade inte alls. tror du har missat en eller två loopar. Hejsan igen... den var 1,5 till 2 sec snabbare än min kod när jag öppnade mitt c: på 10827 filer. Okej... :/ Har inte läst tråden så noga men jag tror nog att ni optimerar på fel ställe. det finns ett api lockwindowupdate för just detta.. Snyggt att vi antagligen har löst ett inlägg som det visst var 3 år sen det postades ;)Snabba upp koden!!!
<code>
Public Sub ExtrTree(GetDrive As String, ByVal FollowUp As String)
Dim tback As Node
Dim tback2 As Node
Form1.Tree1.Nodes.Clear
Set tback2 = Form1.Tree1.Nodes.Add(, , GetDrive, GetDrive, 1, 1)
Form1.MousePointer = 11
Open CurFile For Input As #1
Do
Line Input #1, trad
If trad = "<" & GetDrive & ">" Then
Do
Line Input #1, ttrad
If ttrad Like "<*>" Then GoTo steng
tarray = Split(ttrad, "\", , vbTextCompare)
If UBound(tarray) = 1 Then
Set tback = Form1.Tree1.Nodes.Add(GetDrive, tvwChild, mroot & "\" & tarray(1), tarray(1), 3, 3)
Else
On Error Resume Next
utarray = UBound(tarray)
mkay = GetDrive
For a = 1 To utarray - 1
omkay = mkay
mkay = mkay & "\" & tarray(a)
Set tback = Form1.Tree1.Nodes.Add(omkay, tvwChild, mkay, tarray(a), 2, 2)
Next
Set tback = Form1.Tree1.Nodes.Add(mkay, tvwChild, mkay & "\" & tarray(utarray), tarray(utarray), 3, 3)
End If
Loop
End If
Loop Until EOF(1)
steng:
tback2.Child.EnsureVisible
Close #1
If FollowUp <> "" Then
For a = 0 To Form1.Tree1.Nodes.Count - 1
If FollowUp = Form1.Tree1.Nodes.Item(a).Key Then: Form1.Tree1.Nodes.Item(a).EnsureVisible: Form1.Tree1.Nodes.Item(a).Selected = True
Next
End If
Form1.MousePointer = 0
End Sub
</code>
Tack på förhand... Timpa..Sv: Snabba upp koden!!!
Börja med att testa att strukturera om lösning, största prestandavinsten ligger inte i att gör koden bättre utan att göra lösningen bättre.Sv: Snabba upp koden!!!
Sv: Snabba upp koden!!!
<code>
Public Sub ExtrTree(GetDrive As String, ByVal FollowUp As String)
Dim tback As Node
Dim tback2 As Node
Dim Nodes As Nodes
On Error GoTo ExtrTree_Err
Screen.MousePointer = vbHourglass
Set Nodes = Form1.Tree1.Nodes
Nodes.Clear
Set tback2 = Nodes.Add(, , GetDrive, GetDrive, 1, 1)
tback2.Expanded = True
Open CurFile For Input As #1
Do Until EOF(1)
Line Input #1, trad
If trad = "<" & GetDrive & ">" Then
Do Until EOF(1)
Line Input #1, ttrad
If ttrad Like "<*>" Then
Exit Do 'GoTo steng
Else
tarray = Split(ttrad, "\", , vbTextCompare)
utarray = UBound(tarray)
mkay = GetDrive
For a = 1 To utarray - 1
omkay = mkay
mkay = mkay & "\" & tarray(a)
Set tback = Nodes.Add(omkay, tvwChild, mkay, tarray(a), 2, 2)
Next
Set tback = Nodes.Add(mkay, tvwChild, mkay & "\" & tarray(utarray), tarray(utarray), 3, 3)
End If
Loop
End If
Loop
Close #1
If Len(FollowUp) Then
Nodes(FollowUp).Selected = True
End If
Screen.MousePointer = vbNormal
Exit Sub
ExtrTree_Err:
Select Case Err.Number
Case ccNonUniqueKey
Resume Next
Case ccElemNotFound
Resume Next
Case Else
Screen.MousePointer = vbNormal
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Select
End Sub
</code>Sv: Snabba upp koden!!!
Den måste få en sträng. Typ: hej\hoj\jaga.hej
och så letar den upp den i trädet. Får den ingen sträng så ska den inte leta reda på den.Sv: Snabba upp koden!!!
Med Drive Mirror 2 kan du skapa speglingar av enheter. Spara det i databaser och sök bland dom.. Mycket bra om man har många cd skivor med mycke filer på, med Drive Mirror 2 blir det lätt ha ha ordning på allt.
Det finns en Drive Mirror 1.x oxå... Den har jag använt mer än något annat program.
Programmet kräver VBRuntime 6 filerna.
MVH TimpaSv: Snabba upp koden!!!
Eller vad menar du?Sv: Snabba upp koden!!!
btw.
är det snabbare att ha:
do until eof(1)
loop
än
do
loop until eof(1)Sv: Snabba upp koden!!!
<code>
If FollowUp <> "" Then
Form1.Tree1.Nodes(FollowUp).Selected = True
Form1.Tree1.Nodes(FollowUp).EnsureVisible
End If
</code>
var iaf tvungen att använda EnsureVisible, annar scrollar den bara neråt och inte åt sidorna.Sv: Snabba upp koden!!!
Open CurFile For Input As #1
Do Until EOF(1)
Line Input #1, trad
If trad = "<" & GetDrive & ">" Then
Do Until EOF(1)
Line Input #1, ttrad
If ttrad Like "<*>" Then
Exit Do 'GoTo steng
Else
tarray = Split(ttrad, "\", , vbTextCompare)
utarray = UBound(tarray)
mkay = GetDrive
For a = 1 To utarray - 1
omkay = mkay
mkay = mkay & "\" & tarray(a)
Set tback = Nodes.Add(omkay, tvwChild, mkay, tarray(a), 2, 2)
Next
Set tback = Nodes.Add(mkay, tvwChild, mkay & "\" & tarray(utarray), tarray(utarray), 3, 3)
End If
Loop
End If
Loop
'<--------------------------------------------------- HÄR!
Close #1
</code>
du använder dig av Exit Do, men då hoppar den väll bara ur den innersta loopen? jag vill ju att den ska hoppa dit jag markerar i exemplet...Sv: Snabba upp koden!!!
<code>
Open CurFile For Input As #1
Do Until EOF(1)
Line Input #1, trad
If trad = "<" & GetDrive & ">" Then
Do Until EOF(1)
Line Input #1, ttrad
If ttrad Like "<*>" Then
Exit Do
Else
tarray = Split(ttrad, "\", , vbTextCompare)
utarray = UBound(tarray)
mkay = GetDrive
For a = 1 To utarray - 1
omkay = mkay
mkay = mkay & "\" & tarray(a)
Set tback = Nodes.Add(omkay, tvwChild, mkay, tarray(a), 2, 2)
Next
Set tback = Nodes.Add(mkay, tvwChild, mkay & "\" & tarray(utarray), tarray(utarray), 3, 3)
End If
Loop
Exit Do
End If
Loop
Close #1
If FollowUp <> "" Then
With Nodes(FollowUp)
.Selected = True
.EnsureVisible
End With
End If
</code>
Synpunkter för övrigt på din kod.
* Odeklarerade eller globala variabler. T.ex ttrad, trad, mkay, omkay
* Koden är ej kapslad. Jag skulle skickat treview som argument.
* Konstig namngivning. T.ex. ttrad, mkay, omkay, aSv: Snabba upp koden!!!
Fast i morgon dock.. Ska sova nue...
MVH
//JonasSv: Snabba upp koden!!! (DEN HÄR BORDE VARA SNABB NOG ÅT DIG)
<code>
Public Sub ExtrTree(ByVal GetDrive As String, ByVal FollowUp As String)
On Error GoTo ExtrTree_Err
Dim bFound As Boolean
Dim sInput As String
Dim sArray() As String
Dim sTemp() As String
Dim lCount1 As Long
Dim lCount2 As Long
Dim BottomKey As String
Dim ChildKey As String
Dim nTemp As Node
Dim nNodes As Nodes
Screen.MousePointer = vbHourglass
Set nNodes = Form1.Tree1.Nodes
nNodes.Clear
Open CurFile For Binary As #1
sInput$ = String(LOF(1), Chr(0))
Get #1, , sInput$
Close #1
sArray() = Split(sInput, vbCrLf)
Set nTemp = nNodes.Add(, , GetDrive, GetDrive), 1, 1)
nTemp.Expanded = True
bFound = False
For lCount1 = 0 To UBound(sArray)
If bFound Then
If sArray(lCount1) Like "<*>" Then
Exit For
End If
sTemp = Split(sArray(lCount1), "\", , vbTextCompare)
ChildKey = GetDrive
For lCount2 = 0 To UBound(sTemp) - 1
BottomKey = ChildKey
ChildKey = BottomKey & "\" & sTemp(lCount2)
Set nTemp = nNodes.Add(BottomKey, tvwChild, ChildKey, sTemp(lCount2)), 2, 2)
nTemp.Expanded = True
Next lCount2
Set nTemp = nNodes.Add(ChildKey, tvwChild, ChildKey & "\" & sTemp(lCount2), sTemp(lCount2)), 3, 3)
nTemp.Expanded = True
End If
If sArray(lCount1) = "<" & GetDrive & ">" Then
bFound = True
End If
Next lCount1
If Len(FollowUp) Then
Nodes(FollowUp).Selected = True
End If
Screen.MousePointer = vbNormal
Exit Sub
ExtrTree_Err:
Screen.MousePointer = vbNormal
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
</code>
MVH
//JonasSv: Snabba upp koden!!!
Men är 2 st exit do snabbare än en goto?Sv: Snabba upp koden!!!
Om du tittar lite på den så ser du att jag öppnar och stänger filen i början av dokumentet. För det är inte så bra att ha en file öppen eller att arbeta med den öppen.. Det är oftast trögt... Så det är bättre att ladda in det till en variabel och sen arbeta utifrån den..
Och det är det jag har gjort med den där koden! :)
MVH
//JonasSv: Snabba upp koden!!!
Sv: Snabba upp koden!!!
Kunde inte ladda ner en version av ditt program förra gången... Satt på jobbet och just den sidan var tydligen låst från jobbet så jag fick bara upp ett felmeddelande att den här sidan är inte tillåten att visas..
Jag laddade iaf hem ditt program idag och skapade en fil med det..
Såg att jag hade gjort några slarvfel och sen så hade jag ju glömt vissa saker när det gällde att få in flera på en gång..
Jag vet inte om den nya koden är grymmt mycket snabbare än din gamla, men den känns snabbare enligt vad jag tyckte när jag testade iaf.. :)
<code>
Public Sub ExtrTree(ByVal GetDrive As String, ByVal FollowUp As String)
On Error GoTo ExtrTree_Err
Dim bFound As Boolean
Dim bFoundKey As Boolean
Dim sInput As String
Dim sArray() As String
Dim sTemp() As String
Dim sLast() As String
Dim lCount1 As Long
Dim lCount2 As Long
Dim BottomKey As String
Dim ChildKey As String
Dim nTemp As Node
Dim nNodes As Nodes
Screen.MousePointer = vbHourglass
Set nNodes = Form1.Tree1.Nodes
nNodes.Clear
Open curfile For Binary As #1
sInput$ = String(LOF(1), Chr(0))
Get #1, , sInput$
Close #1
sArray() = Split(sInput, vbCrLf)
Set nTemp = nNodes.Add(, , GetDrive, GetDrive, 1, 1)
nTemp.Expanded = True
bFound = False
For lCount1 = 0 To UBound(sArray)
If bFound Then
If sArray(lCount1) Like "<*>" Then
Exit For
End If
sTemp = Split(Mid(sArray(lCount1), 2), "\", , vbTextCompare)
bFoundKey = False
For lCount2 = 0 To UBound(sTemp) - 1
If BottomKey <> "" And Not bFoundKey Then
If sLast(lCount2) = sTemp(lCount2) Then
BottomKey = BottomKey & "\" & sTemp(lCount2)
Else
bFoundKey = True
End If
ElseIf bFoundKey Then
BottomKey = ChildKey
Else
BottomKey = GetDrive
bFoundKey = True
End If
If bFoundKey Then
ChildKey = BottomKey & "\" & sTemp(lCount2)
Set nTemp = nNodes.Add(BottomKey, tvwChild, ChildKey, sTemp(lCount2), 2, 2)
End If
Next lCount2
If bFoundKey Then
Set nTemp = nNodes.Add(ChildKey, tvwChild, ChildKey & "\" & sTemp(lCount2), sTemp(lCount2), 3, 3)
Else
Set nTemp = nNodes.Add(BottomKey, tvwChild, BottomKey & "\" & sTemp(lCount2), sTemp(lCount2), 3, 3)
End If
sLast = sTemp
BottomKey = GetDrive
End If
If sArray(lCount1) = "<" & GetDrive & ">" Then
bFound = True
End If
Next lCount1
If Len(FollowUp) > 0 Then
nNodes(FollowUp).Selected = True
End If
Screen.MousePointer = vbNormal
Exit Sub
ExtrTree_Err:
Screen.MousePointer = vbNormal
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
</code>
MVH
//JonasSv: Snabba upp koden!!!
Sv: Snabba upp koden!!!
Det är svårt att göra den snabbare när filen är sparad som den är...
Tyvärr...
Om du inte sparar filen på ett annat sätt så kommer det nog inte bli så mycket snabbare...
Jag kan iaf inte komma på något mycket snabbare sätt att läsa in filen just nu.. Men kommer jag på något så säger jag till!!
MVH
//JonasSv: Snabba upp koden!!!
Om man inte har treeview'n synlig (exempelvis om du har den i en tabControl där tabben med treview'n inte visas) när noderna läggs till så går det mycket snabbare. I ett litet test jag gjorde fick jag en förbättring från ung 5000 millisekunder till 20 seckunder bara genom att inte visa treeviewn när jag lade till noderna.
Observera att det funkar inte med att bara ta myTreeView.visible = FALSESv: Snabba upp koden!!!
anropa den innan treeviewn fylls och sedan en gång till efter allt är klart , det ger samma effekt som benny beskriver , men utan att behöva trixa med visible proppen
//RogerSv: Snabba upp koden!!!
Det funkar inte med visible!
Så här fixar man det med LockWindowUpdate
<code>
Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Integer) As Integer
...
LockWindowUpdate(myTreeView.Handle.ToInt32)
'Lägg till en massa noder
LockWindowUpdate(0)
</code>