Copie d'une classe dans une autre

Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - Modifié par Whismeril le 18/12/2014 à 18:02
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 19 déc. 2014 à 10:56
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.

1 réponse

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par sp40 le 19/12/2014 à 10:49
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
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par sp40 le 19/12/2014 à 10:58
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...
0
Rejoignez-nous