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

API, COM et SDKs Delphi Discussion :

Appel de l'api "PolyBezier" en Delphi


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut Appel de l'api "PolyBezier" en Delphi
    Bonjour
    J'essaie d'appeler l'api PolyBezier (http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx) déclarée dans l'unité Windows.pas comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {$EXTERNALSYM PolyBezier}
    function PolyBezier(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
    Dans mon code je procède comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var
    ...
        J:Integer;
        BitmapHDC: L_HDC;//Handle du bitmap sur lequel je vais dessiner
        APointsList: array of TPoint;//Tableaux dynamique des sommets de mon bezier
        ANbPoints: Integer;//Nombre de points de mon bezier
    begin
            //Initialisation de la taille du tableau de points
            ANbPoints := AContour.Count;
            SetLength(APointsList, ANbPoints);
            for J := 0 to ANbPoint - 1 do begin
                ...Divers calculs de changement de repère....
                APointsList[J].X := AImagePoint2.X;
                APointsList[J].Y := AImagePoint2.Y;
            end;
            PolyBezier(BitmapHDC, APointsList, ANbPoints);
    end;
    Malheureusement ça n'a pas l'air de marcher: les lignes affichées ne correspondent pas à ce que j'attends. Le calcul de coordonnées de AImagePoint2 est bon.
    Ou se trouve mon erreur?
    Merci de votre aide.
    Pensons bien, pensons bio

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    si tes points sont bons, essaie ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PolyBezier(BitmapHDC, APointsList[0], ANbPoints);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for J := 0 to ANbPoint - 1 do begin
                ...Divers calculs de changement de repère....
                APointsList[J].X := AImagePoint2.X;
                APointsList[J].Y := AImagePoint2.Y;
            end;
    ... tous les APointsList[J] sont égaux à l'unique AImagePoint2 : Oui/Non ?

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PolyBezier(BitmapHDC, APointsList[0], ANbPoints);
    Ca marche ! Je n'ai rien pigé mais ça marche. T'aurais pas une chite explication ou un lien, histoire que je ne meure pas (trop) idiot!
    Merci Paul TOTH
    Pensons bien, pensons bio

  5. #5
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    ... tous les APointsList[J] sont égaux à l'unique AImagePoint2 : Oui/Non ?
    Non je n'ai pas mis tout le code pour ne pas surcharger mais AImagePoint2 prends différentes valeurs
    Pensons bien, pensons bio

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par samaury Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PolyBezier(BitmapHDC, APointsList[0], ANbPoints);
    Ca marche ! Je n'ai rien pigé mais ça marche. T'aurais pas une chite explication ou un lien, histoire que je ne meure pas (trop) idiot!
    Merci Paul TOTH
    tout ça c'est la faute aux tableaux dynamiques, ils sont très pratiques mais source de nombreuses erreurs d'utilisation...tout comme les (long) string

    la fonction attend un paramètre "const", c'est la méthode habituelle en C ou tu envoie le premier élément d'un tableau sachant que les autres suivent en mémoire, leur nombre est donné par un autre paramètre.

    mais le mot clé "const" non typé peut être vu comme un "@" implicite

    "APointsList" est un pointeur vers le premier élément du tableau
    "APointsList[0]" est LE premier élément du tableau
    c'est un peu comme "Pointer" et "Pointer^"

    avec const tu as
    "@APointList"
    et
    "@APointsList[0]"

    et c'est bien cette dernière forme que l'on attend


    ton code aurait fonctionné si la fonction avait été déclarée différemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function PolyBezier(DC: HDC; Points: Pointer; Count: DWORD): BOOL; stdcall;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Compris
    Merci
    Pensons bien, pensons bio

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Au fait, y a-t'il un réel intérêt à appeler directement l'api PolyBezier (???)puisque l'on dispose de la procédure Delphi dont la syntaxe est bien plus simple et n'induit pas en erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure PolyBezier(const Points: array of TPoint);

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,

    Au fait, y a-t'il un réel intérêt à appeler directement l'api PolyBezier (???)puisque l'on dispose de la procédure Delphi dont la syntaxe est bien plus simple et n'induit pas en erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure PolyBezier(const Points: array of TPoint);

    A+.
    ça dépend, j'ai un projet un peu complexe qui fait beaucoup d'appel GDI...la version VCL initiale est largement plus lente que les appels directement à l'API car sous Delphi tu as un tas de gestion de OnChange, RequiredState etc... qui peuvent nuire à la rapidité.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Paul TOTH : ça dépend, ... projet un peu complexe qui fait beaucoup d'appel GDI... qui peuvent nuire à la rapidité.
    ... ok, merci pour la réponse.

    Comme j'utilise Delphi-5 je n'ai pas accès aux sources de la procedure Delphi PolyBezier(const Points: array of TPoint) je pensais que celle-ci se réumait à trois ou quatre instructions dont une qui appelle directement l'API Polybezier ce qui me laissait penser que cet intermédiaire de Delphi ne prendrait que quelques nanosecondes.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-bonjour,


    ... ok, merci pour la réponse.

    Comme j'utilise Delphi-5 je n'ai pas accès aux sources de la procedure Delphi PolyBezier(const Points: array of TPoint) je pensais que celle-ci se réumait à trois ou quatre instructions dont une qui appelle directement l'API Polybezier ce qui me laissait penser que cet intermédiaire de Delphi ne prendrait que quelques nanosecondes.

    A+.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TCanvas.PolyBezier(const Points: array of TPoint);
    begin
      Changing;
      RequiredState([csHandleValid, csPenValid, csBrushValid]);
      Windows.PolyBezier(FHandle, PPoints(@Points)^, High(Points) + 1);
      Changed;
    end;

    le problème (et l'avantage) avec TCanvas c'est qu'on peu invoquer tout et n'importe quoi à tout moment...mais du coup, si le Canvas est celui d'un Bitmap dans un TImage il faut bien qu'il se réaffiche...si le Handle n'a pas encore été crée, il faut bien le faire, si les HPen ou HBrush ne sont pas créés, il faut le faire également.

    dans un code utilisant l'API tu dois penser à tout cela avant l'appel à PolyBezier. Mais si tu as une centaine de poly à dessiner tu ne le fera qu'une fois...Delphi aussi, mais il vérifiera à chaque poly que c'est bien déjà fait.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

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