Arguments d'une procédure/fonction restreints

Résolu
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009 - 26 sept. 2006 à 17:21
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 28 sept. 2006 à 11:53
Bonjour à tous et toutes...

Me voilà devant un petit problème et je voudrais savoir si il existe une solution pour le résoudre...

Code de mon programme:
procedure AjouterChoix(Choix: array of string; Index: integer = 0);  // Cette ligne ne pose aucun problème...
procedure AjouterSousChoix(SousChoix: array of array of TObject; Index: integer = 0);  // Ici le compilateur me done une erreur !

L'erreur est la suivante:
[Error] MonFichier.pas(74): Identifier expected but 'ARRAY' found

Et le curseur est placé juste après le 2ème "array" de la ligne...
Est-il possible de passer en argument une array dynamique multiple sans passer par une solution dans le style:

TMonArray = array of array of TObject;
procedure AjouterSousChoix(SousChoix: TMonArray; Index:
integer = 0);  // La ligne qui posait problème avant...

Je vous le demande ??

Slander.

15 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
27 sept. 2006 à 19:09
type
  pObject      = ^TObject;
  TObjectPot   = array of pObject;
  TOPMatrix    = array of TObjectPot;

function Poter(const A : array of pObject) : TObjectPot;
var i : integer;
begin
  setlength(result,length(A));
  for i := 0 to high(A) do
      result[i] := A[i];
end;

function Matrixer(const A : array of TObjectPot) : TOPMatrix;
var i : integer;
begin
  setlength(result,length(A));
  for i := 0 to high(A) do
      result[i] := A[i];
end;

begin
  AjouterChoix(
     Matrixer([
Poter([@Label1,@Edit1]),


                Poter([@Label2,@Edit2]),


                Poter([@Label3,@Label4,@Edit3])


     ])
  );
end;









<hr size="2" width="100%" />
Croc (click me)
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 sept. 2006 à 20:50
Avec où sans pointeur ça fonctionne

type
  //pObject      = ^TObject;
  TObjectPot   = array of TObject;
  TOPMatrix    = arrayof TObjectPot;



function Poter(const A : arrayof TObject) : TObjectPot;
var i : integer;
begin
  setlength(result,length(A));
  for i := 0 to high(A) do
      result[i] : = A[i];
end;



function Matrixer(const A : arrayof TObjectPot) : TOPMatrix;
var i : integer;
begin
  setlength(result,length(A));
  for i := 0 to high(A) do
      result[i] : = A[i];
end;





procedure TForm1.Button1Click(Sender: TObject);
begin


     Matrixer([ Poter([SpeedButton1,Edit1]),
                Poter([SpeedButton2,SpeedButton5]),
                Poter([SpeedButton8,SpeedButton7,SpeedButton9])
     ])
  ;
end;














@+
Cirec
3
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 sept. 2006 à 17:40
TMonArray = array of array of TObject Mhh Mhhh ...




Pourquoi ne pas utiliser TList ou mieux TObjectList ?

<!-- blocPrincipal -->
 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
26 sept. 2006 à 19:01
Tout d'abord merci de cette réponse rapide

Mais là ou je reste perplexe, c'est ou tu me suggère d'utiliser une TObjectList (qui pourrait etre considérée comme une liste d'objets donc une "array of TObject") alors que je souhaite utiliser une array of array of TObject ?!

Peut-être faisais-tu allusion à un genre de "array of TObjectList" ?

Dans ce cas je te suis très volontier !

Mais je souhiterai pouvoir passer mes argument comme je le ferais pour une simple array à savoir:
AjouterChoix(['Choix 1', 'Choix 2', 'Choix 3']); // Fonctionne parfaitement...
et
AjouterSousChoix([[Objet10, Objet11], [Objet20, Objet21, Objet22], [Objet30]]); // Impossible de savoir vu l'erreur précédente...

J'espère être suffisament clair dans mes propos... Et si vous avez une solution ou un conseil, je suis preneur...

PS: Je rappel que je sais comment faire en passant par des Types mais je voudrai savoir si c'est possible de le faire tel que je le demande, pour une question de simplicité de passage d'arguments... voilà je vous laisse le clavier maintenant...

Slander.
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 sept. 2006 à 19:38
Salut,
"Est-il possible de passer en argument une array dynamique multiple sans passer par une solution dans le style: TMonArray = array of array of TObject;"

à mon avis non mais pourquoi ne pas utiliser TMonArray puisque ca fonctionne ?

@+
Cirec
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 sept. 2006 à 19:39
C'est vrai je n'arrange pas ton problème.


A mon avis il faut que tu crées un nouveau type :
type TonType = array of array of TObject;

Essai voir .....


<!-- blocPrincipal -->


 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 sept. 2006 à 19:42
Tient Cirec et moi avons repondu en meme temps ...  celà confirme la solution ! :-)

<!-- blocPrincipal -->
 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
26 sept. 2006 à 20:05
Bon à priori, il n'est pas possible de passer en argument une array of array de quelque chose sans passer par un type :(

Donc je vais quand même écrire ma solution ici pour ceux que ça intéresserait...

[dans Interface]

TArrayOfArrayOfObject = array of array of TObject;

procedure AjouterSousChoix(SousChoix: TArrayOfArrayOfObject; Defaut: integer = 0);

[Dans une procedure quelquonque de Implémentation]

procedure Quelquonque;
var
  TempSousChoix: TArrayOfArrayOfObject;
begin
  SetLength(TempSousChoix, 3, 2);
  TempSousChoix[0, 0] := Label1;
  TempSousChoix[0, 1] := Edit1;
  TempSousChoix[1, 0] := Label2;
  TempSousChoix[1, 1] := Edit2;
  TempSousChoix[2, 0] := Label3;
  TempSousChoix[2, 1] := Edit3;
  AjouterSousChoix(TempSousChoix, 1);
end;

Et celà fonctionne très bien puisque je l'utilise... Donc vous me direz certainement: "BenKestéV'nuNousFaireChierAvecTaQuestionDeMerdeAlors ?"
et je vous répondrais: "Je voulais savoir si on pouvait appeler "AjouterSousChoix" comme ceci directement:"

AjouterSousChoix([[Label1, Edit1], [Label2, Edit2], [Label3, Edit3]], 1);

Domage c'était plus cours :p

Slander.
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
27 sept. 2006 à 19:26
Hello !

Bon c'est effectivement une solution de passer par des pointeurs et des fonctions...
Merci de vous être donné la peine de chercher une solution à mon problème !

Bonne prog' @ tous et toutes...

Slander.
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
27 sept. 2006 à 21:10
Ah ! Ben c'est cool que tu es testé sans pointeur, je ne l'avais po fait...

Merci FOxi de nous avoir montrer le chemin !
Et merci à toi Cirec d'avoir arpenté ce chemin (roflll...) !

A vous deux, vous avez su trouver une solution qui me va très bien...

Merci encore et que DelphiFR perdure !

Slander.
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
27 sept. 2006 à 21:22
Arf ! "que tu es testé" ca sonne pas trop français à mon goût ça !

Qu'à cela ne tienne, je corrige !

procedure RemplacerTexteQuiSonnePasFrancais(Original, Correctif: string);
var
  i: integer;
begin
  with PrecedantPost do
    if (Existe(Original)) then
      RemplacePar(Correctif);
end;

procedure BoutonCorrectionClick(Sender: TObject);
begin
  RemplacerTexteQuiSonnePasFrancais('que tu es testé', 'que tu aies testé');
end;

@Peluche !

Slander.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 sept. 2006 à 21:34
 pour le code
-1 pour Var I : Integer; inutilisée 

@+
Cirec
0
cs_Slander Messages postés 26 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 14 décembre 2009
27 sept. 2006 à 21:49
LÖÖL !

(Au début j'avais fait différement, et j'ai oublié de supprimer cette variable locale)
Méa culpa...

Slander.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
28 sept. 2006 à 11:50
oui cirec, car l'appel a un objet fait appel a son pointeur d'instance, donc qu'il soit mis en pointeur ou non ça reviens au meme, voir c'est meme plus contraignant puisqu'on fait un pointeur sur un pointeur.
ce serait aussi idiot que de mettre un pointeur en var dans une fonction.

donc oui, on peu supprimer la version pointeur ... par contre cela est valable quand a la place d'objet on utilise des structures record, la il vaut mieux utiliser des pointeurs.
c'est ce qui m'a d'ailleur induit en erreur ...

<hr size="2" width="100%" />Croc (click me)
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
28 sept. 2006 à 11:53
par contre je ne suis pas d'accord :

-1 pour Var I : Integer; inutilisée

on a tellement toujours besoin d'un i quelque part qu'on le mets par reflexe :)

et aussi :

procedure RemplacerTexteQuiSonnePasFrancais(const Original, Correctif: string);

ce qui augmenteras les performances.

<hr size="2" width="100%" />Croc (click me)
0