Comment declarer une fonction privé dans une dll delphi

[Résolu]
Signaler
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
Bonjour,
je suis en train de créer un dll via l'expert de DLL delphi et je souhaite déclarer une fonction privé comme je peux le faire dans un projet VCL

   private maFonction():integer;

mais je n'y arrive pas comment dois je faire?

merci d'avance

17 réponses

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

en fait tu confond la notion de privé/public pour une class (mot clès private) et pour une dll (ou une unité).

Comme te l'as dis DeltaFX, pour une dll si elle n'est pas exporté elle est "privée".

Ton problème est peut-être lié é l'ordre de déclaration. cad qu'une méthode n'est visible que depuis la ligne ou tu la déclare.

procedure A; // ne voit pas B
begin end;

Procedure B; // voit A
begin end;
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
tu peut les "pré déclarer" en ne mettant que l'entête:

procedure B (aVar : TMonType);

procedure A; // A voit B !
begin end;

Procedure B (aVar : TMonType); // voit A
begin end;

Attention : aux appels en boucle/recursif !

PS: Click sur "réponse acceptée " si la réponse te convient.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
parce que la, tu n'es pas "dans" une class, mais dans une unité. Donc, ce n'est pas un "procedure of object" mais un "procedure" tout court.

Note que le nom de la procedure est "procedure imprimer()" et non "procedure TMaClass.Imprimer()"


pour contourner le problème, tu peux aussi crée une class qui ne contient que cette méthode, mais c'est moche.

le mieux, c'est de créer une méthode dans ta fiche (comme t'as dit j!nH) et depuis la, tu appel ce que tu veux. inclue ta procedure de dll ! ;)

bon code,
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
la mettre dans la partie implementation uniquement
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
Mais je dis n'import quoi moi...
(faites comme si j'étais pas là)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Si tu as compris :
1- comment est structurée une unité Pascal
2- quelque chose à la Programmation Orientée Objet

Tu dois donc savoir que le mot "private" désigne la portée des membres (propriétés et méthodes) d'une classe et non d'une simple fonction.

Comme te l'as indiqué loda, il suffit donc de déclarer ta fonction dans la partie implémentation en retirant la directive private.

Si tu en es encore à ce stade, mets de côté la programmation des DLL et révise les bases du langage avant tout. Ce sera un investissement payant si tu souhaites continuer et voir tes projets aboutir un jour.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Je ne vois pas l'interet d'une fonction "private" dans une DLL. Soit elle est exportée, soit elle est interne (pas de stdcall; et pas listée dans exports), et donc "private" de facto.

Ou alors j'ai pas capté qqchose ?
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

D'accord avec Delta FX, sauf pour la convention d'appel stdcall.

j!nH
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

Alors y a du monde la et j'ai grave l'impression de me faire tailler mdr.... Alors premièrement il est vrai que c'est peut etre pas judicieux de commencer par une DLL mais dans la vie on ne fait pas toujours comme bon nous semble (je suis obligé de faire une DLL --> I m sorry). Et puis désolé la prog n'est pas mon domaine et tout le monde n'a pas la chance d'avoir des années de codes dans les pattes ou d'etre sortie d'une grande école d'info.... Il me semble pourtant avoir posté sur le forum des débutants.

Et j'ai tres bien capté cette notion de privé et public je sais bien que si la fonction n'est pas définie dans les exports elle est automatiquement privé. Et en fait je souhaite déclarer une fonction privé qui puisse etre accessible par les autres fonctions de ma DLL (qu'elles soient public ou privé)

Bonne journée............
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

Ah merci Loda tu viens de m'apprendre un truc que je ne savais pas.

Je sais que pour une dll si elle n'est pas exporté elle est "privée". En revanche je ne savais pas que: qu'une méthode n'est visible que depuis la ligne ou tu la déclare.
 Ca parait evident maintenant que tu me le dit mais je ne le savais pas mais normal je suis chez les débutants (même si ca a l'air de déranger mdr)

En tout cas encore merci pour l'info LODA
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Mais y a pas de honte à attaquer direct par une dll, surtoutquandon débute. J'ai fait strictement pareil d'ailleurs, jadis  : avoir les yeux plus gros que les neurones coders. Et une fois que j'ai eu une belle dll qui marche, ben je me suis rendu compte que ca me pompait l'air, et j'ai dégagé la dll du projet.

De toute façon, les histoires de dll, ca fait chier, il en manque toutjours une à zindows qqpart, c'est abstru et abscon tant que t'as pas essayé d'en faire une. Apres on est tout de suite détendu, zen, on se rend compte qu'on aime ca, et tres vite on oublie le Tmediaplayer pour utiliser Bass.dll.

Keep On Coding.
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

 merci DeltaFX

En fait j'ai encore un ptit soucis.
Dans cette DLL je crée une form dynamiquement (avec un webBrowser) sur laquelle je crée un bouton. En fait je tiens a associer une fonction privé d'impression à l'événement OnClick de mon bouton.

procedure Imprimer(Sender: TObject);
 var
     vaIn, vaOut: OleVariant;
 begin
     WebBrowser_Affichage.ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut);
 end;

 ............dans une autre fonction de la DLL j'ai:
  //définition de l'événement OnClick du bouton
  Button_Imprimer.OnClick := Imprimer;

Mais j'ai une erreur de compilation au niveau de la derniere ligne et je ne comprend pas pourquoi
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

personne peut m'expliquer cette erreur????
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Salut,

Il y'a effectivement un problème de typage. En effet la procédure que tu dois associer à ton OnClick doit être de type TEvent,  qui est équivalent à procedure of object(une méthode en gros).


Donc tu dois déclarer ta fonction imprimer comme étant une méthode de ta fiche.

j!nH
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

ben pourquoi quand je fais dans dans un projet VCL ca marche et la non ?
Messages postés
12
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
18 septembre 2006

ok c'est bon j'ai compris (enfin je pense ), enfin maintenant ca marche
En fait moi j'ai créé ma form et mon tWebBrowser dynamiquement pour ne pas a avoir a inclure dans ma DLL une fiche. Parce que si je rajoute une fiche (donc une form) autant placer les composants de la forme en utilisant la palette d'outils non?
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
stp, clique sur "réponse accepté" pour les réponses qui t'on aidées.

(j'ai pas bien compris ton histoire de dll et de form, mais c'est ps grave)

et, oui: C'est plus facile de poser des composant avec l'EDI que par code. :)

bon code !