Aide Mémoire Delphi

Felix

Introduction

Cette page à pour but de rappeler quelques Trucs de programmation en Delphi.


Astuces

  1. Paramètre Sender: Comment Utiliser une seule procedure OnClick pour plusieurs Boutons. Exemple 1
  2. Remplir rapidement les champs .text ou .caption de nombreux contrôles d'un formulaire. Exemple 2
  3. Contrôle Twebbrowser.Exemple 3
Ces exemples sont fait à partir de Delphi turbo Explorer mais la plupart fonctionnent dans les autres versions de Delphi.

Exemple 1: 

Paramètre Sender: Comment Utiliser une seule procédure OnClick pour plusieurs Boutons.

Creéez une nouvelle Fiche Form1, sur laquelle on pose 3 boutons (button1, button2, button3) .  Dans Tform1, déclarez une procédure BoutonClick (Sender: Tobject) et implémentez cette procédure dans la partie implémentation (on peut utiliser les touches ctrl+shift+c )

voir Code ci-dessous

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure BoutonClick(Sender : Tobject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.BoutonClick(Sender: Tobject);
begin
  if Sender=Button1 then showmessage('Vous avez cliqué sur le 1er Bouton') else showmessage('Vous n''avez pas cliqué sur le 1er bouton');
  showmessage('Vous avez cliqué sur ' + TButton(Sender).Caption + ' Objet de Classe '+Sender.ClassName);
end;
end.


Si vous copiez collez ce texte, à l'exécution les boutons ne fonctionnent pas, il faut donc  pour chaque bouton paramétrer l'évènement OnClick.

Pour chaque boutons du formulaire: sélectionnez le, et dans l'inspecteur d'objets, sur l'évènement OnClick, a l'aide de la zone de liste choisissez la procédure BoutonClick; les 3 boutons  visent donc la procédure BoutonClick (3 boutons, 1 procédure).

Explications

Le paramètre Sender Contient l'objet appelant la procédure , on peut donc tester sender pour connaître l'objet appelant avec un  "if sender=Objet"
Par contre, pour atteindre les propriétés, méthodes de l'objet ,  il est nécessaire de transtyper Sender "Ici Tbutton(Sender)" avec le type de l'objet attendu, si le type de l'objet n'est pas connu on peut le récupérer avec Sender.ClassName.

Ajoutez un Champ Tedit dans la Form1 et dans l'événement OnClick du  champ choisissez la procédure BoutonClick.
Modifiez la procédure comme ceci.

procedure TForm1.BoutonClick(Sender: Tobject);
begin
  if Sender.ClassName='TEdit' then Tedit(Sender).Text:='Felix';
  if (Sender.ClassName='TButton')and (Sender=Button1) then showmessage('Vous avez cliqué sur le 1er Bouton') else showmessage('Vous n''avez pas cliqué sur le 1er bouton');
  showmessage('Vous avez cliqué sur ' + TButton(Sender).Caption + ' Objet de Classe '+Sender.ClassName);
end;

On teste le type d'objet envoyé et on peut agir en conséquence avec le bon transtypage ici TEdit() et TButton();
Attention à l'orthographe (Majuscules, Minuscules) dans les test de Sender.classname.

Exemple 2:

Remplir rapidement les champs .text ou .caption de nombreux contrôles d'un formulaire.

Créez une nouvelle Fiche Form1, sur laquelle on pose 3 champ TEdit (Titi, Tata, Toto), un bouton Button1 .  Complétez le code de Unit1 comme ci-dessous.
En mode conception, double cliquez sur le bouton de manière à remplir l'évenement OnClick sur la procédure Button1click et double-cliquez dans une partie grise du formulaire afin de remplir l'évènement  OnCreate du formulaire sur la procédure  FormCreate;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Titi: TEdit;
    Tata: TEdit;
    Toto: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  Mo:TList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    Tab: Array[0..2] of String;
begin
  for i:=0 to 2 do Tab[i]:='Mon Edit'+ intTostr(i);
  For i:=0 to Mo.Count-1 do Tedit(Mo.Items[i]).Text:=Tab[i];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Mo:=TList.Create;
  Mo.Add(Titi);
  Mo.Add(Tata);
  Mo.Add(Toto);
end;

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

end.

Si vous lancez le programme et cliquez sur le bouton, vous remplissez les 3 champs en une ligne de code,
On utilise pour cela une liste d'objets (ici la liste Mo.) personalisée avec les composants qui nous intéressent et avec le transtypage TEdit() et les items de Mo, on peut remplir les zones texte des champs.
Ceci est intérressant si vous avez de nombreux champs à remplir ou à initialiser plusieurs fois dans le programme.
Une autre solution dans le cas ou les noms des champs sont du type Edit1, Edit2, Edit3, etc...
on peut utiliser la fonction FindComponent() et dans ce cas il n'y a pas besoin de créer de liste d'objets.

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  T:array[0..2] of string;
begin
  T[0]:='Mon Edit1';
  T[1]:='Mon Edit2';
  T[2]:='Mon Edit3';
  for I := 0 to 2 do TEdit(Form1.FindComponent('Edit'+IntToStr(i+1))).text:=T[i];
end;

Exemple 3:

Contrôle Twebbrowser




end.
Visites: