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 |