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 :

Problème avec fonction renvoyant un Tableau dynamique


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut Problème avec fonction renvoyant un Tableau dynamique
    Bonjour,

    Je suis sur un autre problème que j'ai du mal à résoudre, sans
    doute à cause de mon niveau "débutant" en Delphi.

    J'ai construit une fonction renvoyant un tableau multidimensionnel
    (array of record). Mais dès que je veux alimenter la variable de
    sortie "result", Delphi me retourne une "classe d'exception EAccessViolation
    avec Violation d'accès à l'adresse 0056D8F0"... Le problème apparaît
    après With result[0] Do...

    Voici mon code :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, Spin, ExtCtrls, Menus, QComCtrls,ComCtrls,StrUtils,UnitWinMainGenerique, Unit2, ucanip,
      ModuleSecuriteBDD, ToolWin, Math, CommCtrl, ImgList;
     
    type
     
    Tab1 = record
       Id:Integer;
       Index1:Integer;
       Txt1:string;
       DIBitmask:string;
       SsIndex:Integer;
       SsTxt:string;
       Valeur:Integer;
       DIReadOnly:string;
       DINotify:string;
      end;
     
      Tab2 = Array of Tab1;
     
    var
      Form1: TForm1;
      MessBox: Tform;
      PTab1 : Array of Tab1;
     
    implementation
     
    uses Unit3, Unit4;
     
    {$R *.dfm}
     
    function LocateParam(PStruct: Array of Tab1; Id:longint; valCan:longint; mode:string):Tab2;
    var
      i:word;
      k,l,j:integer;
    begin
      k:=-1;
      if(length(PStruct))=0 then exit;
      if(mode = 'ptext') then
      Begin
        while(PTab1[k].Id<>Id) Do
        Begin
          inc(k,1);
        End;
     
        j := k;
     
       //Chargement du paramètre demandé : du rang j au rang k
     
       For l:=j to k Do
       Begin
         With Result[l] Do
           Begin
            Id:=PStruct[k+l].Id;
            Index1:=PStruct[k+l].Index1;
            SsIndex:=PStruct[k+l].SsIndex;
            SsTxt:=PStruct[k+l].SsTxt;
            Valeur:=PStruct[k+l].Valeur;
            DIReadOnly:=PStruct[k+l].DIReadOnly;
            DINotify:=PStruct[k+l].DINotify;
           End;
         End;
       End
       Else
       Begin
        if(Id=0)then
        Begin
          With result[0] Do
          Begin 
            Id:=0;
            Index1:=0;
            SsIndex:=0;
            SsTxt:='';
            Valeur:=0;
            DIReadOnly:='';
            DINotify:='';
          End;
        End
        Else
        Begin
          for i:=0 to length(PStruct)-1 do
          Begin
            if PStruct[i].Id=Id then
            Begin
              k:=i;
     
              repeat
                if(PStruct[k].Valeur = (valCan)) then
                Begin
    	 With result[0] Do
    	 Begin
    	   Id:=0;
    	   Index1:=0;
    	   SsIndex:=0;
    	   SsTxt:='';
    	   Valeur:=0;
      	   DIReadOnly:='';
                    DINotify:='';
    	 End;
                End;
     
                inc(k,1);
              until PStruct[k].Id<>Id;
              exit;
            End;
         End;
        End;
      end;
    end;
    J'appelle la fonction avec

    SrchParam:=LocateParam(TabStruct,idStrcut,donnee,'unit');


    Merci beaucoup pour votre aide, je suis bloqué.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    il faut allouer le tableau avec un SetLength(Result, XX)

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    autre chose que j'ai constaté avec delphi2010, "peut être"; c'est qu'il utilise mal les record, j'ai dû passé par une classe,

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Je viens de voir dans une autre portion de mon code que
    je n'ai pas utilisé la propriété SetLength, autant pour moi,
    ton post confirme donc le souci que j'avais

    Merci pour ta réponse Paul TOTH, maintenant ça marche très bien.

    edam > Sur Delphi 7, les records tels que décrits dans mon code
    marchent bien

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

Discussions similaires

  1. Problème avec fonction renvoyant une "Nested Table"
    Par Sunchaser dans le forum PL/SQL
    Réponses: 4
    Dernier message: 20/05/2009, 17h19
  2. Problème avec PtInRegion et un tableau dynamique
    Par mduse dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2005, 09h29
  3. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20

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