23. december 1999 - 00:51Der er
5 kommentarer og 1 løsning
EStringListError
Davs folkens.
Et program som jeg er ved at lave kommer nogen gange med fejlen EStringListError, uden at sige hvor det går galt. Men i hjælp står der også at det kan ske når man add'er en linje, hvordan kan man undgå det?!?!?
hehe jeg ved ikke om det er fordi jeg er ved at være træt men nu kommer den sgu også med en besked der hedder EAccessViolation! Jeg tror jeg holder nu, håber nogen gider prøve at komme med et svar!
Det tyder alvorligt på at du et eller andet sted arbejder med et object (TStringList?) som du enten ikke har oprettet (med Create) eller som er blevet frigivet (enten med Free eller ved at dens Owner er blevet frigivet). Det er vel ikke sådan, at du har en form der ejer en StringList/Listbox eller så'en, som du arbejder med fra et andet sted i programmet. Hvis nu denne form endnu ikke er oprettet eller evt. ER blevet nedlagt, så får du fejl af de typer du beskriver ovenfor. Du er nok nødt til at gå programmet igennem for denne type fejl. Det kan evt. også skyldes, at du placere objecter i en stringlist. Nu kan jeg ikke lige huske det, men er der ikke noget med at en stringlist selv vil fjerne de objecter der er tilknyttet den, når stringlisten bliver frigivet. Hvis dette er tilfældet, så vil rækkefølgen:
1- Opret et eller flere object variable. 2- Opret Stringlist 3- Placer objecterne i stringlisten. 4- "Arbejd" med listen. 5- Nedlæg listen 6- "Arbejd" med et af objecterne fra pkt. 1. 7- Frigiv object variablerne.
I dette tilfælde vil det gå galt i både pkt. 6 og 7 - AccessError, idet du arbeder med noget memory der er frigivet. Alternativt vil frigivelse af objecterne mellem pkt 3 og 4 sandsynligvis udløse en StringList error af en eller anden art i pkt 4, idet listen nu vil arbejde med noget udefineret data.
Løsningen kan evt. være ikke at tilskrive objecter som:
Var Obj1 : TPersistent; Obj2 : TPersistent; Begin Obj1 := TPersistent.Create; Obj2 := Obj1; End;
Idet denne operation blot kopiere indholdet af nogle pointere, således at begge variable peger på samme memory område. Istedet bør man anvende:
Obj2.Assign(Obj1); // Øhh- Skal Obj2 mon først være created (kan ikke huske det!)
Dette vil lave to "ens" kopier, men man kan stadig arbejde med Obj2, selv om Obj1 bliver nedlagt.
En anden simpel mulighed kan være at du adresserer de enkelte linier i stringlisten med et index. F.eks, stringlist.strings[x] hvor x er et tal du tror peger på en linie.
Men.. Når man opretter en stringlist (create) er den tom og man skal først add'e linier til den før man kan adressere dem med [x].
Eks.
s := stringlist.create stringa := s.strings[2]; /// vil give en fejl !!
skulle have været s := stringlist.create s.strings.add('bla'); // linie 0 s.strings.add('bla'); // linie 1 s.strings.add('bla'); // linie 2 stringsa := s.strings[2] // linie ok, stringsa er lig med 'bla';
sjensen
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.