28. juni 2007 - 23:10Der er
1 kommentar og 1 løsning
TListBox og AddObject - mærkelige tegn
Hej.
Er i gang med at skabe en game-browser, der viser spilservere og deres ip. Jeg vil ikke have ip'et vist i listboxen, men bare gemt vha. Addobject.
Kan godt gemme og læse, men når jeg læser strengen jeg har gemt får jeg tit tomme strenge eller mærkelige tegn (1 ud af 10 gange får jeg dog det rigtige ip med nogle tegn eller en tom streng)
Her er kode:
Bruger en Showmessage til at teste,
procedure TfrmMain.lbGamesClick(Sender: TObject); begin if lbGames.ItemIndex <> -1 then ShowMessage(String(lbGames.Items.Objects[lbGames.ItemIndex])); end;
Det kan jeg godt forstå. Koden vil kun virke hvis IPAdresse er en global variabel som du aldrig ændrer efter at du har tilføjet den til listboxen. Men jeg gætter på at den enten er en lokal variabel og så går den ud af scope på et tidspunkt og Delphi fjerne den og genbruger hukommelsen, eller du flere gange tildeler ny værdi til strengen så den bliver gendannet et andet sted i hukommelsen. I begge tilfælde vil din pointer TObject(IPAdresse) lige pludselig pege på et sted i hukommelsen hvor der ligger garbage fordi det er blevet overskrevet af noget andet. Løsning: Gem ipaddressen som en integer værdi (hvis vi snakker ipv4) eller definer en klasse med en streng variabel til at indeholde din streng. Hver gang du skal tilføje til listboxe skal du lave en instans af klassen, tilføj strengen til objektet og addere objektet i listboxens Object-parameter. Ved at bruge en klasse til at indeholde strengen, vil strengen ikke gå ud af scope. Klassen kan se sådan ud: type TIPAdresse = class IPAdresse: string; end;
var ip: TIPAdresse; begin ip := TIPAdresse.Create; ip.IPAdresse := IPAdresse; lbGames.Items.AddObject(Spillernavn+' ('+Spiltype+')', ip); end;
procedure TfrmMain.lbGamesClick(Sender: TObject); begin if lbGames.ItemIndex <> -1 then ShowMessage(TIPAdresse(lbGames.Items.Objects[lbGames.ItemIndex]).IPAdresse); end
Totalt utestet.
Husk at Free objekterne når de ikke skal bruges mere, ellers får du en memory-leak.
Synes godt om
Slettet bruger
29. juni 2007 - 20:27#2
Synes det med scopes er lidt svært, men nu har jeg noget jeg kan gå videre med. Tak for svaret!
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.