Copie d'une classe dans une autre

Messages postés
296
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
-
Bonjour,
Voici mon soucis, je suis en train de développer une IHM qui pourra gérer 10 carte électronique différentes. Chaque carte est piloté par l'IHM grace à une classe THardClass.
Dans l'IHM, j'ai déclaré un tableau ListeHard : array[0..9] of THardClass;
Jusque là, rien de difficile.
L'utilisateur peut ajouter ou supprimer des cartes électronique donc le nombre actuel de carte est contenue dans un integer IdNbHard. Donc au départ, on n'a aucune carte défini.
On ajoute par exemple 5 carte donc ListeHard[0] sera :=THardClass.create('carte1'), ListeHard[1]:=THardClass.create('carte2'), etc...
et ceci jusqu'à 4. tout fonctionne bien sauf que si je veut supprimer la carte n°2,
je déclare nHard:=2; et j'ai fait

ListeHard[nHard].Free; // On détruit le composant 
  for i:=nHard to IdNbHard-2 do
    begin
      ListeHard[i]:=ListeHard[i+1];
    end;
  IdNbHard:=IdNbHard-1; 

Et là, la copie ci dessus ne marche pas, comme si delphi ne copiait pas les classes de l'une à l'autre. Je me retrouve avec des classes qui ont des données mélangée avec celle qui a disparue... Soit un vrai chantier.

Comment peut-on faire s'il vous plait ?

La THardClass est codé :
THardClass = class
  private
    FHardVide : integer; // si =0, c'est un hard réel; si =1 on a un hard vide...
    FNameDll : string;
    FNameHard : string;
    FVersion : string;
    FChannel : integer;   // Numéro du canal atribué par le logiciel IME
    FHandleDll : THandle; // Handle de la Dll
    Function FGetChannel : integer;
    Procedure FSetChannel(SetChannel : integer);
    procedure PByte2TMemoryStream(var TabByte: TByteArray; SizeTab : integer; var StreamByte: TMemoryStream );
    Procedure TTrigger2ByteArray(var Trigger2Convert : TMeasureTrigger; var ByteArray : TByteArray);
    Procedure ByteArray2TTrigger(var Trigger2Convert : TMeasureTrigger; var ByteArray : TByteArray; LengthArray : integer);
  public
    Image16 : TImage; // Image en 16x16 pixels du hard considéré
    Image64 : TImage; // Image en 64x64 pixels du Hard considéré
    IdFluxHardRx : TCardinalList; // Id des blocs (filtres, etc...) en sortie du hard
    IdFluxHardTx : TCardinalList; // Id des blocs (filtres, send,etc...) en entrée du Hard

    constructor Create(DllFileName : string);
    destructor Destroy;

    Function HardInit : integer;
    Function HardGetVersion : string;
    Function HardGetName : string;
    Function HardStart : integer;
    Function HardStop : integer;
    Function HardTrigger(var SetupTrigger : TMeasureTrigger) : integer;
    Function HardReadTrigger(var SetupTrigger : TMeasureTrigger) : integer;
    Function HardSetting(var ListSetting : TStringList) : integer;
    Function HardReadSetting(var ListSetting : TStringList) : integer;
    Function HardSettingForm : integer;
    Function HardBufferCount : integer;
    Function HardReadDatas(var BufferRX : TByteArray; var RXCount : integer) : integer;
    Function HardSendDatas(var BufferTX : TByteArray; var TXCount : integer) : integer;
  published
    property NameDll : string read FNameDll;
    property NameHard : string read FNameHard;
    property Channel : integer read FGetChannel write FSetChannel;
    property version : string read FVersion;
  end;      


En tout cas merci de votre aide et passez de joyeuse Fêtes de fin d'année...

EDIT: Ajout de la coloration syntaxique.
Afficher la suite 

1 réponse

Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
11
0
Merci
Salut,

J'ai découvert dans XE2 les TList (TQueue, TStack aussi, ça dépend de l'usage). Ce sont des classes contenues dans l'unité System.Generics.Collections. C'est vraiment super pratique à utiliser (Je ne peux plus m'en passer)
Pourquoi ne pas l'utiliser à la place de ton array ?
//Extrait de code
uses
    System.Generics.Collections;
Type
TListeHard = TList<THardClass>; // plus pratique...

...
Private
ListeHard : TListeHard;


Du coup, tu as une propriété "Count" qui te permet de ne pas avoir à gérer ta variable "IdNbHard"

// Instanciation de ta liste
ListeHard := TListeHard.Create;


Et pour ajouter tes cartes :
ListeHard.Add(THardClass.Create('carte1'));
ListeHard.Add(THardClass.Create('carte2'));
ListeHard.Add(THardClass.Create('carte3'));
...


Tu peux utiliser les boucles "For" dessus ou les Enumerator :
procedure ... ;
var
   tmpHardClass : THardClass;
begin
    For tmpHardClass in ListeHard do begin
         // traitement
    end;
end;


procedure ... ;
var
   tmpEnum : TListeHard.TEnumerator;
begin
    tmpEnum := ListeHard.GetEnumerator;
    While tmpEnum.MoveNext do begin
         // traitement
         tmpEnum.Current.[Propriété de ta classe] := [valeur];
    end;
    tmpEnum.Free;
end;


La seule différence avec l'array, c'est qu'il faut libérer la liste.
Perso, je n'utilise plus que ça... Oublié les array :D
Simon
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
11 -
Et dans la même unité, tu as aussi le TDictionary<type, type> qui est aussi super pratique ;)

Peut être plus approprié pour tes HardClass ?
Tu peux créer un type TDictionary<integer, THardClass> pour les numéroter et les repérer plus facilement...
Commenter la réponse de sp40