Précédent   Forum des professionnels en informatique > Environnements de développement > Delphi > Langage
Langage Tout ce qui concerne le langage (POO, syntaxe, message d'erreur...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 13h50   #1
Invité de passage
 
Homme Antonio Zalacain
Étudiant
Inscription : juin 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antonio Zalacain
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : juin 2011
Messages : 5
Points : 1
Points : 1
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 :
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 :
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
antonio_AMD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 13h58   #2
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 7 845
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 7 845
Points : 10 549
Points : 10 549
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 :
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 :
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

Parisien ! Dites NON à la VO ST au Cinéma !
Soit VF Soit VO sans sous-titre
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 14h12   #3
Modérateur
 
Avatar de Andnotor
 
Inscription : septembre 2008
Messages : 2 233
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 2 233
Points : 2 905
Points : 2 905
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
Andnotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 14h25   #4
Invité de passage
 
Homme Antonio Zalacain
Étudiant
Inscription : juin 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antonio Zalacain
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : juin 2011
Messages : 5
Points : 1
Points : 1
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 !!!


antonio_AMD est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h07.


 
 
 
 
Partenaires

Hébergement Web