Arguments d'une procédure/fonction restreints

[Résolu]
Signaler
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
TMonArray = array of array of TObject Mhh Mhhh ...




Pourquoi ne pas utiliser TList ou mieux TObjectList ?

<!-- blocPrincipal -->
 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
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 ~
 > ^ <
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
Tient Cirec et moi avons repondu en meme temps ...  celà confirme la solution ! :-)

<!-- blocPrincipal -->
 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

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.
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

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.
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

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.
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
 pour le code
-1 pour Var I : Integer; inutilisée 

@+
Cirec
Messages postés
26
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
14 décembre 2009

LÖÖL !

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

Slander.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)