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!


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;
Unit2 est juste une fiche modale ne comprenant aucune ligne de code pour la saisie des données :

Nom : Aide15.jpg
Affichages : 239
Taille : 23,8 Ko

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