Jag har ett program som vid uppstart läser in några data från en ini-fil. Det går på nolltid i uvecklingsmenyn men när jag kör exefilen tar det 10 sekunder efter uppstart innan det gåt att klicka i menyn. Vad kan det bero på? Nej det finns inga API-anrop i programmet. Är du säker på att det är ini-filen som laggar ? Open App.Path & "\config.ini" For Input As #1 Du ska nog undvika End, Unload funkar ju bra (förutsatt att alla frm är stängda). Jag är inte hundra på någonting men även när det bara är inifilen som laddas tar det tid. Alltså att NyLista = False och ForstaGangen = 1 i nedanstående kod. Här är koden för Form Activate Du ska inte ha denna koden i Form_Activate utan i form_load! Har du testat hur många gånger koden körs ? Det är just det som är meningen. När andra fönster stängs så skall detta fönster uppdateras. Finns det listigare sätt att göra detta på? JA GoTo är väl inte så bra men jag tänkte inte på While Filenamn= Det skall jag testa. Om timglaset syns så länge så kan vi konstatera att det är listningen av personlistan som tar lång tid eftersom det är där timglaset används. Föresten vad ska du med variabeln text till? Ska du bara kontrollera om listan innehåller några personer? Men problemet uppstår även då listan inte fylls ? Ja problemet uppstår även då listan inte fylls och inget timglas visas. Även när listan fylls så är det ju långt efter det är klart som timglaset visas. Kan det ändå ha med SQL att göra? När jag skriver Är du säker på att det är på den raden du får meddelande? Detta funkar Nu har jag gjort alla föreslagna ändringar men det är ingen skillnad. I utvecklingsmiljön flyter det på "blixtsnabbt" men när jag gör en exe-fil så låser sig fönstret en längre tid. Mycket irriterande när programmet är klart för övrigt och så här vill ju ingen använda det. Testa att lägga in en doevents efter första >Hej, jag är inte så himla hemma på VB6, men App.Path brukar vålla problem för mig eftersom den pekar på olika ställen beroende på om programmet körs inifrån utvecklingsmiljön eller som en exe-fil. Detta med DoEvents verkar vara lösningen! Jag är sååååååååå lycklig:)Exe-filen låser sig
De kontroller som är tillagda är CommonDialog samt de referenser som är gjorda är till Data Objects 2.5 Library, Word 9 Object Library samt Scripting Runtime.Sv: Exe-filen låser sig
Programmet läser in en inifil samt kollar en listbox om det är något i den beroende på vad som läses in från inifilen.Sv: Exe-filen låser sig
Inte skapa ett word-objekt eller så ?
Hur läser du annars in filen, Freefile och Open ?
/JohanSv: Exe-filen låser sig
Det skapas Worddokument men det görs senare, efter det att användarens gjort en sökning och genererat en rapport. Däremot vet jag inte riktigt hur dokumenten skall avslutas för texten kan ligga kvar i Word när jag startar datorn närsta gång. Det finns också fler former i programmet men ingen öppnas förran användaren klickat i en meny. DE avslutas med Unload Me och huvudformuläret även med End men programmet syns ändå i listan när man trycket Ctr-Alt-Del som att det fortfarande ligger laddat.Sv: Exe-filen låser sig
Att programmet fortfarande är igång tyder på att ett frm fortfarande ligger laddat.
Om du refererar till ett "unloadat" frm så laddas det på nytt tror jag.
Du kan alltid snabbkolla vilka frm som är laddade :
<code>
Dim frmTest as Form
For Each frmTest In Forms
MsgBox frmTest.Caption
Next
</code>
Men ini-filen borde väl inte beröras av det ?
Är du hundra på att det är det som tar tid ?
Testa med ett annat nummer, alternativt kör med en variabel och funktionen FreeFile
EDIT:
Kan du inte posta koden i Form.Load eller motsvarande och deklarationerna ?
/JohanSv: Exe-filen låser sig
Private Sub Form_Activate()
On Error GoTo fel
frmDatumformat.Option4.Value = True 'Inläsningar av sparade variabler vid programstart
Open App.Path & "\config.ini" For Input As #1
Input #1, LinjeColor
Input #1, HuvudRubrikColor
Input #1, HuvudRubrikTjocklek
Input #1, HuvudRubrikStorlek
Input #1, UnderRubrikColor
Input #1, UnderRubrikTjocklek
Input #1, UnderRubrikStorlek
Input #1, TextColor
Input #1, TextTjocklek
Input #1, TextStorlek
Input #1, NamnTjocklek
Input #1, EfternamnVersal
Input #1, Databas
Input #1, ForstaGangen
Close #1
If ForstaGangen = 1 Then 'Om man starta programmer första gången efter installation
Dim Filnamn As String
Namnge: ' Om man inte namngivet en ny databas utan tryckt Avbryt i InputBoxen
Filnamn = InputBox("Namnge en ny databas!") 'Ge nya databasen ett namn
If Filnamn = "" Then
MsgBox "Du måste ge databasen ett namn!"
GoTo Namnge
End If
FileCopy App.Path & "\data\data.mdb", App.Path & "\data\" & Filnamn & ".mdb" 'Kopiera den förinstallerade databasen data.mdb till det namn som användaren angivet
Kill App.Path & "\data\data.mdb" 'Tar bort den förinstallerade databasen
MsgBox "Importera nu en GEDCOM-fil eller skriv in persondata!"
ForstaGangen = 0
Databas = Filnamn
Open App.Path & "\config.ini" For Output As #1 'Uppdaterar inifilen med nya databasnamnet och att första programstarten gjorts
Print #1, LinjeColor
Print #1, HuvudRubrikColor
Print #1, HuvudRubrikTjocklek
Print #1, HuvudRubrikStorlek
Print #1, UnderRubrikColor
Print #1, UnderRubrikTjocklek
Print #1, UnderRubrikStorlek
Print #1, TextColor
Print #1, TextTjocklek
Print #1, TextStorlek
Print #1, NamnTjocklek
Print #1, EfternamnVersal
Print #1, Databas
Print #1, ForstaGangen
Close #1
Me.Caption = Databas
NyLista = False
MousePointer = vbDefault
Exit Sub
End If
If NyLista = True Then 'Om personlistan skall uppdateras
MousePointer = vbHourglass
Set ConnPerson = New ADODB.Connection
ConnPerson.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & App.Path & "\data\" & Databas & ".mdb;uid=Admin"
SQL = "select * from person order by efternamn, fornamn"
Set rs = ConnPerson.Execute(SQL)
Dim Nollar As String
Do Until rs.EOF 'Skapa personlistan
If rs("fodelsear") = 0 Then
Nollar = ""
Else
Nollar = rs("fodelsear")
End If
Lista.AddItem rs("id") & ":" & vbTab & rs("efternamn") & " " & rs("fornamn") & " f. " & Nollar & " " & rs("fodelseort")
rs.MoveNext
Loop
rs.Close
ConnPerson.Close
Dim text As String
Dim i As Integer
For i = 0 To Lista.ListCount - 1
text = text & Lista.List(i)
Next i
If text = "" Then 'Kollar om några personer finns i personlistan efter uppdatering.
MsgBox "Det finns inga personer i databasen. Importera en GEDCOM-fil"
ImporteraText.Enabled = False 'Sätter menyalternativen
SkapaNyText.Enabled = False
KopplaBild.Enabled = False
Generation.Enabled = False
ImporteraGedcom.Enabled = True
Else
ImporteraText.Enabled = True 'Sätter menyalternativen
SkapaNyText.Enabled = True
KopplaBild.Enabled = True
Generation.Enabled = True
ImporteraGedcom.Enabled = True
Sok.Enabled = True
End If
Gen = False
TextVal = False
BildVal = False
klick = False
OppnaDatabas = False
NyLista = False
MousePointer = vbDefault
Me.Caption = Databas
End If
Exit Sub
fel:
MsgBox Err.Description
MousePointer = vbDefault
End SubSv: Exe-filen låser sig
Annars kommer koden att köras så fort fönstret aktiveras varje gång dvs:
- Om du har ett annat fönster aktivt och sedan gör detta fönster aktivt igen
- Om fönstret ligger nere i listen minimerat och du tar upp det igen
- osv....Sv: Exe-filen låser sig
Activate körs väl varje gång du byter till formuläret.
Annars ska det väl funka även om jag personligen är allergisk mot goto.
Skulle ha använt While Filnamn=""
Hur stor är data.mdb ? Går det inte snabbare att byta namn på den ?
Name App.Path & "\data\data.mdb" As App.Path & "\data\" & Filnamn & ".mdb"
Hoppas du kommer framåt
/JohanSv: Exe-filen låser sig
Sv: Exe-filen låser sig
data.mdb är152 kb när den är tom och kanske blir 200 kb när den används. Det blir ca 500 poster i den. Jag har prövat med Name men märker inget skillnad men jag kan ändå ändra tillbaka eftersom du säger det är snabbare för alla kanske inte har en snabb dator så det märks hos andra.
Det är nu som att när formen laddats och listan är updaterad och allt är klart så syns timglaset 6-7 sekunder efteråt. Det är inte vid varje programstart utan då och då.Sv: Exe-filen låser sig
<code>SQL = "select * from person order by efternamn, fornamn" </code>
behöver du verkligen hämta alla fält här? Det ser ju ut som om du endast listar id, eftrernamn förnamn, födelseort och gör en kontroll på födelseår. Det är prestandakrävande i databasen att hämta alla fält i onödan. Även om du behöver alla fält är det bättre att faktiskt skriva alla fält istället för stjärna *. Har du många fält i tabellen? Det är kanske för många fält och de har kanske dessutom för stora storlekar och kanske även fel datatyp. Det är viktigt att kontrollera.
<code>
Set rsLista.AddItem rs("id") & ":" & vbTab & rs("efternamn") & " " & rs("fornamn") & " f. " & Nollar & " " & rs("fodelseort") </code>
är mer prestandakrävande än
<code>
Set rsLista.AddItem rs!id & ":" & vbTab & rs!efternamn & " " & rs!fornamn & " f. " & Nollar & " " & rs!fodelseort </code>
Detta är mycket bättre. Likadant i din if sats där du kontrollerar födelseår
Här är det dumt att loopa en gång till.
<code>
For i = 0 To Lista.ListCount - 1
text = text & Lista.List(i)
Next i
</code>
Istället när du lägger till i din lista så gör så här
<code>
stringVariabel = rs!id & ":" & vbTab & rs!efternamn & " " & rs!fornamn & " f. " & Nollar & " " & rs!fodelseort
Set rsLista.AddItem stringVariabel
text = text & stringVariabel
</code>
så kan du ta bort loopen.Sv: Exe-filen låser sig
Då är det rätt onödigt att loopa igenom listan för att lägga till dem i text variabeln du kollar istället
if Lista.listcount <> 0 thenSv: Exe-filen låser sig
"Alltså att NyLista = False och ForstaGangen = 1"
Timglaset kan väl ha andra anledningar ?
Håller med om det du skriver iofs !
/JohanSv: Exe-filen låser sig
Jenny, jag skall titta noga på dina förslag och testa att ta bort Loopar och variabler. Jag behöver som då påpekar inte selektera alla fält. Tur det finns profs att fråga:)Sv: Exe-filen låser sig
Set rsLista.AddItem rs!id & ":" & vbTab & rs!efternamn & " " & rs!fornamn & " f. " & Nollar & " " & rs!fodelseort
får jag felmeddelande på första rs om "Expected ="Sv: Exe-filen låser sig
Testa att först lägga in i en strängvariabel innan du gör additem
stringVariabel = rs!id & ":" & vbTab & rs!efternamn & " " & rs!fornamn & " f. " & Nollar & " " & rs!fodelseort
rsLista.additem stringVariabel
behöver inte skriva set framförSv: Exe-filen låser sig
stringVariabel = rs!id & ":" & vbTab & rs!efternamn & " " & rs!fornamn & " f. " & Nollar & " " & rs!fodelseort
rsLista.additem stringVariabel Sv: Exe-filen låser sig
Sv: Exe-filen låser sig
<code>
Close #1
DoEvents
</code>
så att du säkert vet att operativsystemet hinner släppa filen innan du ska öppna den igen för redigering.
Blir det inte bättre så kan du lite här och där lägga in lite msgbox där du talar om exakt i koden var du är så att du ser hur långt du hinner innan det hänger sig.Sv: Exe-filen låser sig
Kan det vara någon liknande fälla här?
Det ovan skrivna beror på att du inte startar ett projekt på ett riktigt vis.Så fort du bestämt dig med
första Form skall du lägga/Spara Som i en egen mapp.Därefter skall du alltid starta projektet därifrån.
Beträffande ursprungsfrågan så måste du svara på hur du kompilerar/Option.Jag har själv råkat ut
för problemmet. Kolla vbp filen i tex NotePad hur ser sökvägarna ut ?Sv: Exe-filen låser sig
(Men jag vågar inte sätta tråden som löst än)