|
Tous les
développeurs Delphi utilisent l'instruction
With MonObjet
do
begin
...
end;
Ce que beaucoup n'utilisent pas, c'est la possibilité
qu'offre Delphi d'ajouter une propriété ou objet contenu entre
With et do. Et cela peut parfois être très
intéressant comme nous allons le voir aujourd'hui.
Prenons un exemple de code qui nous servira à
manipuler l'objet TFont d'un TCanvas . Selon un choix effectué par
l'utilisateur, les différentes propriétés devront
être modifiées par code. Commençons par créer un
nouveau projet.
Pour ceux qui auraient la RxLibrary, poser un TFontComboBox
sur votre feuille pour choisir plus tard le nom de la fonte. Pour les autres,
ajouter l'unité Printers à la clause uses de votre programme,
poser un TCombobox simple (avec propriété Sorted := true). Dans
les 2 cas, la liste ainsi créée sera appelée
LesFontes. Dans l'événement OnCreate de la feuille,
écrivez:
LesFontes.ItemIndex := 0;
{si vous avez utilisé TFontCombobox}
ou {si vous
avez utilisé un TCombobox simple}
LesFontes.Items.Assign(Printer.Fonts);
LesFontes.ItemIndex :=
0;
Terminons en créant un composant TImage que nous
appelerons Image1 (toujours par défaut) et 4 boutons de commande
Button1, Button2, Button3 et Button4.
Nous allons écrire le code qui va nous permettre
d'écrire sur notre TImage la phrase (très originale) : "Exemple
d'utilisation de With". Ce code sera placé dans
l'événement OnClick de nos Tbutton. Pour mieux illuster notre
exemple, nous allons écrire 4 codes différents. Le code 1 sera
à affecté à Button1, Code2 à Button2, etc.
Code 1
{sans utilisation de
With}
Image1.Canvas.Font.Name :=
LesFontes.FontName; {si vous avez utilisé TFontCombobox}
ou {si vous
avez utilisé un TCombobox simple}
Image1.Canvas.Font.Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Image1.Canvas.Font.Color :=
clBlue;
Image1.Canvas.Font.Height :=
22;
Image1.Canvas.TextOut(10, 10,
'Exemple d''utilisation de With');
Code 2
{avec utilisation courante de
with}
with Image1 do
begin
Left := 0;
Canvas.Font.Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Canvas.Font.Color :=
clBlue;
Canvas.Font.Height :=
22;
Canvas.TextOut(10, 10,
'Exemple d''utilisation de With');
end;
Code 3
{avec utilisation imbriquée
de with}
with Image1
do
begin
left := 0;
with Canvas do
begin
with Font
do
begin
Name
:= LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Color
:= clBlue;
Height
:= 22;
end;
TextOut(10,
10, 'Exemple d''utilisation de With');
end;
end;
Dans ce petit bout de
code, cela est encore lisible. Mais imaginez les mêmes lignes
accompagnées d'instructions for , case, etc ., et vous
comprendrez pourquoi on utilise plus facilement le code 2, plus facile à
écrire.
Voyons maintenant le
plus concis!
Code 4 (le but final)
with Image1,
Canvas, Font do
begin
Left := 0;
Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Color := clBlue;
Height := 22;
TextOut(10, 10,
'Exemple d''utilisation de With');
end;
N'est-ce pas plus clair ? Alors, comme dirait quelqu'un de
célèbre:
"Comment ça marche ?"
Dans ce cas, le compilateur Delphi va examiner chaque
propriété et vérifier de façon ascendante à
qui il doit attribuer la propriété utilisée. Jouons son
rôle pendant quelques instants!
La première ligne va placer notre TImage à
gauche de notre TForm. Delphi va donc voir si l'objet Font possède une
propriété Left. Nous savons comme lui qu'il n'en est rien. Il va
ensuite passer à l'objet Canvas. IL obtiendra le même
résultat. Le composant Image1 par contre, a une propriété
de ce type. Il va donc tout simplement traduire en Image1.Left := 0;
Les 3 lignes suivantes ne peuvent s'appliquer (selon le
même raisonnement) qu'à l'objet Font. Le compilateur va donc
traduire en
Image1.Canvas.Font.Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Image1.Canvas.Font.Color :=
clBlue;
Image1.Canvas.Font.Height :=
22;
La dernière ligne s'appliquera au Canvas de l'objet
TImage et le compilateur traduira alors en :
Image1.Canvas.TextOut(10, 10,
'Exemple d''utilisation de With');
ATTENTION: N'oubliez pas que la recherche s'éffectue
de façon ascendante! C'est à dire que, pour le compilateur, le
premier objet à qui il sera possible d'affecter la
propriété sera utilisé.
Pour en terminer, voici le code complet de cet exemple:
unit Unit1;
interface
uses
Windows,
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
RxCombos, printers, ExtCtrls;
type
TForm1 =
class(TForm)
Label1:
TLabel;
LesFontes:
TFontComboBox;
Label2:
TLabel;
Image1:
TImage;
Button1:
TButton;
Button2:
TButton;
Button3:
TButton;
Button4:
TButton;
procedure
FormCreate(Sender: TObject);
procedure
Button1Click(Sender: TObject);
procedure
Button2Click(Sender: TObject);
procedure
Button3Click(Sender: TObject);
procedure
Button4Click(Sender: TObject);
private
{
Déclarations privées }
public
{
Déclarations publiques }
end;
var
Form1:
TForm1;
implementation
{$R *.DFM}
procedure
TForm1.FormCreate(Sender: TObject);
begin
LesFontes.ItemIndex := 0;
end;
procedure
TForm1.Button1Click(Sender: TObject);
begin
Image1.Left :=
0;
Image1.Canvas.Font.Name :=
LesFontes.FontName;
Image1.Canvas.Font.Color :=
clBlue;
Image1.Canvas.Font.Height :=
22;
Image1.Canvas.TextOut(10, 10,
'Exemple d''utilisation de With');
end;
procedure
TForm1.Button2Click(Sender: TObject);
begin
with Image1
do
begin
Left := 0;
Canvas.Font.Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Canvas.Font.Color :=
clBlue;
Canvas.Font.Height :=
22;
Canvas.TextOut(10, 10,
'Exemple d''utilisation de With');
end;
end;
procedure
TForm1.Button3Click(Sender: TObject);
begin
with Image1
do
begin
left := 0;
with Canvas do
begin
with Font
do
begin
Name
:= LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Color
:= clBlue;
Height
:= 22;
end;
TextOut(10,
10, 'Exemple d''utilisation de With');
end;
end;
end;
procedure
TForm1.Button4Click(Sender: TObject);
begin
with Image1,
Canvas, Font do
begin
Left := 0;
Name :=
LesFontes.Items[LesFontes.ItemIndex]; {si vous avez utilisé
TCombobox}
Color := clBlue;
Height := 22;
TextOut(10, 10,
'Exemple d''utilisation de With');
end;
end;
end.
Vous verrez, avec un peu d'habitude, on s'y fait très
vite, et on finit par en redemander.
A bientôt
Alphomega
Mon
site |