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

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

Votre réponse

5 réponses

Meilleure réponse
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 8 juin 2005 à 15:23
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de florenth
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 8 juin 2005 à 15:29
0
Merci
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
Messages postés
2
Date d'inscription
vendredi 21 janvier 2005
Dernière intervention
8 juin 2005
- 8 juin 2005 à 16:02
0
Merci
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
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 11 juin 2005 à 23:41
0
Merci
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
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 13 juin 2005 à 20:48
0
Merci
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.