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 :

Objet Dynamique TMaskEdit


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Objet Dynamique TMaskEdit
    Bonjour à tous.

    Je dois créer plusieurs composants dynamiquement dans un Panel qui lui est créé dynamiquement. Pour la création du panel ainsi que des labels il n’y a pas de problème. Mais dès que j’ai besoin de mettre un MaskEdit un Edit ou un Bouton, j’ai une violation d’accès à une adresse mémoire. Pouvez-vous m’aider ?

    Je créé donc le Panel.

    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
     
    begin
      tag_dyn := 0;
      top_dyn := 10;
      left_dyn := 10;
      supprimer_code_propre();
      with TPanel.Create(Self) do
        begin
          Parent := Self;
          Name := 'pageDyn';
          Text := '';
          Height := 353;
          Width := 1065;
          Top := 191;
          Left := 18;
          Tag := tag_dyn;
        end;
      gestion_planning();
    end;
    Puis je vais rechercher le composant qui à la propriété Panel.
    Ensuite je lance les procédures qui permettent de construire les labels. Pour ces quelques procédures aucun problème. Je fais de même pour le MaskEdit et c’est au niveau du Parent du MaskEdit que sa plante.

    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
     
    For i := 0 to ControlCount - 1 do
        begin
          if (Controls[i] is TPanel) then
            begin
              label_nom_activite(i);
              top_dyn := top_dyn + 16;
              label_heure_debut_activite(i);
              top_dyn := top_dyn + 16;
              label_heure_fin_activite(i);
              top_dyn := top_dyn + 40;
              label_heure_debut_agent(i);
              left_dyn := left_dyn + 88;
              txt_edit_heure_debut_agent(i);
              Break;
            end;
        end; 
     
    // Création du label heure de début agent
    procedure TfrmActiviteJournee.label_heure_debut_agent(i : integer);
    begin
      with TLabel.Create(Controls[i] as TPanel) do
        begin
          Parent := Controls[i] as TPanel;
          Name := 'heurededebutagent';
          Top := top_dyn;
          Left := left_dyn;
          Tag := tag_dyn;
          Caption := 'Heure de début : ';
        end;
    end;
     
    // Création du text Edit heure debut agent
    procedure TfrmActiviteJournee.txt_edit_heure_debut_agent(i : integer);
    begin
      with TMaskEdit.Create(Controls[i] as TPanel) do
        begin
          Parent := Controls[i] as TPanel;
          Name := 'txtHeureDebutAgent';
          EditMask := '!90:00;1;_';
          Enabled := False;
          Height := 21;
          Width := 33;
          Top := top_dyn;
          Left := left_dyn;
          Tag := tag_dyn;
          Text := Copy(RSActiviteJournee.Fields[1].Value, 12, 5);
        end;
    end;
    C'est la ligne suivante qui pose problème : Parent := Controls[i] as TPanel;

    Pour le MaskEdit alors que je mets la même chose au niveau du Label et il n'y a pas de problème.

    Voici le message d'erreur que j'ai lors de l'exécution de la procédure

    http://www.imagup.com/data/1143450527.html

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    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 548
    Points : 25 118
    Points
    25 118
    Par défaut
    as doit renvoyer nil
    Parce Controls[i] n'est pas un TPanel !

    Pourquoi
    TLabel est un TGraphicControl, il n'a pas de propriété Controls
    TMaskEdit est un TWinControl, il a une propriété Controls !
    Avec le with TMaskEdit.Create, il utilise Controls[] du TMaskEdit au lieu de celui de la Form identifié par Self !

    Une seule ligne à changer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parent := Self.Controls[i] as TPanel;
    Ce qui m'étonne, c'est d'avoir une EAccessViolation à 00000008, j'aurais plutôt pensé à une "Index Hors Limite" !

    En plus, Parent := Obj modifie implicitement Controls[] de Obj justement !




    Pourquoi passer i en paramètre, passe directement le TPanel !

    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
     
    var
      ...
      Pnl: TPanel;
    begin
      For i := 0 to ControlCount - 1 do
      begin
        if (Controls[i] is TPanel) then
        begin
          Pnl := TPanel(Controls[i]);
     
          label_nom_activite(Pnl);
          top_dyn := top_dyn + 16;
          label_heure_debut_activite(Pnl);
          top_dyn := top_dyn + 16;
          label_heure_fin_activite(Pnl);
          top_dyn := top_dyn + 40;
          label_heure_debut_agent(Pnl);
          left_dyn := left_dyn + 88;
          txt_edit_heure_debut_agent(Pnl);
          Break; // ?? bizarre, tu ne le fais que sur le Premier Panel ? tu aurais mémoriser son instance !
        end;
      end; 
     
    // Création du label heure de début agent
    procedure TfrmActiviteJournee.label_heure_debut_agent(APanel: TPanel);
    begin
      with TLabel.Create(APanel) do
        begin
          Parent := APanel;
          Name := 'heurededebutagent';
          Top := top_dyn;
          Left := left_dyn;
          Tag := tag_dyn;
          Caption := 'Heure de début : ';
        end;
    end;
     
    // Création du text Edit heure debut agent
    procedure TfrmActiviteJournee.txt_edit_heure_debut_agent(APanel: TPanel);
    begin
      with TMaskEdit.Create(APanel) do
        begin
          Parent := APanel;
          Name := 'txtHeureDebutAgent';
          EditMask := '!90:00;1;_';
          Enabled := False;
          Height := 21;
          Width := 33;
          Top := top_dyn;
          Left := left_dyn;
          Tag := tag_dyn;
          Text := Copy(RSActiviteJournee.Fields[1].Value, 12, 5);
        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

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 747
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 747
    Points : 13 314
    Points
    13 314
    Par défaut
    TMaskEdit dérive de TWinControl, il a donc sa propre propriété Controls. A sa création, Controls ne peut qu'être vide et pas conséquent Controls[i] est dans les choux

    Préfixe-le simplement pas self pour bien utiliser la liste de la fiche : Self.Controls[i].

    Edit: Enfin bref... comme dit Shai

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Objet Dynamique TMaskEdit
    Merci beaucoup. Sa fonction parfaitement. Je vous remercie de votre gentillesse et de votre rapidité au niveau des réponses. Bonne fin de semaine à vous !!

    A très vite !!!



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

Discussions similaires

  1. [PowerBuilder] Création d'objets dynamiques
    Par Béné123456789 dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 00h33
  2. [C#] Accéder à un objet dynamiquement ?
    Par webtheque dans le forum ASP.NET
    Réponses: 10
    Dernier message: 14/04/2005, 15h54
  3. [Reflection] Créer un tableau d'objets dynamiquement.
    Par salome dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 25/03/2005, 18h59
  4. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00
  5. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56

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