Tableau dynamique à deux dimensions dans une classe [Résolu]

Koraluv 2 Messages postés vendredi 21 janvier 2005Date d'inscription 8 juin 2005 Dernière intervention - 8 juin 2005 à 13:46 - Dernière réponse : florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention
- 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!
Afficher la suite 

5 réponses

Répondre au sujet
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 8 juin 2005 à 15:23
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 8 juin 2005 à 15:29
0
Utile
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
Commenter la réponse de florenth
Koraluv 2 Messages postés vendredi 21 janvier 2005Date d'inscription 8 juin 2005 Dernière intervention - 8 juin 2005 à 16:02
0
Utile
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
Commenter la réponse de Koraluv
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 11 juin 2005 à 23:41
0
Utile
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.
<
Commenter la réponse de cs_Delphiprog
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 13 juin 2005 à 20:48
0
Utile
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
Commenter la réponse de florenth

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.