Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 2014
-
Modifié par Whismeril le 18/12/2014 à 18:02
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDerniè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...
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 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;
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és1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 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...
Modifié par sp40 le 19/12/2014 à 10:58
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...