Copier une instance de classe [ Delphi ] - Delphi/Pascal - Programmation
Marsh Posté le 14-09-2003 à 18:24:33
Up...
La question est pas claire ou la reponse pas evidente ?
Marsh Posté le 14-09-2003 à 19:04:28
tu copies chaque champ du record individuellement
si dans ton record tu n'as que des types simples (nombres) tu peux le copier en un bloc. Mais là y a rien de prévu
d'où l'intérêt d'utiliser une classe plutôt qu'un record, et de définir la méthode Assign, comme le font pas mal de classes de la VCL, qui recopie le contenu de la classe passée en paramètre
Note que le record que tu reçois en paramètre est déjà une copie du record d'origine, vu que tu ne spécifie ni var ni const devant le nom du paramètre (d'où l'intérêt de mettre const si tu le modifie pas, pour pas qu'il le copie bêtement pour rien)
Marsh Posté le 14-09-2003 à 19:10:43
antp a écrit : tu copies chaque champ du record individuellement |
My bad, il est bien en var
V voir ce que je peux faire avec assign
Marsh Posté le 14-09-2003 à 19:57:51
assign c'est juste le nom utilisé pour désigner une méthode de recopie
- c'est à toi de l'écrire pour ta classe
- c'est pour les objets, pas pour les record
Marsh Posté le 15-09-2003 à 13:30:36
antp a écrit : assign c'est juste le nom utilisé pour désigner une méthode de recopie |
j'avais compris En plus des methodes sur des records, spa trop possib non
Bon j'ai du bol, le TWideStringList a un assgin implemente. Par contre, dans la meme veine mais a un autre niveau, si vous avez une TObjectList de TTruc (c'est une classe hein)
faire UneListe.Assign(UneAUtreListe); ca genere bien une nouvelle liste de pointeurs, mais les objets pointes sont les memes
Marsh Posté le 15-09-2003 à 13:44:48
bah oui comment veux-tu qu'elle sache comment dédoubler les objets
Marsh Posté le 15-09-2003 à 18:29:06
antp a écrit : bah oui comment veux-tu qu'elle sache comment dédoubler les objets |
Ben je sais pas... Disons qu'avant de constater le probleme, son eventualite ne m'avait pas frappee
Marsh Posté le 14-09-2003 à 15:34:53
j'ai encore un probleme
Je code sur la playlist de TCMP la et je me trouve dans une impasse.
La playlist est composee d'entrees, avec des champs fixes pour les tags connus (titre, artiste...) et d'une StringList pour les tags personnalises (extended) :
REntry = record;
Title: WideString;
Artist: WideString;
...
Extended: TCustomWideStringList;
end;
Pour l'edition de chaque entree, ca se fait dans une fenetre adequate qui est mise au courant du contenu en cours lors de son create. Comme je veux pouvoir annuler d'eventuelles modifications, je garde de cote l'entree d'origine et je travaille sur une copie :
TEditForm = class(TForm)
...
private
lEntry: REntry;
sEntry: PEntry; // PEntry: ^REntry;
public
constructor Create(plEntry: REntry);
end;
et
constructor TEDitForm.Create(plEntry: REntry);
begin
inherited Create;
lEntry := plEntry;
sEntry := @plEntry;
...
end;
En cas d'annulation, on touche a rien, en cas de mise a jour, on fait sEntry^ := lEntry; (lEntry est l'enregistrement de travail).
Seulement voila, lEntry.Extended et sEntry^.Extended c'est le meme pointeur ALors comment je peux faire pour que lEntry.Extended soit une copie de plEntry.Exended comme les autres champs et non pas pointe sur les memes donnes ?
---------------
And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. Revelations 6:8