Slettet bruger
28. juni 2007 - 23:10
Der 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;
lbGames.Items.AddObject(Spillernavn+' ('+Spiltype+')',TObject(IPAdresse));
IPAdresse er en TString. Har også prøvet, med samme resultat,
lbGames.Items.AddObject(Spillernavn+' ('+Spiltype+')',TObject(String(IPAdresse)));
Nogen idéer?
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.