IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Delphi Tableau taille dynamique


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut Delphi Tableau taille dynamique
    bonjour, apres avoir feuilleté la FAQ je n'ai pas réussi à comprendre la gestion des tableaux dynamique. Je possede une fonction et j'aimerais qu'elle me renvoies un tableau de type 'Planification' (objet que j'ai moi même crée). Voici l'intitulé de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class function getPlanifsJour(jour : TDATE) : array of Planification;
    et le corps (vide pour l'instant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class function Planification.getPlanifsJour(jour: TDate) : array of Planification ;
    var
     monTab : array of Planification;
     plan : Planification;
    begin
            plan.Create;
            plan.setMatricule(1);
            monTab[0] := plan;
            result := monTab;
    end;
    mon probleme c'est un message d'erreur :

    [DCC Erreur] cPlanification.pas(63): E2029 Identificateur attendu(e) mais 'ARRAY' trouvé(e)
    [DCC Erreur] cPlanification.pas(215): E2029 Identificateur attendu(e) mais 'ARRAY' trouvé(e)
    [DCC Erreur] cPlanification.pas(223): E2010 Types incompatibles : 'Planification' et 'dynamic array'
    [DCC Erreur] ProjVisiMed.dpr(26): F2063 Impossible de compiler l'unité utilisée 'cPlanification.pas'
    qu'en pensez vous ?

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Valus25 Voir le message
    bonjour, apres avoir feuilleté la FAQ je n'ai pas réussi à comprendre la gestion des tableaux dynamique. Je possede une fonction et j'aimerais qu'elle me renvoies un tableau de type 'Planification' (objet que j'ai moi même crée). Voici l'intitulé de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class function getPlanifsJour(jour : TDATE) : array of Planification;
    et le corps (vide pour l'instant) :
    [CODE]class function Planification.getPlanifsJour(jour: TDate) : array of Planification ;
    var
    monTab : array of Planification;
    plan : Planification;
    begin
    plan.Create;
    plan.setMatricule(1);
    monTab[0] := plan;
    result := monTab;
    end;CODE]

    mon probleme c'est un message d'erreur :



    qu'en pensez vous ?
    pour ce type de déclaration tu dois passer par une déclaration de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TPlanificationDuJour = array of Planification;
     
    class function Planification.getPlanifsJour(jour: TDate) : TPlanificationDuJour ;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    merci pour cette réponse mais comment le déclarer dans ma classe Planification, et ou le déclarer ?

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Valus25 Voir le message
    merci pour cette réponse mais comment le déclarer dans ma classe Planification, et ou le déclarer ?
    ouille

    bon alors, je ne pense pas que ce soit forcément une bonne idée de travailler avec un tableau dynamique mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      TPlanification = class; // déclaration "forward" pour résoudre le problème de l'oeuf et la poule
     
      TPlanificationDuJour = array of TPlanification; 
     
      TPlanification = class
        class function getPlanifsJour(jour: TDate) : TPlanificationDuJour;
      end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Par ailleurs, tu vas avoir un problème là :
    Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plan := Planification.Create;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    disons que je dois retourner un tableau d'objets planification obtenue par requete sur une BDD donc le nombre d'objets m'est inconnu

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Ne cherche pas à allouer un ensemble d'objet dès que tu as reçu le DataSet de ton SQL, cela sera très lent, ... mieux vaut parcourir le DataSet avec les bon vieux while not EOF ... Next(); et avoir un constructeur d'objet qui aspire le DataSet ...

    Sinon, une fois la requête exécutée, tu en connais le nombre via RecordCount ...

    Comme je l'ai déjà dit dans le sujet "creer objets à partir d'une table", le mieux est de construire une TCollection qui utilise en interne un TDataSet et instancie les objets selon le principe du LazyLoading, tu as des libs comme InstantObjects (qui ne gère pas le LazyLoading à l'époque où je l'avais essayé, ce qui était finalement rédhibitoire, ou celle écrite par PHPLive (as-tu lu ce sujet qui correspond à ta demande, mais dépasse le niveau débutant par contre) ... j'en ai écrit une aussi mais largement trop dépendante de lib ... sinon, je te l'aurais volontier passé ...

    Bon voici un exemple de code (non fonctionnel), c'est juste un exemple des idées que l'on peut avoir pour un mécanisme de LazyLoading ... et sur la necessité de comprendre l'objet ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    type
      TPlanification = class; // déclaration "forward" pour résoudre le problème de l'oeuf et la poule
     
      TPlanificationDuJour = class // soit à la main à base de TObject soit une TCollection gérant du LazyLoading
      private
        IDList: TIntegerList; // Disons une TList bidouillé ou un générique pour ceux qui ont ça ...
        ObjList: TPlanificationList; // une THashStringList par exemple ...
      public
        property Items[Index: Integer]: TPlanification read GetItems;
      end;
     
      TPlanification = class
        ID: Integer;
        Jour: TDate;
        Heure: TTime;
        Lieu: string;
     
        constructeur Create(ID: Integer);
     
        class function getPlanifsJour(jour: TDate) : TPlanificationDuJour;
      end; 
     
     
     
     
    constructeur TPlanification.Create(PlanningID: Integer);
    begin
      with TDBProvider.GetQuery('SELECT * FROM planning WHERE id_planning = :ID') do // une fonction qui instancie un objet Query et le configure pour qu'il fonctionne avec le minimum d'instruction ensuite, comme la Connexion\ConnexionString ...
      try
        ParamByName('ID').AsInteger := PlanningID; 
        Open;
        if not IsEmpty then
        begin
          ID := FieldByName('ID_PLANNING').AsInteger;
          Jour := FieldByName('JOUR').AsDateTime;
          Heure := FieldByName('HEURE').AsDateTime;
          Lieu := FieldByName('LIEU').AsString;
        end  
        else
          raise EPlanificationException ...
      finally
        Free();
      end;
    end;
     
    class function TPlanification.getPlanifsJour(jour: TDate) : TPlanificationDuJour;
    begin
      with TDBProvider.GetQuery('SELECT id_planning FROM planning WHERE jour = :ParamJour') do // une fonction qui instancie un objet Query et le configure pour qu'il fonctionne avec le minimum d'instruction ensuite, comme la Connexion\ConnexionString ...
      try
        ParamByName('ParamJour').AsDate := Jour; 
        Open;
        while not EOF do
        begin
          Result.Add(FieldByName('ID_PLANNING').AsInteger);
     
          Next();
        end;
      finally
        Free();
      end;
    end;
     
    function TPlanificationDuJour.GetItems(Index: Integer): TPlanification;
    begin
      if Index < ObjList.Count then
      begin
        Result := ObjList.Items[Index];
      end
      else
      begin
        Result := TPlanification.Create(IDList[Index]);
        ObjList.Add(Index, Result); // un système qui gère un tableau avec un index personnel et non un index dans un tableau ... une sorte de tableau Associatif
      end
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Matrice de Matrice dans un tableau de taille dynamique
    Par J_help dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/04/2010, 22h03
  2. Delphi/Ole/Excel/Tableau croisé dynamique
    Par Dunsany dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 26/06/2009, 13h25
  3. tableau de taille dynamique
    Par TaymouWan dans le forum C#
    Réponses: 12
    Dernier message: 17/03/2009, 18h52
  4. [XSL~FO]tableau de taille dynamique
    Par sozie9372 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 13/07/2006, 17h57
  5. tableau croisé dynamique sous delphi, comment ?
    Par Brice Yao dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2005, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo