Calculatrice convertisseur franc - euro avec dll dynamique

Soyez le premier à donner votre avis sur cette source.

Vue 24 405 fois - Téléchargée 907 fois

Description

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 ?

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
Il aurait été aussi plus rapide de ne charger la dll qu'une seule fois au lancement de l'application, ainsi que determiner les adresses des deux fonctions.
La libération de la dll n'étant effectuée ensuite qu'à la fermeture de l'appli.

Note sur le type Real : Ce que DelphiProg voulait dire est que le type Real est type non natif des processeurs et donc utilisable que par Delphi, dumoins jusqu'a la version 4 incluse. Maintenant ce n'est plus le cas : les version 5 et 6 de Delphi font correspondre le type Real à Double et donc devient compatible avec le type Float des autres langages. L'ancien type Real de Delphi 1 à 4 est maintenant le type Real48.
Cependant dans l'écriture des dll, précise directement un type Double pour qu'il soit compatible avec les autres langages.

De même ( comme le signale DelphiProg ) il faut passer par la convention StdCall pour être le plus ouvert possible :
function euro_franc(devise, interm : Double):Double;StdCall;
Au niveau du fonctionnement c'est la même chose et seules des notions d'assembleur permettent de faire la différence.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
ACHTUNG ! même si le chargement de la DLL échoue, tu essaies de trouver la procédure euro_franc et, le bouquet final, tu tentes de décharger une DLL qui n'est peut-être pas chargée !
Beaucoup de répétitions dans le code entre btneuroClick et btnfrancClick. Heuresement que l'appli n'a pas plusieurs milliers de lignes car pour maintenir l'ensemble, ce serait une vrai galère.
Autre problème : ta dll n'est pas utilisable autrement qu'avec un programme...écrit en Pascal; tu ne précises pas les conventions d'appel, tu passes des réels comme paramètres !
Est-il vraiment nécessaire de stocker les valeurs dans strfr et streuro pour les affecter à convecran.caption et ecran.caption ? Visiblement, non.
En revanche, le coup des touches est bien vu !

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.