Avatar billede 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?
Avatar billede tolderlund Nybegynder
29. juni 2007 - 10:18 #1
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.
Avatar billede 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!
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