janvier
2009
Voilà le dixième article de la série consacrée à la persistance des objets.
Il traite de la gestion d’une personne du répertoire : modification, création, suppression.
2.1.5.3 – Modifier une personne
Pour pouvoir lancer la modification d’une personne, implémentons le code de l’action aEdit de la catégorie Person.
begin
if ListBox1.ItemIndex < 0 then begin
MessageDlg('Sélectionnez une ligne', mtError, [mbOK], 0);
Exit;
end;
TFormPerson.Execute(TPerson(People.List.Items[ListBox1.ItemIndex]));
DisplayList;
end;
Tout d’abord le code vérifie qu’une ligne de la ListBox est bien sélectionnée. Si c’est le cas, la méthode de classe TFormPerson.Execute est lancée, avec l’objet à modifier en paramètre. L’objet étant déjà inclus dans la liste People, aucune autre action n’est nécessaire.
Finalement DisplayList procède au rafraichissement de l’affichage de la ListBox.
2.1.5.4 – Créer une personne
La création d’une personne est tout aussi simple.
var
newPerson: TPerson;
begin
newPerson := TPerson.Create;
TFormPerson.Execute(newPerson);
if newPerson = nil then
Exit;
if newPerson.Dirty then
begin
People.Add(newPerson);
DisplayList;
end
else
newPerson.Free;
end;
L’insertion d’une nouvelle personne nécessite la création d’un nouvel objet TPerson vide : newPerson. Son état sera donc bosEmpty. Si nous validons la saisie dans FormPerson avec le bouton Validate qui met Dirty à True, l’état passera de bosEmpty à bosCreate. Si newPerson est détruit, on abandonne l’opération. Sinon, si l’objet est Dirty, on l’ajoute à la liste People. La méthode People.Add est donc sensée mettre l’état de l’objet à bosClean. Il faut modifier la méthode en conséquence:
begin
aPerson.Dirty := False;
FList.Add(aPerson);
end;
Le fait de mettre Dirty à false a pour conséquence de mettre l’état de l’objet à bosClean.
begin
if Value = True then
case FState of
bosEmpty: FState := bosCreate;
bosDeleted: FState := bosDelete;
bosClean: FState := bosUpdate;
//...
end
else
FState := bosClean;
end;
2.1.5.5 – Supprimer une personne
Le code pour l’effacement d’un objet est des plus dépouillés. Une seule ligne fait tout le travail.
begin
if ListBox1.ItemIndex < 0 then begin
MessageDlg('Sélectionnez une ligne', mtError, [mbOK], 0);
Exit;
end;
if (MessageDlg('Effacer "'+ListBox1.Items[ListBox1.ItemIndex]+'" ?',
mtConfirmation, [mbYes,mbNo], 0) = mrYes)
then begin
People.List.Delete(ListBox1.ItemIndex);
DisplayList;
end;
end;