Delphi

إخواني الكرام أخواتي الكريمات يسرني أن أقدم لكم هذا البرنامج التعليمي من دار النشر Pages Bleues الصغير في حجمه الكبير في محتواه

البرنامج عبارة عن دروس و أعمال موجهة محلولة باللغة الفرنسية في لغة البرمجة 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 :
  • 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.
2. Modifications de certaines propriétés du composant grEleves
  • 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.
    
3. Actualisation des menus pendant l'exécution de l'application
  • 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.
4. Trier en ordre croissant ou décroissant les données de la grille
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.
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;
5. Afficher les photos des élèves
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 :
procedure TfmPhoto.FormShow(Sender: TObject);
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: