Avatar billede test42 Nybegynder
25. november 2002 - 11:39 Der 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...

Nogen der har prøvet noget lignende?
Avatar billede razersedge Nybegynder
25. november 2002 - 11:43 #1
Prøv at smide noget kode, gerne det du har mistanke om der crasher :)

Hvilken fejl får du smidt i hovedet?
Avatar billede test42 Nybegynder
25. november 2002 - 11:50 #2
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.
Avatar billede a_schack Nybegynder
25. november 2002 - 12:34 #3
Det lyder som om at du prøver at referere et free'ed objekt...
Avatar billede a_schack Nybegynder
25. november 2002 - 12:34 #4
NB. Check evt. om dit objekt er nil...
Avatar billede martinlind Nybegynder
25. november 2002 - 13:13 #5
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;

/Martin
Avatar billede dkn Nybegynder
25. november 2002 - 13:46 #6
prøv med:

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
Avatar billede test42 Nybegynder
25. november 2002 - 14:39 #7
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...
Avatar billede dkn Nybegynder
25. november 2002 - 14:42 #8
har du prøvet at lave loopet med ServerList istedet?
Avatar billede test42 Nybegynder
25. november 2002 - 14:47 #9
dkn: Yup - samme error...
Avatar billede test42 Nybegynder
25. november 2002 - 14:50 #10
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 :(
Avatar billede dkn Nybegynder
25. november 2002 - 15:01 #11
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?
Avatar billede test42 Nybegynder
25. november 2002 - 15:02 #12
dkn: jeg har undersøgt sagen på Indy's egen hjemmeside, uden held
Avatar billede dkn Nybegynder
25. november 2002 - 15:05 #13
okay har du set om du kan slippe igennem med try except uden debug ?
Avatar billede dkn Nybegynder
25. november 2002 - 15:06 #14
men det ville jo egentlig bare gøre så de ikke blev slettet fra listen....
Avatar billede test42 Nybegynder
25. november 2002 - 15:09 #15
dkn: Den kommer stadig med error, selvom jeg bruger try, except
Avatar billede martinlind Nybegynder
25. november 2002 - 15:17 #16
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.
Avatar billede test42 Nybegynder
25. november 2002 - 15:19 #17
martinlind: hvordan kan jeg presse while ind i denne sammenhæng..?
Avatar billede martinlind Nybegynder
25. november 2002 - 15:52 #18
noget ala

Int := 0;

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

/Martin
Avatar billede dkn Nybegynder
25. november 2002 - 16:09 #19
det kan ikke passe han får fejl i for løkken hvis han kører fra top mod bund!
Avatar billede martinlind Nybegynder
25. november 2002 - 16:31 #20
Jo det kan det faktisk godt !
Avatar billede dkn Nybegynder
25. november 2002 - 16:35 #21
hvordan? hvis han sletter 2 af gangen...lol ?
Avatar billede doc404 Novice
26. november 2002 - 01:04 #22
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å
Avatar billede test42 Nybegynder
11. december 2002 - 21:27 #23
Jeg har kigget på det, og nofreeze virkede ikke på det, så jeg har lvet det på en anden måde..
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