Martin Lindemann Frederiksen skrev:
> Jeg har det med komponenten fra dette program, som jeg ikke selv har
lavet,
> det laver samme fejl, I kan hente filen her:
>
>
http://www.mlf.dk/denzoftp.zip
Jeg har kigget lidt på dit program. Ud over at jeg på det kraftigste må
anbefale at første linie i hver source-fil altid skal være 'Option Explicit'
(uden apostroffer), har jeg fundet et par uhensigtsmæssigheder:
Når Form_Load kører, kaldes NewInet.SetInetComponent som sætter referencer
op til den form, som Form_Load kører under.
Du har nu en cirkulær reference. VB kan ikke løse cirkulære referencer for
dig - det må du klare selv.
En løsning kan være at indsætte en procedure i formen:
Private Sub Form_Unload(Cancel As Integer)
NewInet.CleanupInetComponent
End Sub
I FtpClient skal naturligvis indsættes en procedure:
Public Sub CleanupInetComponent()
CancelOperation = True
Set LocalInet = Nothing
Set ResText = Nothing
Set FormOut = Nothing
End Sub
Problemet er blot, at når man klikker på "Get Server", som udfører
Command2_Click (tåbeligt navn, iøvrigt - burde hedde GetServer_Click) og
MENS den er ved at hente filer ned, lukker formen, så går det galt. På et
tidspunkt kommer VB til at stå i GetValues$ og prøver at udføre løkken:
Do While LocalInet.StillExecuting
DoEvents
Loop
Desværre findes LocalInet ikke længere, idet det er sat til Nothing, noget
går helt galt her. Af én eller anden grund, går VB-IDE'en helt i ged, så
genvejstasterne (f.eks. F8, F5, Ctrl-C osv) ikke længere virker i VB. Jeg
ved ikke hvorfor, men formoder at det skyldes at Inet kontrollen gør knuder!
Det ser ud til at programmet fortsætter med at bruge en hel del CPU-tid i en
minuts tid, inden programmet stopper med en fejl.
Et af problemerne kan være at du i din FtpClient.cls flere steder refererer
til Form1, og hvis det sker men Form1 er ved at unloade, og rent faktisk har
unloadet den komponent, som forsøges tilgrebet, bliver form1 ganske enkelt
loadet igen (selv om den var ved at unloade)!!!
Du kunne overveje at logge hver eneste procedure/funktionskald i en fil
e(kald en log-procedure i første linie i hver procedure/funktion, som logger
procedurens/funktions navn) eller ced brug af Debug.print, og bagefter
analyserer hvor/hvad der går galt.
-------
Tomas