TUTORIEL SUR LA CRÉATION D'UN COMPOSANT COMPOSITE VISUEL
Un composant graphique composite est un composant comprenant plusieurs composants. Tout composant visuel se sert de la VCL. On y trouve les Boutons, les Labels etc.. Pour encapsuler les différents composants que vous aurez à choisir il vous faut choisir un composant Conteneur. Le plus approprié est sans doute le TCustomPanel de l'unité ExtCtrlsdont TPanel en est un dérivé .
Examinons le programme représenté par l'image ci-après qui a pour but de calculer un Mot de Passe et un Code d'Activation.
La Feuille Principale ci-après est constitué de 4 Boutons TBitBtn dont les Caption sont Sortie, Génère, Aide, Efface et dont les noms sont Sortie, Ok,Aide, Efface et de 4 TLabeledEdit dont les Caption sont Nom ou Login, Résultat du Mot de Passe, Générateur et Résultat du Code d'Activation et dont les noms sont Nom, Nombre, Passe et Code.
Feuille Principale - Programme générateur de Code - Mot de Passe
Ø Sortie : On sort du programme
Ø Génère : On génère un mot de Passe et un Code d'Activation en fonction du No et du Générateur.
Ø Aide : Une aide qui apparaît dans une Feuille Modale.
Ø Efface : Effacement de toutes les saisies ( Nom et Générateur ).
Feuille Modale d'Aide
La fenêtre Modale de l'Aide constituée d'un TRichEdit s'ouvre en cliquant sur le bouton Aide. En cliquant sur le texte ou sur la croix de fermeture la feuille se ferme et on se retrouve sur la feuille principale.
Le but est de servir de la programmation ci-après pour créer un composant TPassword qui incorporera les 2 feuilles Principale et Modale.
Listing de la Programmation événementielle :
----------- Feuille Principale FormMdp ------ Projet Password.dproj ---------------
unit Mdp;
interface
uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,
Forms,Dialogs,StdCtrls,Buttons,ExtCtrls;
type
TFormMdp = class(TForm)
Nom,Nombre,Passe,Code:TLabeledEdit;
Efface,Ok,Sortie,Aide:TBitBtn;Panel:TPanel;
procedure EffaceClick(Sender:TObject);
procedure SortieClick(Sender:TObject);
procedure OKClick(Sender:TObject);
procedure NomKeyPress(Sender:TObject;var Key:Char);
procedure NombreKeyPress(Sender:TObject;var Key:Char);
procedure AideClick(Sender:TObject);
private
end;
var FormMdp:TFormMdp;
implementation
Uses Aide;
{$R *.dfm}
procedure TFormMdp.AideClick(Sender:TObject); // Appel de la Feuille FormAide
begin
With FormAide Do Begin Left:=FormMdp.Left;
Top:=FormMdp.Top+FormAide.Height+20;ShowModal;End;
end;
procedure TFormMdp.EffaceClick(Sender:TObject);
begin
if Nom.Text<>'' then Begin Nom.Clear;Nombre.Clear;Passe.Clear;
Code.Clear;End;Nom.SetFocus;
end;
procedure TFormMdp.NombreKeyPress(Sender:TObject;var Key:Char);
begin
If (Key=#13) And (Nom.Text<>'') And (Nombre.Text<>'') then
If (Length(Nombre.Text)>9) Or (Length(Nombre.Text)<3) then
Begin MessageDlg('Vous avez saisi '+
IntToStr(Length(Nombre.Text))+' chiffres'+#13+#13+
'Entrez au minimum 3 chiffres'+#13+
'et au maximum 9 chiffres ',mtError,[mbOk],0);
Nombre.Clear;Nombre.SetFocus;End Else OkClick(Sender);
If Not((Key) In ['0'..'9']) Or (Ord(Key)=8) then Key:=#0;
end;
procedure TFormMdp.NomKeyPress(Sender:TObject;var Key:Char);
begin
if Key=#13 then OkClick(Sender);
if Not((UpCase(Key) In ['A'..'Z']) Or (Ord(Key)=8)
Or (Ord(Key)=32)) then Key:=#0 Else Key:=UpCase(Key);
end;
Function Genere(Nom:String;Nombre:Integer):String;
Var Valeur,i,Nb:Integer;Chaine:String;
Begin
// Génération du Mot de Passe - Calcul de la Somme Ascii du Nom
Valeur:=0;For i:=1 To Length(Nom) Do Inc(Valeur,Ord(Nom[i]));
// Calcul d'une somme Hexadécimale avec le Générateur
Nb:=Valeur*Nombre;
// Sortie du résultat de la génération du Code d'Activation
Chaine:=IntToStr(Valeur)+'-'+IntToHex(Valeur,1)+'-'+
Copy(IntToHex(Nb,1),1,5)+'-'+
Copy(Copy(IntToHex(Nb,1),6)+IntToHex(Nombre,1),1,5);
if Copy(Chaine,Length(Chaine),1)='-' then
Chaine:=Copy(Chaine,1,Length(Chaine)-1);Genere:=Chaine;
End;
Function MotPasse(Chaine:String):String; // Génére le mot de Passe
Begin
Chaine:=Copy(Chaine,1,5)+'-'+Copy(Chaine,6);
If Copy(Chaine,Length(Chaine),1)='-' then
Chaine:=Copy(Chaine,1,Length(Chaine)-1);MotPasse:=Chaine;
End;
procedure TFormMdp.OKClick(Sender:TObject);
Var Nb:Integer;
begin
If (Nom.Text='') Or (Nombre.Text='') then Begin If (Nom.Text='')
Then Nom.SetFocus Else Nombre.SetFocus;Exit;End;
Randomize;Nb:=Random(Length(Nombre.Text)*StrToInt(Nombre.Text)+1);
Passe.Text:=MotPasse(IntToHex(Nb,1));
Code.Text:=Genere(Nom.Text,Nb);
end;
procedure TFormMdp.SortieClick(Sender:TObject);
begin
Application.Terminate;
end;
end.
--------------- Feuille Modale FormAide ------------------------------
unit Aide;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ComCtrls;
type
TFormAide = class(TForm)
Memo:TRichEdit;
procedure MemoClick(Sender:TObject);
end;
var FormAide:TFormAide;
implementation
Uses Mdp;
{$R *.dfm}
procedure TFormAide.MemoClick(Sender:TObject); // Retour à la feuille FormMdp
begin
ModalResult:=mrOk;
end;
end.
------------------------------------------------------------------
Création du Composant Tpassword :
1ère étape : Se servir du Générateur de Delphi avec le Menu Composants puis Nouveau Composant Visuel. Choisir dans la liste TCustomPanel de l'unité ExtCtrls. Saisissez dans la fenêtre suivante :
Nom de la Classe = TPassword, Nom de la Palette = Guy .. puis
Nom de l'Unité = D:\My progs\Code\Password.pas.
2ème étape : A ce stade l'ossature de l'unité ainsi crée est la suivante.
| unit Password; interface uses SysUtils,Classes,Controls,ExtCtrls; type TPassword = class(TCustomPanel) Private { Déclarations privées } Protected { Déclarations protégées } Public { Déclarations publiques } Published { Déclarations publiées } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples',[TPassword]); end; end. | Ø Nom de l'Unité du Composant Ø Unités nécessaires pour utiliser le composant TPanel. Ø Enregistrer TPassword dans ma Palette Perso Guy |
Étant donné que l'on veut incorporer 4 TBitBtn et 4 TLabeledEdit, les unités nécessaires à ces composants sont Buttons et ExtCtrls. Donc dans la ligne Uses il nous rajouter Buttons. Les contrôlesTRichEditnécessite l'unité ComCtrls, la fonction MessageDlg l'unité Dialogs, la fonction UpCase l'unité System FormAide l'unité Forms. Les images Glyph (TBitmap) l'unité Graphics, (TIcon) etc.
Finalement la déclaration des unités nécessaires aux composants, fonctions et procédures devra être :
Uses
Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, Forms, Buttons, ExtCtrls,
Dialogs, ComCtrls;
Private { Déclarations privées }
Dans cette partie on déclare les composants que vous aller utiliser ainsi que les propriétés que l'on va ajouter. On ne peut y accéder à partir d'autres unités.
Protected { Déclarations protégées }
Recense les procédures et les événements qui seront en lien avec les boutons.
C'est une interface de dérivation.
Public { Déclarations publiques }
Essentiellement les procédures de création et de destruction du composant TPassword. C'est une Interface d'exécution.
Constructor Create(Owner:Tcomponent);Override;
Destructor Destroy;Override;
La directive Override surcharge l'implémentation de la méthode reçue en héritage.
Published { Déclarations publiées }
C'est une Interface de Conception. C'est ici que l'on recense toutes les propriétés et procédures qui seront affichées dans l'inspecteur d'objet.
3ème étape : Ajout d'une nouvelle propriété About au composant TPassword(TPanel).
Rajoutons une nouvelle Propriété nommée About qui sera visible dans l'inspecteur d'Objet pour notre composant TPassword. Celle-ci ne sera qu'en lecture et sera un message de copyright dudit composant ; ici ® Guy Bidi 2007. Pour cela il nous faut déclarer quel est son Type, quelle est la variable s'y référant avec Private et la publier avec Published pour l'implémenter dans les propriétés du composant. Ainsi on aura :
Type
TAbout=String; // Propriété About rajoutée
TPassword = class(TCustomPanel)
Private { Déclarations privées }
FAbout:TAbout; / Déclaration d'un variable de Type TAbout qui est une chaîne de caractères.
published { Déclarations publiées }
Property About:TAbout read FAbout;
La fonction read va Lire la variable FAbout qui sera initialisée plus loin lors de la création du composant avec la procédure Constructor TPassword.Create(Owner:TComponent);
La fonction générale Property X :Type Read X write Proc associe une propriété nommée X de type Type qui en lecture sera la variable X et qui en écriture exécutera la procedure Proc.
Constructor TPassword.Create(Owner:TComponent);
Begin
Inherited Create(Owner);FAbout:='® Guy Bidi 2007';
Inherited indique que le composant TPassword de type TPanel sera surchargé de propriété et méthodes avec du code (FAbout).
destructor TPassword.Destroy; // Destruction des Composants
begin
inherited Destroy; -> On libére le composant Tpassword.
end;
Modifions complètement l'aspect de notre TPassword en ajoutons le code suivant :
Constructor TPassword.Create(Owner:TComponent );
Begin
Inherited Create(Owner);Width:=300;Height:=200;Left:=0;Top:=0;
Height:=156;Width:=361;Color:=11448063;FAbout:='® Guy Bidi 2007';
Caption:=' ';BevelInner:=bvNone;BevelKind:=BkNone;
BevelOuter:=bvNone;BorderStyle:=bsNone;FullRepaint:=True;
ParentBackground:=False;ParentBiDIMode:=True;
ParentColor:=False;ParentCtl3D:=False;ParentFont:=False;
Font.Style:=[fsBold];Font.Name:='Tahoma';
Outre les propriétés de couleur, de Fonte il faut noter que les propriétés Caption, BevelInner, BevelKind, BevelOuter, BorderStyle sont utilisées pour rendre le TPanel comme transparent. FullRepaint le redessine. A noter que ces propriétés doivent être réintégrées dans la partie Published pour qu'elles apparaissent.
4ème étape : Ajout du Bouton Sortie dans le composant TPassword..
Ce bouton Sortie est TBitmap avec des propriétés (voire le code source du programme), ainsi qu'une procédure événementielle OnClick. Il nous faut donc ajouter un Bouton TBitmap et sa procédure OnClick qui va avec.
Déclarons le Bouton Sortie:
TPassword = class(TCustomPanel)
private { Déclarations privées }
FAbout:TAbout;Sortie :TBitBtn ;
Déclarons l'événement OnClick du Bouton Sortie:
protected { Déclarations protégées }
Procedure SortieClick(Sender:TObject);
A la création de TPassword(Create) on y ajoute le code des propriétés que l'on veut modifier ainsi que l'événement OnClick à savoir :
Constructor TPassword.Create(Owner:TComponent);
Begin
Inherited Create(Owner);Width:=300;Height:=200;Left:=0;Top:=0;
Height:=156;Width:=361;Color:=11448063;FAbout:='® Guy Bidi 2007';
Caption:=' ';BevelInner:=bvNone;BevelKind:=BkNone;
BevelOuter:=bvNone;BorderStyle:=bsNone;FullRepaint:=True;
ParentBackground:=False;ParentBiDIMode:=True;
ParentColor:=False;ParentCtl3D:=False;ParentFont:=False;
Font.Style:=[fsBold];Font.Name:='Tahoma';
Sortie:=TbitBtn.Create(Self);With Sortie Do Begin
SetBounds(273,118,81,25);Parent:=Self;ParentFont:=True;
Caption:='&Sortie';ShowHint:=True;Hint:='Sortie du Programme';
Visible:=True;TabOrder:=4;TabStop:=True;OnClick:=SortieClick;
Glyph.LoadFromResourceName(hInstance,'SORTIE');End;
On crée le Bouton avec TbitBtn.Create(Self), puis on modifie sa taille et son emplacement par la fonction SetBounds(273,118,81,25) et on indique que ce composant Bouton appartient au TPassword(Tpanel) par la fonction Parent :=Self. L'événement OnClick se fera par la procédure SortieClick précédemment déclarée dans Protected et qui terminera l'exécution du programme :
Procedure TPassword.SortieClick(Sender:TObject);
Begin
Application.Terminate;
End;
Que dire Glyph.LoadFromResourceName(hInstance,'SORTIE'); Le BitBtn a une propriété Glyph qui charge une image Bmp à partir d'un fichier. On constate que le composant va devoir utiliser 4 images Bmp (Sortie.bmp, Key.bmp, Help.bmp, Efface.bmp) pour les 4 boutons et une icône(Aide.ico) pour la feuille modale FormAide (voire plus loin).
La meilleure méthode consiste à encapsuler ces images dans un fichier Ressources. Utiliser le programme de votre choix mais Res_HiA v 3.2 de DelphiCool à http://delphicool.developpez.comest de bon aloi. Compiler les 4 images et icône avec les noms de SORTIE, KEY, AIDE, EFFACE et ICONE dans un fichier Ressource intitulé MyResource.res que vous placerez dans le répertoire de votre composant. Il ne reste plus qu'à l'appeler dans le code de TPassword. Ceci se fait grâce à :
procedure Register;
implementation
{$R MyResource.res } puis utiliser la procédure
LoadFromResourceName(Instance: THandle; const ResName: String);
5ème étape : Ajout du LabeledEdit Nom dans le composant TPassword..
TPassword = class(TCustomPanel)
private { Déclarations privées }
FAbout:TAbout;Sortie:TBitBtn; // 1 Bouton
Nom:TLabeledEdit; // 1 LabelEdit
protected { Déclarations protégées }
Procedure SortieClick(Sender:TObject);
Procedure NomKeyPress(Sender:TObject;var Key:Char); // Teste les caractères
Constructor TPassword.Create(Owner:TComponent);
Begin
Inherited Create(Owner);Width:=300;Height:=200;Left:=0;Top:=0;
Height:=156;Width:=361;Color:=11448063;FAbout:='® Guy Bidi 2007';
Caption:=' ';BevelInner:=bvNone;BevelKind:=BkNone;
BevelOuter:=bvNone;BorderStyle:=bsNone;FullRepaint:=True;
ParentBackground:=False;ParentBiDIMode:=True;
ParentColor:=False;ParentCtl3D:=False;ParentFont:=False;
Font.Style:=[fsBold];Font.Name:='Tahoma';
Sortie:=TbitBtn.Create(Self);With Sortie Do Begin
SetBounds(273,118,81,25);Parent:=Self;ParentFont:=True;
Caption:='&Sortie';ShowHint:=True;Hint:='Sortie du Programme';
Visible:=True;TabOrder:=4;TabStop:=True;OnClick:=SortieClick;
Glyph.LoadFromResourceName(hInstance,'SORTIE');End;
Nom:=TLabeledEdit.Create(Self);With Nom Do Begin
SetBounds(7,28,159,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=True;Color:=12582911;
With EditLabel Do Begin Width:=117;Height:=13;
Caption:=' Nom ou Login';End;
LabelSpacing:=7;OnKeyPress:=NomKeyPress;End;
Rien de spécial si ce n'est la procédure appelée NomKeyPress.
Examinons cette procédure :
Procedure TPassword.NomKeyPress(Sender:TObject;var Key:Char);
Begin
if Key=#13 then OkClick(Sender);
if Not((UpCase(Key) In ['A'..'Z']) Or (Ord(Key)=8) ,
Or (Ord(Key)=32)) then Key:=#0 Else Key:=UpCase(Key);
End;
Si la touche est RETURN on exécute la procédure OkClick(Sender) qui sera celle du bouton Génère.
, Si on en tape pas une lettre de A à Z ou l'espace alors la touche sera nulle sinon ma touche sera convertie en majuscule.
6ème étape : Ajout d'une feuille Modale FormAide dans le composant TPassword..
Cette feuille Formaide s'affichera au Click du composant Aide.
Celle-ci est constituée d'un TRichEdit et d'une procédure de sortie pour retourner au composant TPassword :
Déclaration de la feuille :
type
TAbout=String; // Propriété About rajoutée
TPassword = class(TCustomPanel)
private { Déclarations privées }
FAbout:TAbout;Sortie,Ok,Aide,Efface:TBitBtn; // 4 Boutons
Nom,Nombre,Passe,Code:TLabeledEdit; // 4 LabelEdits
FormAide:TForm; // Fiche Aide Modale pour le Bouton Aide
Memo:TRichEdit; // Le Mémo qui va avec la Feuille FormAide
Déclaration des procédures :
protected { Déclarations protégées }
Procedure SortieClick(Sender:TObject);
Procedure OkClick(Sender:TObject);
Procedure AideClick(Sender:TObject);
Procedure EffaceClick(Sender:TObject);
Procedure MemoClick(Sender:TObject);
Procedure NomKeyPress(Sender:TObject;var Key:Char);
Codes des procédures et création de la feuille FomrAide:
TPassword = class(TCustomPanel)
private { Déclarations privées }
FAbout:TAbout;Sortie:TBitBtn; // 1 Bouton
Nom:TLabeledEdit; // 1 LabelEdit
protected { Déclarations protégées }
Procedure SortieClick(Sender:TObject);
Procedure NomKeyPress(Sender:TObject;var Key:Char); // Teste les caractères
Constructor TPassword.Create(Owner:TComponent);
Begin
Inherited Create(Owner);Width:=300;Height:=200;Left:=0;Top:=0;
Height:=156;Width:=361;Color:=11448063;FAbout:='® Guy Bidi 2007';
Caption:=' ';BevelInner:=bvNone;BevelKind:=BkNone;
BevelOuter:=bvNone;BorderStyle:=bsNone;FullRepaint:=True;
ParentBackground:=False;ParentBiDIMode:=True;
ParentColor:=False;ParentCtl3D:=False;ParentFont:=False;
Font.Style:=[fsBold];Font.Name:='Tahoma';
Sortie:=TbitBtn.Create(Self);With Sortie Do Begin
SetBounds(273,118,81,25);Parent:=Self;ParentFont:=True;
Caption:='&Sortie';ShowHint:=True;Hint:='Sortie du Programme';
Visible:=True;TabOrder:=4;TabStop:=True;OnClick:=SortieClick;
Glyph.LoadFromResourceName(hInstance,'SORTIE');End;
Nom:=TLabeledEdit.Create(Self);With Nom Do Begin
SetBounds(7,28,159,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=True;Color:=12582911;
With EditLabel Do Begin Width:=117;Height:=13;
Caption:=' Nom ou Login';End;
LabelSpacing:=7;OnKeyPress:=NomKeyPress;End;
FormAide:=TForm.Create(Self);With FormAide Do Begin
BorderIcons:=[biSystemMenu];BorderStyle:=bsSingle;BorderWidth:=1;
Height:=173;Width:=361;Name:='FormAide';Font.Style:=[fsBold];
Font.Name:='Tahoma';Position:=poOwnerFormCenter;AutoSize:=True;
Caption:='Aide sur l''utilisation du générateur de Code';
FormAide.Icon.LoadFromResourceName(Hinstance,'ICONE');End;
Memo:=TRichEdit.Create(Owner);With Memo Do Begin Parent:=FormAide;
BevelInner:=bvRaised;BevelOuter:=bvLowered;BorderStyle:=bsSingle;
Color:=16754431;Height:=145;Width:=353;
Lines.Append( ,
' -* SHAREWARE GÉNÉRATEUR DE CODE *-'+#13+#13+
' Ce générateur de code d''activation est un shareware qui est'+#13+
' la propriété de ® Guy Bidi - Email: paounet@free.fr.'+#13+#13+
' Après les saisies respectives de votre Nom ou login ou seuls'+#13+
' les caractères de A à Z et l''espace sont acceptés puis d''un'+#13+
' nombre entier constitué au minimum de 3 chiffres jusqu''à 9'+#13+
' chiffres au maximum comme générateur, vous obtenez le'+#13+
' code d''activation en cliquant sur le bouton Génère.');
ShowHint:=True;OnClick:=MemoClick; f
Hint:='Cliquez pour retourner au Générateur de Code';End;
Chargement l'icône de la feuille FormAide à partir des MyResource.res.
, Ajout d'un Texte dans le TrichEdit intitulé Mémo avec la propriété Lines.
f Ajout d'une procédure MemoClick au Click sur le Mémo.
Procedure TPassword.MemoClick(Sender:TObject);
Begin
FormAide.ModalResult:=mrOk; à On ferme la feuille Modale FormAide.
End;
7ème étape : Le Code complet du composant TPassword..
L'essentiel de l'ajout de composant et des procédures événementielles inhérent au composant TPassword a été vu. Voici le code complet du composant avec ses fonctions diverses :
unit Password; // Composant TPassword créé par Guy Bidi - ® 2007
interface
uses Messages,SysUtils,Classes,Graphics,Controls,StdCtrls,Forms,
Buttons,ExtCtrls,Dialogs,ComCtrls;
type
TAbout=String; // Propriété About rajoutée
TPassword = class(TCustomPanel)
private { Déclarations privées }
FAbout:TAbout;Sortie,Ok,Aide,Efface:TBitBtn; // 4 Boutons
Nom,Nombre,Passe,Code:TLabeledEdit; // 4 LabelEdits
FormAide:TForm; // Fiche Aide Modale pour le Bouton Aide
Memo:TRichEdit; // Le Mémo qui va avec la Feuille FormAide
protected { Déclarations protégées }
Procedure SortieClick(Sender:TObject);
Procedure OkClick(Sender:TObject);
Procedure AideClick(Sender:TObject);
Procedure EffaceClick(Sender:TObject);
Procedure MemoClick(Sender:TObject);
Procedure NomKeyPress(Sender:TObject;var Key:Char);
procedure NombreKeyPress(Sender:TObject;var Key:Char);
public { Déclarations publiques }
Constructor Create(Owner:Tcomponent);Override;
Destructor Destroy;override;
published { Déclarations publiées }
Property About:TAbout read FAbout;
Property Color;
Property Visible;
Property Font;
Property FullRepaint;
Property ParentBackground;
Property ParentBiDIMode;
Property ParentColor;
Property ParentCtl3D;
Property ParentFont;
end;
procedure Register;
implementation
{$R MyResource.res}
Constructor TPassword.Create(Owner:TComponent);
Begin
Inherited Create(Owner);Width:=300;Height:=200;Left:=0;Top:=0;
Height:=156;Width:=361;Color:=11448063;FAbout:='® Guy Bidi 2007';
Caption:=' ';BevelInner:=bvNone;BevelKind:=BkNone;
BevelOuter:=bvNone;BorderStyle:=bsNone;FullRepaint:=True;
ParentBackground:=False;ParentBiDIMode:=True;
ParentColor:=False;ParentCtl3D:=False;ParentFont:=False;
Font.Style:=[fsBold];Font.Name:='Tahoma';
Sortie:=TbitBtn.Create(Self);With Sortie Do Begin
SetBounds(273,118,81,25);Parent:=Self;ParentFont:=True;
Caption:='&Sortie';ShowHint:=True;Hint:='Sortie du Programme';
Visible:=True;TabOrder:=4;TabStop:=True;OnClick:=SortieClick;
Glyph.LoadFromResourceName(hInstance,'SORTIE');End;
Ok:=TbitBtn.Create(Self);With Ok Do Begin
SetBounds(183,118,79,25);Parent:=Self;Caption:='&Génère';
ShowHint:=True;Hint:='Génère le mot de passe ou d''activation';
Visible:=True;TabOrder:=2;TabStop:=True;OnClick:=OkClick;
Glyph.LoadFromResourceName(hInstance,'KEY');End;
Aide:=TbitBtn.Create(Self);With Aide Do Begin
SetBounds(98,118,68,25);Parent:=Self;Caption:='&Aide';
ShowHint:=True;Hint:='Aide sur le programme';
Visible:=True;TabOrder:=6;TabStop:=True;OnClick:=AideClick;
Glyph.LoadFromResourceName(hInstance,'AIDE');End;
Efface:=TbitBtn.Create(Self);With Efface Do Begin
SetBounds(7,118,65,25);Parent:=Self;Caption:='&Efface';
ShowHint:=True;Hint:='Efface les saisies';
Visible:=True;TabOrder:=7;TabStop:=True;OnClick:=EffaceClick;
Glyph.LoadFromResourceName(hInstance,'EFFACE');End;
Nom:=TLabeledEdit.Create(Self);With Nom Do Begin
SetBounds(7,28,159,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=True;Color:=12582911;
With EditLabel Do Begin Width:=117;Height:=13;
Caption:=' Nom ou Login';End;
LabelSpacing:=7;OnKeyPress:=NomKeyPress;End;
Passe:=TLabeledEdit.Create(Self);With Passe Do Begin
SetBounds(182,28,168,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=False;Color:=16755370;
With EditLabel Do Begin Width:=117;Height:=13;LabelSpacing:=7;
Caption:=' Résultat du Mot de Passe';End;End;
Nombre:=TLabeledEdit.Create(Self);With Nombre Do Begin
SetBounds(35,87,73,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=False;Color:=12582911;
With EditLabel Do Begin Width:=68;Height:=13;
Caption:=' Générateur';End;LabelSpacing:=7;
OnKeyPress:=NombreKeyPress;End;
Code:=TLabeledEdit.Create(Self);With Code Do Begin
SetBounds(181,87,169,21);Parent:=Self;LabelPosition:=lpAbove;
Visible:=True;TabOrder:=0;TabStop:=False;Color:=16755370;
With EditLabel Do Begin Width:=167;Height:=13;
Caption:=' Générateur';End;LabelSpacing:=7;End;
FormAide:=TForm.Create(Self);With FormAide Do Begin
BorderIcons:=[biSystemMenu];BorderStyle:=bsSingle;BorderWidth:=1;
Height:=173;Width:=361;Name:='FormAide';Font.Style:=[fsBold];
Font.Name:='Tahoma';Position:=poOwnerFormCenter;AutoSize:=True;
Caption:='Aide sur l''utilisation du générateur de Code';
FormAide.Icon.LoadFromResourceName(Hinstance,'ICONE');End;
Memo:=TRichEdit.Create(Owner);With Memo Do Begin Parent:=FormAide;
BevelInner:=bvRaised;BevelOuter:=bvLowered;BorderStyle:=bsSingle;
Color:=16754431;Height:=145;Width:=353;
Lines.Append(
' -* SHAREWARE GÉNÉRATEUR DE CODE *-'+#13+#13+
' Ce générateur de code d''activation est un shareware qui est'+#13+
' la propriété de ® Guy Bidi - Email: paounet@free.fr.'+#13+#13+
' Après les saisies respectives de votre Nom ou login ou seuls'+#13+
' les caractères de A à Z et l''espace sont acceptés puis d''un'+#13+
' nombre entier constitué au minimum de 3 chiffres jusqu''à 9'+#13+
' chiffres au maximum comme générateur, vous obtenez le'+#13+
' code d''activation en cliquant sur le bouton Génère.');
ShowHint:=True;OnClick:=MemoClick;
Hint:='Cliquez pour retourner au Générateur de Code';End;
End;
Procedure TPassword.NombreKeyPress(Sender:TObject;var Key:Char);
Begin
If (Key=#13) And (Nom.Text<>'') And (Nombre.Text<>'') then
If (Length(Nombre.Text)>9) Or (Length(Nombre.Text)<3) then
Begin MessageDlg('Vous avez saisi '+
IntToStr(Length(Nombre.Text))+' chiffres'+#13+#13+
'Entrez au minimum 3 chiffres'+#13+
'et au maximum 9 chiffres ',mtError,[mbOk],0);
Nombre.Clear;Nombre.SetFocus;End Else OkClick(Sender);
If Not((Key) In ['0'..'9']) Or (Ord(Key)=8) then Key:=#0;
End;
Procedure TPassword.NomKeyPress(Sender:TObject;var Key:Char);
Begin
if Key=#13 then OkClick(Sender);
if Not((UpCase(Key) In ['A'..'Z']) Or (Ord(Key)=8)
Or (Ord(Key)=32)) then Key:=#0 Else Key:=UpCase(Key);
End;
Function Genere(Nom:String;Nombre:Integer):String;
Var Valeur,i,Nb:Integer;Chaine:String;
Begin
// Génération du Mot de Passe - Calcul de la Somme Ascii du Nom
Valeur:=0;For i:=1 To Length(Nom) Do Inc(Valeur,Ord(Nom[i]));
// Calcul d'une somme Hexadécimale avec le Générateur
Nb:=Valeur*Nombre;
// Sortie du resultat de la génération du Code d'Activation
Chaine:=IntToStr(Valeur)+'-'+IntToHex(Valeur,1)+'-'+
Copy(IntToHex(Nb,1),1,5)+'-'+
Copy(Copy(IntToHex(Nb,1),6)+IntToHex(Nombre,1),1,5);
if Copy(Chaine,Length(Chaine),1)='-' then
Chaine:=Copy(Chaine,1,Length(Chaine)-1);Genere:=Chaine;
End;
Function MotPasse(Chaine:String):String; // Génére le mot de Passe
Begin
Chaine:=Copy(Chaine,1,5)+'-'+Copy(Chaine,6);
If Copy(Chaine,Length(Chaine),1)='-' then
Chaine:=Copy(Chaine,1,Length(Chaine)-1);MotPasse:=Chaine;
End;
Procedure TPassword.OkClick(Sender:TObject);
Var Nb:Integer;
begin
If (Nom.Text='') Or (Nombre.Text='') then Begin If (Nom.Text='')
Then Nom.SetFocus Else Nombre.SetFocus;Exit;End;
Randomize;Nb:=Random(Length(Nombre.Text)*StrToInt(Nombre.Text)+1);
Passe.Text:=MotPasse(IntToHex(Nb,1));
Code.Text:=Genere(Nom.Text,Nb);
End;
Procedure TPassword.EffaceClick(Sender:TObject);
Begin
if Nom.Text<>'' then Begin Nom.Clear;Nombre.Clear;Passe.Clear;
Code.Clear;End;Nom.SetFocus;
End;
Procedure TPassword.MemoClick(Sender:TObject);
Begin
FormAide.ModalResult:=mrOk;
End;
Procedure TPassword.AideClick(Sender:TObject);
Begin
FormAide.ShowModal;Nom.SetFocus;
End;
Procedure TPassword.SortieClick(Sender:TObject);
Begin
Application.Terminate;
End;
destructor TPassword.Destroy; // Destruction des Composants
begin
inherited Destroy;
end;
procedure Register;
begin
RegisterComponents('Guy',[TPassword]);
end;
end.
Création du Package Password :
Il ne reste désormais qu'à enregistrer ce composant afin de le tester. Cliquez sur Fichier puis sur Nouveau puis Autre et choisissez Groupe de Projets.
Un intitulé ProjectGroup1 apparaît dans la fenêtre. Avec le bouton de la souris choisissez Ajouter un nouveau projet (ou cliquez sur le menu Icône Nouveau). Choisissez dès lors Delphi puis Package. La fenêtre présente l'ossature suivante :
| ProjectGroup1 Package1.bpl Contient Requiert Rtl.dcp | Ø Renommer Package1.bpl en Password.bpl Ø Avec le bouton droit de la souris cliquez sur Ajouter et sélectionner l'unité Password.pas dans votre répertoire |
| Résultat |
| ProjectGroup1 Password.bpl Contient ..\..\.. MyProgs Code Password.dcr Password.pas Requiert Rtl.dcp Vcl.dcp | Ø Nom du composant compilé. |