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

Langage Delphi Discussion :

property array sous delphi


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut property array sous delphi
    Bonjour,
    mon probleme est le suivant :
    j'ai deux classes :1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    msgLicClass = class(TRemotable)
      private
        FmsgCdTypLic: string1Type;
        FmsgContLic: string80Type;
        FmsgVatLicMc: int1Type;
      public
        constructor Create; override;
      published
        property msgCdTypLic: string1Type read FmsgCdTypLic write FmsgCdTypLic stored AS_ATTRIBUTE;
        property msgContLic: string80Type read FmsgContLic write FmsgContLic stored AS_ATTRIBUTE;
        property msgVatLicMc: int1Type read FmsgVatLicMc write FmsgVatLicMc stored AS_ATTRIBUTE;
      end;
     
      msgLicArray = array of msgLicClass;
    2:
    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
     inDemandeType = class(TRemotable)
      private
        FmsgLic : msgLicArray;
      //  FmsgLic : String_Array;
        FmsgCdAction: string1Type;
        FmsgCdBranche: string1Type;
        FmsgCdCircuit: int4Type;
        FmsgCdIntermed: string6Type;
        FmsgCdNatCmc: int2Type;
        FmsgCdOrigine: string1Type;
        FmsgCdSite: string3Type;
        FmsgCdStr: int2Type;
        FmsgCdTrtInfo: string10Type;
        FmsgCdTypDem: int4Type;
        FmsgCdTypRcc: string2Type;
        FmsgCdUntOff: string6Type;
        FmsgComment: string10000Type;
        FmsgDateRecep: string;
        FmsgHeureRecep: string;
        FmsgNbCag: int1Type;
        FmsgNbCle: int1Type;
        FmsgNbCli: int1Type;
        FmsgNbFam: int1Type;
        FmsgNbInt: int1Type;
        FmsgNbLic: int1Type;
        FmsgNbRcc: int1Type;
        FmsgNbRefFonc: int1Type;
        FmsgNbTyd: int1Type;
        FmsgNbVcr: int1Type;
        FmsgNbdoc: int1Type;
        FmsgNbres: int1Type;
        FmsgNuRcc: string16Type;
        FmsgTopAffGest: string1Type;
        FmsgTopDebug: string1Type;
        FmsgTopMajLic: string1Type;
        FmsgVatixint: int1Type;
        FmsgVatixrcc: int1Type;
        FmsgVatixtyd: int1Type;
      public
        constructor Create; override;
        destructor Destroy; override;
      published
        property msgLic:msgLicArray read FmsgLic write FmsgLic;
        property msgCdAction: string1Type read FmsgCdAction write FmsgCdAction stored AS_ATTRIBUTE;
    ...
    mon besoin est de récupérer l'ensemble des données de ma premier classe dans une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property msgLic:msgLicArray read FmsgLic write FmsgLic;
    de la deuxième


    comment faire svp

    Cordialement,

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Quel résultat attendu ? Quel résultat obtenu ?

    A priori en survolant très rapidement ton code. Tu dois récupérer une variable de type msgLicArray. Alors après ce tableau est peut-être vide dans ton instance d'objet inDemandeType.

    Ici tu déclare un array of msgLicClass. Donc dans ton cas pour le remplir, il faut en premier lieu effectuer un SetLength, sinon ça ne remplit rien

    Personnellement je préfère l'utilsation des TList qui contiennent déjà pas mal de méthode pour gérer ce genre de cas et que tu peux surcharger au besoin

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    ne confond pas la balise QUOTE et CODE

    Est-ce du code généré par l'importateur WSDL ou la partie serveur d'un WS ?

    Même dans le code généré, n'hésite pas à ajouter des propriétés supplémentaires ou méthodes en public (pas published) pour aider à l'utilisation des Array comme property, c'est ce que je fais personnellement, souvent une Méthode Addxxx gérant le SetLength en interne
    - soit directement si je sais qu'il n'y a pas de regénération,
    - soit par héritage si il y a un gros risque d'évolution, cela nécessiste de passer private en protected, c'est seule modification du fichier généré, et facile à reprendre après chaque regénération
    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

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut
    Re bonjour,
    pour quote et code j'ai pas fais attention merci pour la remarque .
    Merci pour vos réponses oui effectivement c'est du code générer à la suite d'un wsdl (je suis sous delphi 6).

    mon souci c'est comme mapper l'ensemble d'info de la classe 1 dans une seule variable tableau de la deuxième classe

    c'est faisable ou pas ;


    Cordialement,

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est un paramètre ou un retour de fonction ?
    Je ne vois pas ce qui te pose problème !

    Si c'est un passage de paramètre
    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
     
    var
      ObjDemande : inDemandeType;
      ObjLic : msgLicClass;
      TmpArray : msgLicArray;
    begin
      SetLength(TmpArray, 2);
      ObjLic := msgLicClass.Create();
      ObjLic.msgCdTypLic ...  
      TmpArray[0] := ObjLic;
     
      ObjLic := msgLicClass.Create();
      ObjLic.msgCdTypLic ... 
      TmpArray[1] := ObjLic;
     
      ObjDemande.msgLic = TmpArray; // Copie le tableau, cela conserve les mêmes références sur les objets
    Pense qu'il faut libérer tout ce qui a été alloué !

    Si c'est un retour et que tu veux faire une lecture du tableau, le code ressemble à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      ObjDemande : inDemandeType;
      ObjLic : msgLicClass;
    begin
      ...
      for i := Low(ObjDemande.msgLic) to High(ObjDemande.msgLic)
      begin
        ObjLic := ObjDemande.msgLic[i];   
        ObjLic.msgCdTypLic ...
    Il faut penser qu'un tableau en propriété, cela doit surement provoquer des copies du tableau, à vérifier !
    Cela peut-être inutilement consommateur de temps processeur et mémoire
    Refaire des propriétés publiques msgLicCount et msgLicItems à la façon de la TList peut être interessant !

    Pense aussi au destructeur, normalement le code généré detruit les objets des tableaux, mais tu dois appelé explicitement le Free de l'objet retourné, proablement un inDemandeType
    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

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut
    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
    {------------------------------------------------------------------------------}
    function TFrameVisas.ExportToDr(ProjetValide : Boolean): Boolean;
    var
      frmExport : TfrmExport;
      idxProj, idxTable: Integer;
      iVisa: integer;
      {II200911-GPS-Debut}
      code          : string;
      retour        : response;
      parameters    : request;
      date_recep    : string;
      heure_recep   : string;
      I  ,J         : integer;
      msgArray      : msgLicArray;
      {II200911-GPS-Fin}
    begin
    ...
                 //Appel du web service
                 retour     :=  response.Create;
                 parameters :=  request.Create;
     
                 parameters.msgCdAction           := 'C'                        ;
                 parameters.msgCdBranche          := 'J'                        ;
                 parameters.msgCdCircuit          := 0012                       ;
                 parameters.msgCdIntermed         := frmExport.NumIdt           ;
                 parameters.msgCdNatCmc           := 1 {81}                     ;
                 parameters.msgCdOrigine          := 'P'                        ;
                 parameters.msgCdSite             := 'SI1'                      ;
                 parameters.msgCdStr              := 12                         ;
                 parameters.msgCdTrtInfo          := 'OSL'                      ;
                 parameters.msgCdTypDem           := 4036                       ;
                 parameters.msgCdTypRcc           := 'PL'                       ;
                 parameters.msgCdUntOff           := '1'                        ;
                 parameters.msgComment            := ''                         ;
                 parameters.msgDateRecep          := FormatDateTime('yyyy-mm-dd', Now);
                 parameters.msgHeureRecep         := FormatDateTime('hh:nn:ss', Now);
                 parameters.msgNbCag              := 0                          ;
                 parameters.msgNbCle              := 0                          ;
                 parameters.msgNbCli              := 0                          ;
                 parameters.msgNbdoc              := 0                          ;
                 parameters.msgNbFam              := 0                          ;
                 parameters.msgNbInt              := 1                          ;
     
                 parameters.msgNbLic              := 20 ;//en attente
     
                 //ihm.CorpMail
                 //ihm.CMCommentaires
                  try
     
     
    SetLength( parameters.msgLic, ihm.CorpMail.Count + (length(ihm.CMCommentaires) div 78)+3 );
     
                parameters.msgLic[0] := msgLicClass.Create ;
     
                  parameters.msgLic[0].msgCdTypLic := 'E';
                  parameters.msgLic[0].msgContLic := 'MAIL@@';
                  parameters.msgLic[0].msgVatLicMc := 0;
    avec cette affectation au niveau setlength je reçois un message erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    un objet constante ne peux pas être passer comme var
    Cordialement,

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est pour cela que
    soit tu fais une méthode AddLic dans inDemandeType qui fait le SetLength
    soit tu utilises une variable temporaire comme dans mon exemple que tu ne sembles pas avoir lu !

    en plus tu avais commencé msgArray : msgLicArray;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SetLength(msgArray , ihm.CorpMail.Count + (length(ihm.CMCommentaires) div 78)+3 ); // ça semble étrange ce calcul de dimension
     
                msgArray := msgLicClass.Create ;
     
                msgArray.msgCdTypLic := 'E';
                msgArray.msgContLic := 'MAIL@@';
                msgArray.msgVatLicMc := 0;
     
                ... 
     
                parameters.msgLic := msgArray;
    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

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut
    Oui,
    effectivement Désole,je réponds un peu tard j'avais déjà utilise cette même solution comme tu vois et j'ai parcouru ma variable impeccable ça marche très bien

    encore merci

    Cordialement,

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

Discussions similaires

  1. Corba sous Delphi et ORB alternatif
    Par Inpriser dans le forum CORBA
    Réponses: 4
    Dernier message: 18/08/2003, 18h42
  2. retrouver les compsants FASTNET sous Delphi 7
    Par fandor7 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/06/2003, 18h11
  3. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  4. calcul sous delphi
    Par djedje-08 dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2003, 17h39
  5. Réponses: 4
    Dernier message: 27/03/2002, 11h03

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