Pour les débutants en Delphi, voici une application toute simple pour vous : une calculatrice convertisseur Franc euro avec dll dynamique.
Une application toute simple pour vous faire la main et surtout pour vous montrer une astuce toute simple sur l'utilisation de la propriété Sender de la classe TObject que vous n'avez qu'à déclarer en classe TButton. En effet, tout débuttant programme de cette façon :
ecran.text := ecran.text + '1'; pour le bouton 1 et ainsi de suite alors qu'on peut faire plus court.
Enfin, vous n'avez qu'à prendre connaissance du code ci-dessous et aussi de télécharger le zip ci-joint.
Source / Exemple :
----------------------
// Création de la dll \\
Pour cela, lancer delphi puis faites fermer tout. Puis dans le menu, faites fichier, nouveau. Choississez dll.
Puis faites fichier, nouveau et cette fois choississez unité. Sauvegarder votre projet l'unité.
Par défaut, mon projet se prénomme "conversion_dll.dpr" et l'unit" en "convertfct_dll.pas"
Dans convertfct_dll.pas, vous devez saisir les fonctions nécéssaires pour la conversion.
ATTENTION, vous devez le saisir dans le second onglet ou se trouve les mots UNIT, INTERFACE, IMPLEMENTATION et non celle contenant le mot LIBRARY et USES.
Voici la source :
unit convertfct_dll;
interface
implementation
// fonction qui convertit une somme entrée en euro en franc
function euro_franc(devise, interm : real):real;
begin
euro_franc := devise * interm;
end;
// fonction qui convertit une somme entrée en franc en euro
function franc_euro(devise, interm : real):real;
begin
franc_euro := devise / interm;
end;
// on exporte les fonctions de la dll pour que le ou les programmes puisse les utiliser
exports euro_franc, franc_euro;
end.
Maintenant, revenez sur le premier onglet dont le mot "LIBRARY" et "USES" apparaissent. Vous devez effacez les ces 2 instructions SysUtils et Classes. Il vous reste uniquement dans USES ceci : convertfct_dll in 'convertfct_dll.pas' ;
Maintenant, enregistrer ce projet et compiler le dans le menu "PROJET - COMPLILER" ou par le raccourci CTRL + F9.
Ne l'exécuter surtout pas car vous aurez un message d'erreur.
Votre dll est crée, passons à la calculatrice.
-------------------------------
// Création de la calculatrice\\
Créez un nouveau projet. Par défaut, je l'ai nommé "Convertisseur_dll.dpr" et le ficher unit sous "convertisseur.pas".
Placez vos labels et boutons comme sur la photo ci-joint et présent dans le zip.
Pour coder les boutons des chiffres (de 0 à 9), de la virgule et des opérateurs, nous allons utiliser la propriété SENDER de la classe TButton.
De cette façon, au lieu d'avoir des lignes de codes pour chaque chiffre car seul diffère les nombre, il est interessant d'utiliser un objet de la classe TButton. Pour cela, on utilisera : (Sender as TButton).caption.
Par cette méthode, les boutons de chiffres (0 à 9) utilisent la même procédure (dans mon exemple, le nom de la méthode "procedure chiffreClick(Sender: TObject)". Pensez à ajouter, la procédure à l'événement OnClick().
Les opérateurs (sauf le égal)utilisent eux aussi utilisent la même procédure "procedure operateurClick(Sender: TObject);".
Maintenant, je vous laisse la source ci-dessous :
unit convertisseur;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
Tcalculette = class(TForm)
GroupBox: TGroupBox;
btn0: TButton;
btnpoint: TButton;
btnegal: TButton;
btn1: TButton;
btn2: TButton;
btn3: TButton;
btn4: TButton;
btn5: TButton;
btn6: TButton;
btn7: TButton;
btn8: TButton;
btn9: TButton;
btndivise: TButton;
btnmultiplie: TButton;
btnmoins: TButton;
btnplus: TButton;
btneuro: TButton;
btnfranc: TButton;
btnquitter: TButton;
Label1: TLabel;
Label2: TLabel;
convecran: TLabel;
ecran: TLabel;
btnC: TButton;
btnCE: TButton;
procedure btnquitterClick(Sender: TObject);
procedure chiffreClick(Sender: TObject);
procedure operateurClick(Sender: TObject);
procedure btnegalClick(Sender: TObject);
procedure btnCClick(Sender: TObject);
procedure btnCEClick(Sender: TObject);
procedure btneuroClick(Sender: TObject);
procedure btnfrancClick(Sender: TObject);
private
{ Déclarations privées }
// déclaration du nombre entrée après une opération ou un résultat appelé "mémoire"
memoire,actuel : real; // actuel correspond à la valeur de l'affichage du label avant l'opérateur '='
// déclaration de l'opérateur choisi (+, -, *, /, =)
operateur : char;
{déclaration de type booleenne permettant de savoir si l'utilisateur a
utilisé l'opérateur '=' ou non }
egal : boolean; // renvoi une réponse de type oui non si l'opérateur a appuyer sur '='
nbconvert : boolean; // renvoie une réponse de type oui non si l'utilisateur a converti un nombre
public
{ Déclarations publiques }
end;
TEuro_franc=function(euro,constante:real):real;
TFranc_euro=function(fr,constante:real):real;
var
calculette: Tcalculette;
implementation
{$R *.DFM}
procedure Tcalculette.btnquitterClick(Sender: TObject);
begin
// Fin de l'application, on quitte le programme
application.terminate;
end;
{Tous les boutons des chiffres utilisent cette procédure en utilisant la
le paramètre "Sender" associé au caption du bouton cliqué en question }
procedure Tcalculette.chiffreClick(Sender: TObject);
begin
// Initialise l'écran lorsque l'opérateur a demandé d'exécuter une égalité
// et qu'il recommence de nouveaux calculs
if egal = true then begin
ecran.caption := '';
egal := false;
end;
// Si l'utilisateur a effectué une conversion alors on efface la valeur
if nbconvert = true then begin
convecran.caption := '';
ecran.caption :='';
label1.visible := false;
label2.visible := false;
convecran.visible := false;
nbconvert := false;
end;
// Cas ou le nombre est égal à zéro
if ecran.caption='0' then begin
// Lorsque l'on clique sur la ','
if (Sender as TButton).caption =',' then begin
ecran.caption := ecran.caption + (Sender as TButton).caption;
end;
// On empêche l'utilisateur de saisir plusieurs 0 en début de nombre
if ecran.caption = '' then begin
ecran.caption := '0' + (Sender as TButton).caption;
end;
end;
// On exécute la condition à savoir si l'utilisateur à saisi le point auparavant
if (Sender as TButton).caption =',' then begin
// On recherche la position du point dans le label
if pos(',', ecran.caption) > 0 then
exit ;// si présence du ',' alors on ne met pas une autre virgule
end;
// S'il n'y a pas d'entier devant alors on ajoute un zéro devant la virgule
if ecran.caption ='' then begin
if (Sender as TButton).caption =',' then begin
ecran.caption := '0' + (Sender as TButton).caption;
exit;
end;
end ;
// affichage sur le label de droite (en Franc)
ecran.caption := ecran.caption + (Sender as Tbutton).caption;
end;
procedure Tcalculette.operateurClick(Sender: TObject);
begin
{ on verifie qu'il y est au moins une valeur saisie dans le label alors que la mémoire est NULL}
if ecran.caption = '' then begin // si vide alors on sort et on exécute les autres instructions
exit;
end;
{on stocke la valeur contenue dans l'edit de droite lorsque l'opérateur
cliqué sur un des 5 opérateurs au choix}
memoire := StrToFloat(ecran.caption); // conversion de string en float
{mise en mémoire de l'opérateur choisi par l'utilisateur
dans un tableau d'une valeur}
operateur := (Sender as TButton).caption[1];
// on efface l'écrand pour saisir un autre nombre
ecran.caption := '';
end;
procedure Tcalculette.btnegalClick(Sender: TObject);
begin
// on récupère la valeur présente dans le label lorsque l'utilisateur clique sur '='
actuel := StrToFloat(ecran.caption);
// Effectuer le calcul du résultat selon le nombre présent dans la mémoire puis l'opération précédemment effectuée et le nombre actuel
case operateur of
'-': ecran.caption := FloatToStr(memoire-actuel);
'+': ecran.caption := FloatToStr(memoire+actuel);
'*': ecran.caption := FloatToStr(memoire*actuel);
'/': { si l'utilisateur calcul un nombre et divisé par zéro ce qui est interdit, alors envoyé un message d'erreur }
if actuel = 0 then begin
ShowMessage('ATTENTION : il est interdit de diviser un nombre par 0. Veuillez consulter vos cours de MATHS');
ecran.caption := '';
end else // si autre valeur que divisé par zéro
ecran.caption := FloatToStr(memoire/actuel);
end;
{on affecte la valeur VRAIE pour que le prochain nombre écrit, on efface le champ du label}
egal := true;
end;
procedure Tcalculette.btnCClick(Sender: TObject);
begin
// on efface uniquement le nombre saisi, pas celle de la mémoire (dans ce cas, l'utilisateur devra se servir de la touche 'CE'
ecran.caption := '';
end;
procedure Tcalculette.btnCEClick(Sender: TObject);
begin
// On efface le nombre saisi, le nombre converti ET celui contenu dans la mémoire
memoire := 0;
ecran.caption := '';
convecran.caption := '';
end;
procedure Tcalculette.btneuroClick(Sender: TObject);
var
euro, fr, constante : real;
streuro, strfr, nomdll : string;
hdll : HINST;
euro_franc : TEuro_franc;
begin
// On convertit le chiffre de string en un flottant
euro := StrToFloat(ecran.caption);
constante := 6.55957;
nomdll := 'conversion_dll.dll'; // nom de la DLL
hdll := loadlibrary(PChar(nomdll)); // chargement de la DLL
if hdll=0 then ShowMessage('Erreur, vous ne pouvez pas effectuez cette action car une DDL ' + nomdll + ' est manquante.');
@euro_franc:=getprocaddress(hdll,'euro_franc'); //affectation de la fonction euro_franc de la dll à la fonction euro_franc du programme
fr := euro_franc(euro,constante); // utilisation de la fonction euro_franc
freelibrary(hdll); // libération de la mémoire
// On formate l'affichage à 2 chiffrs après la virgule
streuro := FormatFloat('0.00', euro);
strfr := FormatFloat('0.00', fr);
// Rend visible les labels cachés
label1.Visible := true;
label2.Visible := true;
convecran.visible := true;
// on renvoie le résultat aux labels
convecran.caption := streuro;
ecran.caption := strfr;
// on a convertit donc vrai
nbconvert := true;
end;
procedure Tcalculette.btnfrancClick(Sender: TObject);
var
euro, fr, constante : real;
streuro, strfr, nomdll : string;
hdll : HINST;
franc_euro : TFranc_euro;
begin
// On convertit le chiffre de string en un flottant
fr := StrToFloat(ecran.caption);
constante := 6.55957;
nomdll := 'conversion_dll.dll'; // nom de la DLL
hdll := loadlibrary(PChar(nomdll)); // chargement de la DLL
if hdll=0 then ShowMessage('Erreur, vous ne pouvez pas effectuez cette action car une DDL ' + nomdll + ' est manquante.');
@franc_euro:=getprocaddress(hdll,'franc_euro'); //affectation de la fonction franc_euro de la dll à la fonction convertFREU du programme
euro :=franc_euro(fr,constante); // utilisation de la fonction franc_euro
freelibrary(hdll); // libération de la mémoire
// On formate l'affichage à 2 chiffrs après la virgule
strfr := FormatFloat('0.00', fr);
streuro := FormatFloat('0.00', euro);
// Rend visible les labels cachés
label1.Visible := true;
label2.Visible := true;
convecran.visible := true;
// on renvoie le résultat aux labels
convecran.caption := streuro;
ecran.caption := strfr;
// on a convertit donc vrai
nbconvert := true;
end;
end.
Conclusion :
J'espère que cette source vous satisfait.
Bonne prog @ tous.
Et mes sincères salutations à Nix pour ses fabuleux sites... Bonne continuation !!!
ps : à Nix >> à quand un site sur PowerBuilder ?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.