2010-11-16 35 views
4

J'ai un enregistrement que je voudrais stocker pour chaque élément qui s'ajoute à une liste. Aurais-je besoin de faire de l'enregistrement une classe au lieu d'accomplir cela?Est-il possible de stocker un enregistrement dans la propriété Item.Object d'une ListBox?

TServerRec = record 
    ID: integer; 
    DisplayName: string; 
    Address: string; 
    Port: integer; 
end; 

procedure TMainForm.PopuplateServers; 
var 
    server: TServerRec; 
begin 
    for server in FServerList do 
    begin 
    lbServers.AddObject(server.DisplayName, server); 
    end; 
end; 

Répondre

5

Non, mais vous pouvez stocker un pointeur sur cet enregistrement avec un peu de typecasting. Mais alors vous obtenez dans l'allocation dynamique de pointeur d'enregistrement, qui peut être un peu d'un mal de tête. Pourquoi ne pas faire de TServerRec un objet?

+0

Aucune raison réelle, je suppose que je vais aller dans la route de l'objet. Je ne savais pas s'il me manquait quelque chose avec un disque. Merci pour la réponse – kirkdmo

5

vous essayez declarating structure comme celle-

type  
PServerRec = ^TServerRec; 
TServerRec = record 
    ID: integer; 
    DisplayName: string[255]; 
    Address: string[255]; 
    Port: integer; 
end; 

    //now filling your list of objects 
    procedure TForm1.Button1Click(Sender: TObject); 
    const 
     Max=10; 
    var 
     FServerList : Array [1..Max] of PServerRec; 
     server  : PServerRec; 
     i   : Integer; 
    begin 
     for i := 1 to Max do 
     begin 
     new(server); 
     server^.DisplayName:='Server '+IntToStr(i); 
     FServerList[i]:=server; 
     end; 

     for server in FServerList do 
     begin 
     lbServers.Items.AddObject(server.DisplayName, TObject(server)); 
     end; 
    end; 

    //now to retrieve the info 
    procedure TForm1.lbServersDblClick(Sender: TObject); 
    var 
     server  : TServerRec; 
    begin 
     server:=PServerRec(lbServers.Items.Objects[lbServers.ItemIndex])^; 
     ShowMessage(server.DisplayName); 
    end; 

ne pas oublier d'appeler la fonction dispose pour libérer la mémoire de chaque objet alloué.

+0

Merci pour l'entrée RRUZ, je suis juste allé de l'avant et fait de TServerRec un objet à la place. Il n'y avait pas beaucoup de travail à faire et probablement devrait vraiment être un en premier lieu. – kirkdmo

0

Été là, fait cela. J'ai résolu un problème similaire en dérivant une nouvelle classe de la classe TListbox, qui comprenait un tableau dynamique des enregistrements que je voulais garder liés. Vous aurez besoin de surcharger plusieurs des méthodes de TListbox pour garder le tableau dynamique synchronisé avec les éléments dans la liste, mais il a quelques avantages. Par exemple, un tableau dynamique d'enregistrement n'a pas besoin d'allouer ou de désallouer de la mémoire. Vous avez juste besoin de définir la longueur du tableau égale au nombre d'éléments dans votre liste. (SetLength) Vous n'accédez pas aux enregistrements via des pointeurs, mais via un index. Vous pouvez simplement copier des enregistrements d'un emplacement à un autre dans la liste, pour les réorganiser.
L'inconvénient? Il y a beaucoup de fonctionnalités qui doivent être remplacées et il n'est pas facile de vérifier les bogues dans votre code, car cela doit fonctionner à l'exécution et au moment du design. Sachez également que vous utilisez des enregistrements, pas des classes. Si vous utilisez des classes à la place, vous devez libérer chaque élément du tableau. Mais les enregistrements sont beaucoup moins complexes.