Tableau dynamique à deux dimensions dans une classe

Résolu
Koraluv Messages postés 2 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 8 juin 2005 - 8 juin 2005 à 13:46
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 13 juin 2005 à 20:48
Salut à tous!
Je suis débutante en delphi et je voudrai créer une classe qui ai comme attribut un tableau dynamique à deux dimentions de TCellule.
je l'ai déclaré comme ca : (car il ne veux pas de "array of array of ...")

type
TTableau = class(TObject)
private
function GetGrilleVal(X, Y: Integer): TCellule;
procedure SetGrilleVal(X, Y: Integer; const Value: TCellule);
property GrilleVal[X, Y: Integer]: TCellule read GetGrilleVal write SetGrilleVal;

mais je ne sais pas comment ni quand définir la taille de mon tableau : si je lui met " SetLength(GrilleVal, nbLig, nbCol);" dans une méthode, il me dit qu'il attend '[' juste après GrilleVal.

Est ce que quelqu'un peu m'aider?
merci d'avance!

5 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
8 juin 2005 à 15:23
Hello,

Elle est où ta déclaration de GrilleVal ??



Sinon, je ferais comme cela (je me substitue à ton code):

<hr size= "2" width="100%">type

TCellule = record

{ J'imagine que c'est un record. Evidemment je ne l'ai pas complété. }

end;

TTableCellule = array of array of TCellule. // Déclaration d'un type tableau.

TTableau = class (TObject)

private

FTableau: TTableCellule; // La délcaration du talbeau dans ta cellule.

FTableauXCount, FTableauYCount: Integer // Pour avoir la taille du tableau dans ses deux dimantions.

function GetGrilleVal(X, Y: Integer): TCellule;


procedure SetGrilleVal(X, Y: Integer; const Value: TCellule);



public // Met tes déclarations de propriétés dans "public" et non "private"

{ Je te rajoute ici les constrcuteur et destructeur pour la suite. }

constructor Create;


destructor Destroy; override;



property GrilleVal[X, Y: Integer]: TCellule read GetGrilleVal write SetGrilleVal;



end; // of class TTableau

<hr size ="2" width= "100%">et pour la partie implémentation :

<hr size="2" width="100%"> constructor TTableau.Create;

begin

inherited;

{ Au début, rien }

FTableauXCount: =0;

FTableauYCount:= 0;

end;



destructor TTableau.Destroy;

begin

Finalize(FTableau); // Destruction du tableau.

Inherited;

end;



function TTableau.GetGrilleVal(X, Y: Integer): TCellule;

begin

{ Vérification d'étendue. }

if (X > = 0) and (Y >= 0) and (X < FTableauXCount) and (Y < FTableauXCount) then

Result: =FTableau[X,Y] // Renvoi du résultat.

else

raise Exception.CreateFmt('Index de cellule hors-limites (%d - %d)',[X,Y]);

end;



procedure TTableau.SetGrilleVal(X, Y: Integer; const Value: TCellule);

begin

{ Vérification d'étendue. }

if (X >0) and (Y > 0) and (X < FTableauXCount) and (Y < FTableauXCount) then

FTableau[X,Y]:= Value

else

raise Exception.CreateFmt('Index de cellule hors-limites (%d - %d)',[X,Y]);

end;

<hr size ="2" width="100%">Avec tout cela, tu devrais t'en sortir.

Au passage pour redimentionner le tableau:

<hr size="2" width="100%">SetLength(FTableau,NewTailleX,NewTailleY);

<hr size="2" width="100%">

Bonne prog'

Florent



Si tu ne te plantes pas ......
tu ne poussera jamais
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
8 juin 2005 à 15:29
Eh ben, ça fait presque un tuto tout ça !!!

J'avais une montée d'adénaline d'un coup, je ne pouvais plus m'arreter.



Au passage, j'ai laissé quelques petites fautes (dont une qui rend le code incompréhensible):

- Il faut lire "// La délcaration du dans ta classe(et non pas du talbeau dans ta cellule).

- J'ai écrit "and (Y < FTableauXCount) then" dans les deux méthodes Get et Set du tableau. Il faut lire FTableauYCount évidemment.



Ouf, j'y serais arrivé.



@ ++

Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
0
Koraluv Messages postés 2 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 8 juin 2005
8 juin 2005 à 16:02
Merci beaucoup !!
Tu m'as bien aidé, c'est exactement ca que je voulais !
Au passage, j'espère que ca en aidera d'autres.

a+
Koraluv
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
11 juin 2005 à 23:41
Bravo Florenth.
Juste une petite suggestion : pourquoi ne pas ajouter une méthode de portée publique qui se nommerait SetLength et dont la signature serait :
procedure SetLength(SizeX, SizeY: integer);

Et l'implémentation serait simplement :
procedure SetLength(SizeX, SizeY : integer);
begin
System.SetLength(FTableau, SizeX, SizeY);
FTableauXCount:= SizeX;
FTableauYCount:= SizeY;
end;


Utiliser directement la procédure SetLength contenue dans l'unité system n'est pas possible puisque le membre FTableau est de portée Private (et j'ajouterai : heureusement).
<HR color=#008000>



Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
13 juin 2005 à 20:48
Mais évidemment qu'il faut le redimentionner le tableau avant de l'utiliser !!

Commet ai-je pu oublier cela ??

(non, non, cela ne m'arrive pas dans mes programmes heureusement)



Par contre, je suis un peu contre l'appelation de SetLength() qui porte
confusion à la procedure de l'unité System. (même s'ily y a aucune
confusion au niveau de la compilation)



Dans ces cas là, moi je met des noms français comme procedure DefinirTaille(TailleX, TailleY: Integer);

Cela sert dêtre french ! ;-)



@ ++

Florent
0
Rejoignez-nous