23. oktober 2002 - 13:08Der er
7 kommentarer og 1 løsning
Pointer til post i dyn-array ændrer sig ved forøgelse af array
Hej Eksperter!
Jeg har et dynamisk array af klasser, for at holde styr på disse klasser smider jeg en pointer til de enkelte poster i arrayet ind i et TListView.Items.Item[Index].Data, altså en TListItem.Data (pointer).
Det fungerer kun ved den sidst indlæste af array'et. Hvis jeg forøger array'ets størrelse med en og smider endnu en post ind i det, så ændrer pointeren sig fra "array[ANDEN_SIDSTE]" til noget anden end det den var før...
Er der nogle problemer omkring et dynamisk array og pointere til de enkelte poster når jeg forøger størrelsen på dette array, eller er det bare mig der ikke kan kode? Jeg har debugget en del tid med det nu, men pointeren ser ud til at ændre sig som vinden blæser når det ikke er sidste post der peges på...
Det der sker (så vidt jeg husker) når man forøger størrelsen på et dynamisk array er at den allokere plads til hele det nye array, flytter data fra det gamle, for slutteligt at dispose det gamle. Det er derfor "en skidt ide" at bruge adressen på disse elementer. Brug i stedet elementets nummer.
Jeg har aldrig være tilhænger af DynArray og ville (hvis det var mig) havde brugt en TObjectList eller TStringList alt efter hvad jeg havde brug for med denne.
De (TObjectList/TStringList) har forøvrigt samme "problem" med at du ikke kan have en pointer til deres elementer, men i stedet skal bruge elementets nummer. Denne fremgangsmåde virker kun hvis der ikke indsættes/slette elementer "midt i listen" og hvis listen ikke er sorteret (elementerne vil "skifte plads" når man indsætter nye).
Hehe... Jaaah, det er netop der mit problem ligger... Jeg havde nemlig overvejet bare at bruge TListItem's Index-property som index i mit DynArray, men problemet kommer så når der sorteres i ListView'et eller slettes fra det... :)
Har du et alternativ til Data-property'en under TListItem, så det i stedet er en Integer... Noget i retning af den Tag-property der findes til TComponent...
Du husker helt korrekt, du kan nemt "Type-konvertere mellem" Integer og Pointer.
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.