25. november 2002 - 11:39Der er
22 kommentarer og 1 løsning
Fejl? Hvor?
Jeg har skrevet en masse små plug-ins (med tilhørende forms) i DLLs, som bliver loaded af et større program...
I en af disse, bruger jeg bla. også Indy's TIdIRC (klienten), som jeg generere via kode, og ikke drag/drop-metoden (da jeg skal have mulighed for at tilføje mange TIdIRCs)... problemet ligger i, at jeg har en ListBox, hvor jeg har listet alle de aktive servere jeg har, og ved en OnDisconnect, render den hele listen igennem, og tjekker, hvilken server der er '.Connected = False', og fjerner den både fra min ObjectList (som indeholder alle mine TIdIRCs) og min ListBox - det går fint nok med ObjectListen, men ikke med ListBox'en - og sådan er det i stort set hele koden... De steder, hvor jeg roder med IdIRC og visuelle komponenter samtidig (dvs. skifte Caption på en knap), så generer den fejl, når jeg kører programmet, og det cracsher...
procedure TMainForm.ServerDisconnect(Sender: TObject); var Int: Integer; begin for Int := 0 to SocketList.Count-1 do if TIdIRC(SocketList.Items[Int]).Connected = False then begin SocketList.Delete(Int); ServerList.Items.Delete(Int); end; end;
Den er fra DLL'en
SocketList er min ObjectList, der indeholder mine klienter, og ServerList er en ListBox med alle servernavnene.
Fejlen kommer idet jeg prøver at slette et item i ServerList. Det er ikke kun her den crasher, når jeg prøver på noget, det er i stort set alle funktioner, hvor jeg også arbejder med TIdIRC...
Fejlen der kommer, er en Error: Access ciolation at address blablabla in module 'BBIRCC.dll'. Read of address blabla.
NEJ du kan IKKE lave en FOR løkke på din SocketList når du Deleter inde i løkken, du er nødt til at bruge en While, for løkken checker COUNT EN gang og løber derfor for langt når du sletter
While Cnt <= Count-1 do begin if <Delete> then begin end else Inc(Cnt); end;
procedure TMainForm.ServerDisconnect(Sender: TObject); var Int: Integer; begin for Int := SocketList.Count-1 downto 0 do if TIdIRC(SocketList.Items[Int]).Connected = False then begin SocketList.Delete(Int); ServerList.Items.Delete(Int); end; end;
på den måde løber for ikke ind i et id som ikke er der
martinlind: Det virker da ellers fint, når jeg bare fjerner ServerList...? dkn: Dit eksempel generere samme error...
hvis jeg laver en button, som sletter det, virker det fint - men alle de steder, hvor der skal ske en visuel forandring, samtidig med, at jeg laver noget med TIdIRC, så kommer fejlen...
Det er en generel fejl over det hele, at jeg ikke kan arbejde med f.eks. knapper, lister, labels osv, sammen med IdIRC... Kun ting som StringList, ObjectList osv. kører fint :(
Ok den fejl er vidst uforklarelig. Jeg kan ikke se nogen fejl i din kode. Jeg tror du må se om der er andre der har haft samme problem, har du kigget i andre forums efter det?
du skal nok overveje at bruge en while alligevel, du har jo lidt samme problem i serverlist, du sletter i en liste du indexer dig ind i udfra en count du tog da du startede, det holder ikke.
while ( int <= serverlist.count-1 ) and ( int <= socketlist.count-1 ) do begin if <delete> then <Do delete> else Inc(Int); end;
Det ville jeg gøre i dit sted, har selv haft den fejl mange gange med at man sletter i en for løkke, det holder IKKE :( og jeg er ret sikker på det er der du har fejlen
Når det er visuelle komponenter der crasher, kunne det være et synkroniserings problem. Det er kun hoved threaden i Delphi, der kan lave GUI ting. Hvis du forsøger, at opdatere visuelle komponenter fra en anden thread, kan der ske de mest underlige ting... Indy vist en NoFreeze (???? late og for meget rødvin) komponent du bør kigge lidt på
Jeg har kigget på det, og nofreeze virkede ikke på det, så jeg har lvet det på en anden måde..
Synes godt om
Ny brugerNybegynder
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.