Bonjour,
Je réfléchis à la possibilité de gérer des données par l'intermédiaire d'un TList qui manipule des pointeurs...
Je me heurte à un problème d'affectation d'un pointeur dans une procédure.
J'ai créé une Liste d'Objets Céleste dont voici le code.
Précision : je suis parti d'un exemple que j'avais en Delphi, j'ai converti le projet avec le menu Outils|Conversion Delphi|Convertir un projet Delphi en projet Lazarus. J'ai donc la directive de compilation suivante en début de chaque unité : {$MODE Delphi} ! Mais je ne pense pas que cela change quelque chose pour mon problème!
Unit2 est juste une fiche modale ne comprenant aucune ligne de code pour la saisie des données :
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
116
117
118
119
120
121
122
123
124
125
126 Type {Champ des données du Catalogue des étoiles} PListeObjets = ^TObjetsCelestes; TObjetsCelestes = Record elNom :String[22]; elCooGalX : Integer; elCooGalY : Integer; elCooGalZ : Integer; End; ... var Form1 : TForm1; Liste : TList; implementation uses Unit2; {$R *.lfm} {==============================================================================} {--- Initialisation du catalogue ------------------} procedure TForm1.FormCreate(Sender: TObject); begin Liste := TList.Create; // Création de la liste end; procedure TForm1.FormDestroy(Sender: TObject); begin Form1.btnToutSupprimerClick(nil); Liste.Free; end; {--- Transfert les Saisies de la Fiche Form2 vers le Buffer des Objets de la Liste -------------------------------------------------------------------------------} procedure TForm1.SaisieFicheToRecord(aObjet : PListeObjets); begin With aObjet^ Do With Form2 do begin elNom := edNom.Text; elCooGalX := edX.Value; elCooGalY := edY.Value; elCooGalZ := edZ.Value; end; end; {--- Affichage des Objets Célestes du Catalogue dans une ListBox --------------} Procedure TForm1.MAJAfficheListe; Var i:Integer; Begin ListBox1.Items.Clear; With Liste Do For i:=0 To Count-1 Do if Items[i] = nil then ListBox1.Items.Add('< liste vide >') else With TObjetsCelestes(Items[i]^) Do ListBox1.Items.Add(Format('%-20s%5d%5d%5d',[elNom,elCooGalX,elCooGalY,elCooGalZ])); lbNombre.Caption := IntToStr(Liste.Count); End; {--- Ajoute un Objet Céleste --------------------------------------------------- -------------------------------------------------------------------------------} procedure TForm1.btnAjouterClick(Sender: TObject); Var Objet : PListeObjets; begin {Valeurs par défaut} With Form2 do begin edNom.Text := 'Nouveau Objet Céleste'; edX.Value := 100; edY.Value := -200; edZ.Value := 300; end; {Affichage saisie nouveau Objet Céleste: étoile, galaxie, planète...} if Form2.ShowModal <> mrOK then Exit; {Création nouveau objet céleste dans Liste} New(Objet); SaisieFicheToRecord(Objet); Liste.Add(Objet); {Mise a jour Affichage} MAJAfficheListe; end; {--- Modifie un Objet Céleste -------------------------------------------------- -------------------------------------------------------------------------------} procedure TForm1.btnModifierClick(Sender: TObject); var Objet : PListeObjets; begin if ListBox1.ItemIndex < 0 then Exit; {Test si l'objet Céleste n'est pas vide (nil) } if Liste.Items[ListBox1.ItemIndex] = nil then Exit; {Affichage de ses données et valeurs} With TObjetsCelestes(Liste.Items[ListBox1.ItemIndex]^) Do With Form2 do begin edNom.Text := elNom; edX.Value := elCooGalX; edY.Value := elCooGalY; edZ.Value := elCooGalZ; end; {Demande de modification de l'objet Céleste} if Form2.ShowModal <> mrOK then Exit; {Mise à jour des valeurs} With TObjetsCelestes(Liste.Items[ListBox1.ItemIndex]^) Do SaisieFicheToRecord(Objet); { With TObjetsCelestes(Liste.Items[ListBox1.ItemIndex]^)Do With Form2 do Begin elNom := edNom.Text; elCooGalX := edX.Value; elCooGalY := edY.Value; elCooGalZ := edZ.Value; End; } {Mise a jour Affichage dans LisBox} MAJAfficheListe; end;
![]()
La liste se crée et s'affiche correctement dans la ListBox.
Le problème se trouve quand je veux modifier une valeur dans un Objet choisi dans la ListBox.
L'instruction en rouge Plante car Objet n'est pas affecté du Pointeur qui est en relation avec l'affichage des valeurs de l'Objet que l'on veut afficher.
Si je remplace l'instruction SaisieFicheToRecord(Objet); par son équivalent en Vert, ça marche. Cela confirme que Objet passé en paramètre n'est pas initialisé, mais je n'arrive pas à le faire...
Je tourne en rond et ne parviens pas à trouver la méthode pour affecter la valeur du pointeur de l'objet affiché !
Est-ce que quelqu'un a une idée ?
Je posterais ensuite le code dans son ensemble car j'ai testé d'autres possibilités qui fonctionnent.
Merci
Partager