البرنامج عبارة عن دروس و أعمال موجهة محلولة باللغة الفرنسية في لغة البرمجة Delphi النسخة 5 ولكن تستطيع التعلم به في النسختين 6 و 7
الدروس مقسمة إلى 12 فصل كل فصل عبارة عن ملف PDF
بالإضافة إلى هذا يوجد أيضا كود سورس لحلول تمارين الأعمال الموجهة
إختر رابط واحد من هذه الروابط
Mediafire
http://www.mediafire.com/?89xcthu7sa38hu4
Megaupload
http://www.megaupload.com/?d=0C7CCTLA
4shared
http://www.4shared.com/file/8-mxywtE/Delphi5-PB.html
1. Objectifs
Le but de ce TP est d'améliorer sensiblement le programme réalisé la semaine dernière (TP3). Parmi les principales améliorations proposées, on peut citer :2. Modifications de certaines propriétés du composant grEleves
- La possibilité de régler manuellement les largeurs des colonnes
- L'actualisation des commandes de menu (par exemple, la commande Fermer ne doit pas être accessible lorsqu'aucune liste d'élèves n'est affichée)
- La possibilité de trier les élèves en ordre croissant ou décroissant selon n'importe quelle colonne.
- La possibilité de voir la photo d'un élève.
3. Actualisation des menus pendant l'exécution de l'application
- Rouvrir le projet ListesEleves.
- Sélectionner le composant grEleves et modifier la propriété Options comme le montre la figure ci-dessous.
- Modifier également la propriété Anchors comme ci-dessous.
![]()
- Faire un double-clic sur le composant MenuPrincipal et modifier les items mnFermer et mnImprimer en mettant leur propriété Enabled à False. Ainsi, au lancement de l'application, seules les commandes Ouvrir et Quitter seront accessibles.
- Modifier la procédure mnOuvrirClick en ajoutant, un peu avant la fin de la procédure, 3 lignes permettant de changer les propriétés Enabled des 3 commandes Ouvrir, Fermer, Imprimer :
mnOuvrir.Enabled:=false;
mnFermer.Enabled:=true;
mnImprimer.Enabled:=true;
end;
FichierEleves.Free;
end;
- Modifier la procédure mnFermerClick de la façon suivante :
procedure TfmListesEleves.mnFermerClick(Sender: TObject);
begin
grEleves.visible:=false;
mnOuvrir.Enabled:=true;
mnFermer.Enabled:=false;
mnImprimer.Enabled:=false;
end;
- Lancer l'application pour contrôler le bon fonctionnement des commandes.
L'objectif est de permettre à l'utilisateur, d'un simple clic sur le titre de l'une des 18 colonnes, de déclencher le classement des élèves selon les données de la colonne choisie. Si l'utilisateur fait un clic sur le titre de la colonne prénoms, alors les données devront être triées dans l'ordre alphabétique croissant des prénoms des élèves. S'il fait un second clic sur cette même colonne, alors les données devront êtres classées dans l'ordre alphabétique décroissant des prénoms... S'il fait ensuite un clic sur la colonne des noms, alors la liste sera affichée aussitôt dans l'ordre croissant des noms des élèves.
Pour réaliser cet objectif complexe, il faut procéder en plusieurs étapes.
4.1. Permettre à l'utilisateur de cliquer sur la colonne des titres
Lors de la création de la fiche, le composant grEleves avait une ligne et une colonne en gris (par défaut, les proprités FixedCols et FixedRows sont égales à 1). Cela entraîne notamment qu'un clic de souris sur une cellule grisée ne produit aucun effet. Il faut donc commencer par mettre la propriété FixedRows à 0.
Si on lance maintenant l'application, on peut constater maintenant que les cellules de la première rangée sont accessibles aux clics de la souris.
4.2. Modifier le comportement de l'affichage des cellules de la première rangée (ligne)
Afin de bien distinguer la ligne des titres des autres lignes, il convient de modifier son affichage. Pour cela, sélectionner le composant grEleves et, dans l'inspecteur d'objets, onglet Evénements, faire un double-clic dans la zone de saisie de l'événement OnDrawCell. Écrire alors le code suivant :
procedure TfmListesEleves.grElevesDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var ch:string;
begin
with grEleves do if (Arow=0)and(Acol>0) then
begin
ch:=cells[Acol,Arow];
canvas.Brush.Color:=clGreen;
canvas.Brush.Style:=bsSolid;
canvas.Rectangle(Rect.left-1,rect.top,rect.right+1,rect.bottom+1);
canvas.textout(rect.left+2,rect.top+2,ch);
end;
end;
4.3. Répondre à un clic de souris sur le titre d'une colonne
Sélectionner le composant grEleves et, dans l'onglet Evenements de l'inspecteur d'objets, choisir l'événement OnClick. Écrire alors le code suivant :
procedure TfmListesEleves.grElevesClick(Sender: TObject);
var ch : string;
car : char;
begin
with grEleves do if (row=0)and(col>0) then
begin
ch:=cells[col,row];
car:=ch[length(ch)]; //car est le dernier caractère de la chaîne ch
case car of
'<' : ch:=copy(ch,1,length(ch)-2)+' >'; {la colonne sera triée en ordre décroissant}
'>' : ch:=copy(ch,1,length(ch)-2)+' <'; {la colonne sera triée en ordre croissant}
else ch:=ch+' <'; //la colonne sera triée en ordre croissant
end;
FormCreate(sender);
cells[col,row]:=ch;
car:=ch[length(ch)]; //indiquera dans quel sens se fera le tri
//Trier(col,car);
end;
end;
Lancer l'application pour comprendre ce qui se passe. Cliquer avec le bouton gauche successivement sur plusieurs titres de colonnes. Pour l'instant, rien ne se passe car la dernière ligne est désactivée par la présence des 2 caractères " // ".
Il s'agit maintenant de lancer effectivement le tri.
4.4. Lancement du tri proprement dit.
C'est la procédure la plus compliquée. Je ne m'étendrai pas sur la méthode employée, appelée " tri à bulles " (Bubble sort) car se serait trop long. Pour ceux qui s'intéressent aux méthodes de tri, il faut simplement savoir qu'il existe de nombreuses techniques, plus ou moins rapides et plus ou moins complexes. Le " tri à bulles " est certes un peu lent, mais très facile à mettre en œuvre et convient parfaitement pour des tableaux ayant moins de 100 lignes à trier.
- Insérer le code ci-dessous, entre les procédures mnImprimerClick et grElevesClick :
procedure Trier(col:integer;car:char);
var i,j,n : integer;
procedure Permuter(a,b:integer);
var ch : string;
i : integer;
begin
with fmListesEleves.grEleves do for i:=0 to 18 do
begin
ch:=cells[i,a];
cells[i,a]:=cells[i,b];
cells[i,b]:=ch;
end;
end;
begin
n:=1;
with fmListesEleves.grEleves do
begin
while cells[col,n]<>'' do inc(n); {n contient alors le nombre de lignes non vides}
for i:=1 to n-1 do
for j:=1 to n-i-1 do
begin
if (cells[col,j]>cells[col,j+1])and(car='<')then Permuter(j,j+1);
if (cells[col,j]')then Permuter(j,j+1);
end ;
end;
end;
- Supprimer les 2 caractères " // " dans la dernière ligne de la procédure grElevesClick afin de rendre cette ligne active et de lancer le tri.
- Lancer l'application.
On peut constater que tout se passe comme prévu, sauf en ce qui concerne la colonne des dates : si on veut trier les élèves dans l'ordre croissant des dates de naissance, ça ne marche pas. Plus exactement, le premier élève sera celui qui sera né le plus tôt dans un mois quelconque.5. Afficher les photos des élèves
Pour obtenir un tri correct, même pour les dates de naissance, il faut modifier les procédures précédentes. Voici le nouveau texte (les modifications sont en caractères gras) :
procedure Trier(col:integer;car:char);
var i,j,n : integer;
ch1,ch2 : string;
procedure Permuter(a,b:integer);
var ch : string;
i : integer;
begin
with fmListesEleves.grEleves do for i:=0 to 18 do
begin
ch:=cells[i,a];
cells[i,a]:=cells[i,b];
cells[i,b]:=ch;
end;
end;
begin
n:=1;
with fmListesEleves.grEleves do
begin
while cells[col,n]<>'' do inc(n); {n contient alors le nombre de lignes non vides}
for i:=1 to n-1 do
for j:=1 to n-i-1 do if col<>3 then
begin
if (cells[col,j]>cells[col,j+1])and(car='<')then Permuter(j,j+1);
if (cells[col,j]')then Permuter(j,j+1);
end
else
begin
ch1:=Copy(cells[col,j],7,4)+'/'+copy(cells[col,j],4,2)+'/'+copy(cells[col,j],1,2)
ch2:=Copy(cells[col,j+1],7,4)+'/'+copy(cells[col,j+1],4,2)+'/'+
copy(cells[col,j+1],1,2);
if (ch1>ch2)and(car='<')then Permuter(j,j+1);
if (ch1')then Permuter(j,j+1);
end;
end;
end;
Dans notre lycée, la quasi-totalité des élèves ont été pris en photo en début d'année. Ces photos sont utilisées en particulier par les professeurs pour réaliser les trombinoscopes de leurs classes. Les photos sont enregistrées dans un dossier nommé " photos " au format jpg et prennent donc peu de place. Le nom de la photo est construit à partir du code de l'élève. Comme ce code est différent pour chaque élève, cela permet d'identifier sans ambiguïté chaque photo. Les codes des élèves sont situés dans la colonne 12 de la grille. Ainsi, si un élève a le code 1607, sa photo sera enregistrée sous le nom "1607.jpg ".
Comme d'habitude, pour réaliser cela, il faut préparer les composants puis écrire le code.
5.1. Préparation des composants
- Ajouter une nouvelle fiche au projet ListesElèves en cliquant sur le bouton Nouvelle fiche. (On peut aussi cliquer sur le bouton Nouveau puis choisir Nouvelle Fiche).
- Modifier les propriétés suivantes :
Name : fmPhoto
Caption : Photo
- Ajouter un composant Image (se trouve dans la palette Supplément) et modifier la propriété :
Name : image
- Ajouter un bouton et modifier ses propriétés :
Name : btOK
Caption : &OK
- Cliquer sur le bouton Enregistrer tout et donner le nom uPhoto à l'unité Unit1
5.2. Ajout du code
- Il faut commencer par ajouter, dans la partie Uses de l'unité uPhoto, le mot JPEG dans la listes des unités requises, ainsi que l'unité uListesEleves, dans la liste des unités locales. Voici le texte du début de cette unité. Les éléments à ajouter sont en gras :
unit uPhoto;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, JPeg;
type
TfmPhoto = class(TForm)
Image: TImage;
btOK: TButton;
procedure FormShow(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
fmPhoto: TfmPhoto;
implementation
{$R *.DFM}
uses uListesEleves;
- Il faut ensuite sélectionner la fiche fmPhoto et, dans l'inspecteur d'objets, onglet Evenements, choisir l'événement OnShow et ajouter le code suivant :
var NomFichierPhoto : string;
begin
with fmListesEleves.grEleves do
NomFichierPhoto:='T:\TP Delphi\Photos\'+cells[12,row]+'.jpg';
If FileExists(NomFichierPhoto) then
image.Picture.LoadFromFile(NomFichierPhoto)
else ShowMessage('La photo est introuvable');
end;
5.3. Ajuster la photo au cadre de l'image
Il suffit de modifier la propriété Stretched du composant Image en mettant sa valeur à True.
Aucun commentaire:
La publication de nouveaux commentaires n'est pas autorisée.