← Retour aux parutions

Petite application de gestion

Article publié le Mercredi 12 novembre 2025 • 1 vues

TUTORIEL

Introduction

Tutoriel pas‑à‑pas.
Création d'une petite application de gestion (Formulaire, boutons, champs, actions).

1. Prérequis

  • Delphi (Embarcadero RAD Studio) installé — toute version récente supportant VCL (ex. Delphi XE, 10.x, 11.x).
  • Connaissances de base en Object Pascal (variables, procédures, événements).
  • Un PC Windows pour compiler des applications VCL.

Remarque : ce tutoriel utilise l'EDI Delphi standard et le concepteur visuel (Form Designer).

2. Objectif de l'application

Nous allons créer une application VCL simple qui :

  • Permet à l'utilisateur d'entrer un nom et un âge.
  • Affiche un message de bienvenue et valide l'âge.
  • Enregistre les entrées dans une simple liste affichée dans la fenêtre (TListBox).

3. Créer le projet

  1. Ouvrez Delphi.
  2. Fichier → Nouveau → Application VCL (VCL Forms Application - Delphi).
  3. Delphi génère un projet avec un formulaire principal (Form1).
Conseil : Sauvegardez immédiatement le projet : File → Save All et créez un dossier dédié (ex. C:\Projets\Delphi\TutoVCL).

4. Concevoir l'interface

Ajoutez sur Form1 les composants suivants depuis la Pallette :

  • TLabel — pour les étiquettes "Nom" et "Âge".
  • TEdit — pour la saisie du nom (NomEdit).
  • TEdit — pour la saisie de l'âge (AgeEdit) ; Propriété Text vide.
  • TButton — pour enregistrer (BtnAjouter).
  • TListBox — pour afficher la liste des personnes (ListBox1).
  • TButton — pour effacer la liste (BtnEffacer).

Attribuez des noms (ObjectName) explicites pour rendre le code lisible : NomEdit, AgeEdit, BtnAjouter, ListBox1, BtnEffacer.

5. Écrire le code — logique de base

Double-cliquez sur le bouton Ajouter et collez/écrivez le code suivant :

// unité principale : Unit1.pas
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    NomEdit: TEdit;
    AgeEdit: TEdit;
    BtnAjouter: TButton;
    ListBox1: TListBox;
    BtnEffacer: TButton;
    procedure BtnAjouterClick(Sender: TObject);
    procedure BtnEffacerClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtnAjouterClick(Sender: TObject);
var
  nom: string;
  age, a: Integer;
begin
  nom := Trim(NomEdit.Text);
  if nom = '' then
  begin
    ShowMessage('Veuillez saisir un nom.');
    Exit;
  end;

  if not TryStrToInt(Trim(AgeEdit.Text), a) then
  begin
    ShowMessage('Âge invalide : saisissez un nombre.');
    Exit;
  end;
  age := a;

  if age < 0 then
  begin
    ShowMessage('Âge invalide : doit être positif.');
    Exit;
  end;

  // Ajouter dans la liste
  ListBox1.Items.Add(Format('%s — %d ans', [nom, age]));

  // Réinitialiser les champs
  NomEdit.Text := '';
  AgeEdit.Text := '';
  NomEdit.SetFocus;
end;

procedure TForm1.BtnEffacerClick(Sender: TObject);
begin
  if MessageDlg('Effacer la liste ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    ListBox1.Items.Clear;
end;

end.
Pascal

Explications : TryStrToInt convertit en sécurité, on vérifie les entrées et on ajoute un élément formaté dans TListBox.Items.

6. Ajouter une icône, options de compilation

  • Projet → Options → Application → Icones : ajoutez une icône .ico si besoin.
  • Projet → Options → Compiler : choisissez l'optimisation et le niveau de debug selon besoin.
  • Pour créer un exécutable 64-bit (si disponible) : Configuration Manager → Platform → Win64.

7. Compiler et exécuter

  1. Ctrl+F9 pour compiler le projet.
  2. F9 pour exécuter l'application dans le debugger.
  3. Testez plusieurs entrées et cas d'erreur (nom vide, âge non numérique, âge négatif).

8. Améliorations possibles

  • Persistance : enregistrer la liste dans un fichier (TStringList.SaveToFile/LoadFromFile).
  • Validation améliorée (contrôle de plage pour l'âge).
  • Utiliser un TListView pour colonnes (Nom / Âge) au lieu de TListBox.
  • Ajouter suppression d'éléments, édition, recherche.

9. Exemple : sauvegarde / chargement

Ajoutez deux boutons BtnSauver et BtnCharger et utilisez :

procedure TForm1.BtnSauverClick(Sender: TObject);
begin
  ListBox1.Items.SaveToFile('personnes.txt');
  ShowMessage('Enregistré.');
end;

procedure TForm1.BtnChargerClick(Sender: TObject);
begin
  if FileExists('personnes.txt') then
    ListBox1.Items.LoadFromFile('personnes.txt')
  else
    ShowMessage('Aucun fichier trouvé.');
end;
Pascal

10. Débogage & bonnes pratiques

  • Ajoutez des points d'arrêt et utilisez le debugger pour inspecter variables et flux.
  • Séparez la logique métier de l'interface si le projet grandit (unités dédiées).
  • Commentez le code et utilisez des noms explicites pour composants et variables.

11. Ressources utiles

  • Documentation Embarcadero Delphi — guides VCL et RTL.
  • Exemples officiels fournis avec l'installation Delphi.
  • Forums et groupes (StackOverflow, groupes Facebook/Discord dédiés à Delphi).

Présentation

Application simple avec création, lecture, mise à jour et suppression (CRUD), recherche et sauvegarde (CSV ou SQLite).

1. Prérequis

  • Delphi (RAD Studio) installé (versions récentes compatibles VCL).
  • Connaissances de base en Object Pascal et utilisation du Form Designer.
  • Optionnel : FireDAC / SQLite si vous souhaitez une base embarquée.

2. Fonctionnalités prévues

  • Ajouter, modifier, supprimer un contact (Nom, Prénom, Email, Téléphone, Adresse).
  • Afficher la liste des contacts (TListView ou TStringGrid).
  • Rechercher par nom ou email.
  • Sauvegarde / chargement sous forme de fichier CSV (ou SQLite en option).

3. Créer le projet

  1. Fichier → Nouveau → Application VCL (VCL Forms Application).
  2. Sauvegardez le projet : File → Save All → dossier Projets\ContactsVCL.

4. Conception de l'interface

Sur Form1, placez les composants suivants :

  • TLabel : étiquettes pour les champs.
  • TEdit : edtPrenom, edtNom, edtEmail, edtTel, edtAdresse (TEdit ou TMemo pour adresse longue).
  • TButton : btnAjouter, btnModifier, btnSupprimer, btnSauver, btnCharger.
  • TListView (ou TStringGrid) : lvContacts — affichage des contacts (colonnes : Prénom, Nom, Email, Téléphone).
  • TEdit : edtRecherche + TButton btnRecherche ou utiliser l'événement OnChange pour filtrer.

Nommez clairement les composants (ex. edtNom, btnAjouter, lvContacts) pour faciliter le code.

5. Structure des données (record)

Nous utilisons un record pour représenter un contact et une liste TList<TContact> (génériques) pour stocker en mémoire :

type
TContact = record
	Prenom: string;
	Nom: string;
	Email: string;
	Tel: string;
	Adresse: string;
end;

  TContacts = TList;

var
  Contacts: TContacts; // initialiser dans FormCreate
			
Pascal

6. Code : initialisation et utilitaires

uses
System.Generics.Collections, System.SysUtils, Vcl.ComCtrls;

procedure TForm1.FormCreate(Sender: TObject);
begin
	Contacts := TContacts.Create;
	// config ListView en mode report
	lvContacts.ViewStyle := vsReport;
	lvContacts.Columns.Clear;
	lvContacts.Columns.Add.Caption := 'Prénom';
	lvContacts.Columns.Add.Caption := 'Nom';
	lvContacts.Columns.Add.Caption := 'Email';
	lvContacts.Columns.Add.Caption := 'Téléphone';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
	Contacts.Free;
end;

procedure TForm1.RefreshListView;
	var
	i: Integer; lvItem: TListItem; c: TContact;
	
	begin
		lvContacts.Items.BeginUpdate;
		try
		lvContacts.Items.Clear;
		for i := 0 to Contacts.Count - 1 do
		begin
			c := Contacts[i];
			lvItem := lvContacts.Items.Add;
			lvItem.Caption := c.Prenom;
			lvItem.SubItems.Add(c.Nom);
			lvItem.SubItems.Add(c.Email);
			lvItem.SubItems.Add(c.Tel);
			end;
			finally
			lvContacts.Items.EndUpdate;
		end;
	end;
			
Pascal

7. Ajouter un contact

procedure TForm1.btnAjouterClick(Sender: TObject);
var
  c: TContact;
begin
	// Validation simple
	if Trim(edtNom.Text) = '' then
	begin
	ShowMessage('Nom requis');
	Exit;
end;

	c.Prenom := Trim(edtPrenom.Text);
	c.Nom    := Trim(edtNom.Text);
	c.Email  := Trim(edtEmail.Text);
	c.Tel    := Trim(edtTel.Text);
	c.Adresse:= Trim(edtAdresse.Text);

	Contacts.Add(c);
	RefreshListView;

	// Réinitialiser les champs
	edtPrenom.Text := '';
	edtNom.Text := '';
	edtEmail.Text := '';
	edtTel.Text := '';
	edtAdresse.Text := '';
	edtNom.SetFocus;
end;
			
Pascal

8. Sélection / Modification / Suppression

Lorsqu'un élément est sélectionné dans le ListView, chargez ses données dans les champs pour modification :

procedure TForm1.lvContactsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var
	idx: Integer; c: TContact;
begin
	if not Selected then Exit;
	idx := Item.Index;
	c := Contacts[idx];
	edtPrenom.Text := c.Prenom;
	edtNom.Text := c.Nom;
	edtEmail.Text := c.Email;
	edtTel.Text := c.Tel;
	edtAdresse.Text := c.Adresse;
end;

procedure TForm1.btnModifierClick(Sender: TObject);
var
	idx: Integer; c: TContact;
	
begin
	if not Assigned(lvContacts.Selected) then
	begin
		ShowMessage('Sélectionnez un contact');
		Exit;
	end;
	idx := lvContacts.Selected.Index;
	c.Prenom := Trim(edtPrenom.Text);
	c.Nom    := Trim(edtNom.Text);
	c.Email  := Trim(edtEmail.Text);
	c.Tel    := Trim(edtTel.Text);
	c.Adresse:= Trim(edtAdresse.Text);
	Contacts[idx] := c;
	RefreshListView;
end;

procedure TForm1.btnSupprimerClick(Sender: TObject);
var
	idx: Integer;
	
begin
	if not Assigned(lvContacts.Selected) then
	begin
		ShowMessage('Sélectionnez un contact');
		Exit;
	end;
	idx := lvContacts.Selected.Index;
	if MessageDlg('Supprimer ce contact ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
	begin
		Contacts.Delete(idx);
		RefreshListView;
	end;
end;
			
Pascal

9. Recherche

Recherche simple par nom ou email — filtre en mémoire :

procedure TForm1.btnRechercheClick(Sender: TObject);
var
	i: Integer; q: string; c: TContact; lvItem: TListItem;
  
begin
	q := LowerCase(Trim(edtRecherche.Text));
	lvContacts.Items.BeginUpdate;
	try
		lvContacts.Items.Clear;
		for i := 0 to Contacts.Count - 1 do
		begin
		  c := Contacts[i];
		  if (q = '') or (Pos(q, LowerCase(c.Nom)) > 0) or (Pos(q, LowerCase(c.Email)) > 0) then
			begin
				lvItem := lvContacts.Items.Add;
				lvItem.Caption := c.Prenom;
				lvItem.SubItems.Add(c.Nom);
				lvItem.SubItems.Add(c.Email);
				lvItem.SubItems.Add(c.Tel);
			end;
		end;
		finally
		lvContacts.Items.EndUpdate;
	end;
end;
			
Pascal

10. Sauvegarde / Chargement (CSV simple)

Format CSV basique : chaque contact sur une ligne, champs échappés par ; ou autre séparateur.

procedure TForm1.btnSauverClick(Sender: TObject);
var
	sl: TStringList; i: Integer; c: TContact; line: string;

begin
	sl := TStringList.Create;
	try
	for i := 0 to Contacts.Count - 1 do
		begin
			c := Contacts[i];
			// échapper ; si besoin
			line := Format('"%s";"%s";"%s";"%s";"%s"', [c.Prenom, c.Nom, c.Email, c.Tel, c.Adresse]);
			sl.Add(line);
		end;
		sl.SaveToFile('contacts.csv');
		ShowMessage('Sauvegardé dans contacts.csv');
		finally
		sl.Free;
	end;
end;

procedure TForm1.btnChargerClick(Sender: TObject);
var
	sl: TStringList; i: Integer; parts: TArray; c: TContact; s: string;
	
begin
  if not FileExists('contacts.csv') then
	begin
		ShowMessage('Fichier contacts.csv introuvable');
		Exit;
	end;
	sl := TStringList.Create;
	try
		sl.LoadFromFile('contacts.csv');
		Contacts.Clear;
		for i := 0 to sl.Count - 1 do
		begin
		  s := sl[i];
		  // Supposons le format "a";"b";"c";... -> retirer les " puis Split(';')
		  s := s.Replace('"','');
		  parts := s.Split([';']);
		  if Length(parts) >= 4 then
			begin
				c.Prenom := parts[0];
				c.Nom    := parts[1];
				c.Email  := parts[2];
				c.Tel    := parts[3];
				if Length(parts) >= 5 then c.Adresse := parts[4]
				else c.Adresse := '';
				Contacts.Add(c);
			end;
    end;
    RefreshListView;
	finally
		sl.Free;
	end;
end;
			
Pascal

11. Option avancée : utiliser SQLite via FireDAC

Si vous préférez une base embarquée, utilisez FireDAC + SQLite (composants FireDAC disponibles dans Delphi). Exemple rapide :

-- Créez un DataModule, placez TFDMemtable / TFDConnection / TFDQuery
-- Exemple pseudo-configuration :
FDConnection1.Params.DriverID := 'SQLite';
FDConnection1.Params.Database := 'contacts.db';
FDConnection1.Connected := True;

// SQL pour création de table (si pas d'existence)
FDConnection1.ExecSQL('CREATE TABLE IF NOT EXISTS contacts (id INTEGER PRIMARY KEY AUTOINCREMENT, prenom TEXT, nom TEXT, email TEXT, tel TEXT, adresse TEXT)');

// Pour charger
FDQuery1.SQL.Text := 'SELECT id, prenom, nom, email, tel, adresse FROM contacts';
FDQuery1.Open;

// Pour insérer
FDQuery1.SQL.Text := 'INSERT INTO contacts (prenom, nom, email, tel, adresse) VALUES (:p1,:p2,:p3,:p4,:p5)';
FDQuery1.Params[0].AsString := c.Prenom; // etc
FDQuery1.ExecSQL;
Pascal

L'approche FireDAC est préférable pour des volumes importants, recherche SQL, tris, et intégrité.

12. Bonnes pratiques & améliorations

  • Validez les emails avec une expression régulière si nécessaire.
  • Sécurisez l'accès au fichier de données (répertoire %APPDATA% plutôt que dossier de l'exécutable).
  • Séparez la logique métier dans une unité (DataModule) pour faciliter tests et maintenance.
  • Ajoutez export vCard / import depuis CSV externes.
  • Prévoir tri / pagination si la liste devient volumineuse.

13. Debug & test

  • Testez les cas limites : champs vides, caractères spéciaux, fichiers corrompus.
  • Ajoutez sauvegardes automatiques (autosave) et confirmation de fermeture si données non sauvegardées.

14. Exemple de packaging

Sous Windows, générez l'exécutable (Release), vérifiez les DLL nécessaires si vous utilisez SQLite (sqlite3.dll), et fournissez le dossier de données (contacts.csv ou contacts.db).

15. Captures d'écran — pas à pas