IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

UDF en Delphi


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 130
    Par défaut UDF en Delphi
    bonjour,

    je veux creer une petite UDF en delphi me permettant de renvoyer un float . Le parametre passée à l'UDF est également un float. j'ai fait un test en ecrivant une fonction qui ramene la valeur absolu. ça donne cela :
    declaration UDF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DECLARE EXTERNAL FUNCTION ABS_1 
        FLOAT
        RETURNS FLOAT BY VALUE
        ENTRY_POINT 'UDF_abs' MODULE_NAME 'maDLL'
    fonction delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function UDF_abs(avaleur: double): double; cdecl; export;
     
    var
    wval : string;
    begin
    //wval := floattostr(avaleur);
    //MessageDlg('DLL  ' + wval, mtWarning, [mbOK], 0);
    if avaleur < 0 then
      result := avaleur*(-1)
    else
      result := avaleur;
    end;
    voila rien de bien compliqué...Pourtant si j'effectue la requete suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select abs_1(4) from rdb$database
    j'obtiens 0,000 ??? La valeur passée semble correspondre à l'adresse mémoire ...pourtant j'ai trouvé des exemples d'UDF avec return FLOAT by value...?????
    Qqun peut il m'éclairer ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Par défaut
    le problème est que les paramètres sont transmis par pointeur, c'est pour cela que tu n'as pas les résultats escomptés.

    voici un exemple fonctionnel (qu'il l'était en tout cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //      **********************************
    //      *** ARRONDI MONETAIRE EN CENTS ***
    //      **********************************
    {
          DECLARE EXTERNAL FUNCTION RoundCent
          DOUBLE PRECISION
          RETURNS DOUBLE PRECISION BY VALUE
          ENTRY_POINT "FRoundCent" MODULE_NAME "UDFSys.DLL";
    }
    function FRoundCent( var Value: Double ): Double; cdecl;
    begin
      Result := Trunc( ( Value * 100 ) + 0.5 ) / 100;
    end;
    l'instruction "var" permet justement de "convertir" la valeur en pointeur, tu n'aura qu'a remplacer "trunc" par "abs"

    je ne suis pas sûr que cela soit encore nécessaire, mais à l'époque, j'avais placé en fin de la source le code suivant:
    si cela t'intéresse, j'ai encore le code d'une "veille" udf écrite en delphi d'où j'ai extrait le code de ci-dessus, si tu veux, je peux te la transmettre.

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. Pb de creation UDF sous Delphi
    Par dehorter olivier dans le forum SQL
    Réponses: 12
    Dernier message: 02/01/2008, 14h26
  3. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  4. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo