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

Composants VCL Delphi Discussion :

Problème de survol en création d'objet dans une DLL


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut Problème de survol en création d'objet dans une DLL
    Je reviens encore une fois à la charge avec mon composant PicButton. Dans le précédent fil de discussion, j'ai finalement pu faire marcher ce composant dans les 3 environnements distincts:
    - création en désign-time dans l'IDE
    - création en run-time dans l'unité Unit1
    - création en run-time dans une DLL

    Il est fonctionnel, s'affiche bien et réagit aux clics. Il reste un point à éclaircir qui concerne le comportement en survol du composant.

    Je m'explique. Il s'agit d'un composant dérivé de TButton, mais qui peut afficher des bitmaps pour les différents états. Les 4 états suivants m'intéressent:
    - bouton "sorti" - état normal
    - bouton "enfoncé" - état cliqué
    - bouton "éclairé" - état survol
    - bouton "désactivé" - état désactivé

    Dans les 3 environnements, j'arrive à faire fonctionner cet objet pour ces 4 états, sauf dans un cas de figure particulier: si je crée mon bouton dans la DLL (environnement 3), le bouton ne réagit pas au survol (état 3). Je ne m'explique pas la différence entre une création dynamique dans l'unité Unit1 et une création dans une DLL (pas de changement d'image lors du survol), alors que les autres changements d'images (sorti->enfoncé->sorti->désactivé...) fonctionnent parfaitement dans les deux situations.

    Je joins un fichier ZIP contenant deux projets: la DLL et le programme de démo. Il y a également toutes les sources, tous les binaires. Il suffit au départ de lancer le programme PicButtonProblem.exe et de cliquer une fois sur les boutons "Créer PicButton dynamique" et "Créer PicButton par DLL". On a alors 3 boutons en principe identiques (celui du haut est créé en "design-time" par l'IDE). Deux des boutons réagissent au survol de la souris, mais pas le troisième. Pourquoi ?

    Je précise que je suis sous Windows 8.1 avec Delphi 6 Personal Edition.

    Si vous pouviez me donner encore un coup de main, ça me soulagerait vraiment. Merci beaucoup !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 449
    Points : 5 876
    Points
    5 876
    Par défaut
    salut

    en regardant ... j'ai comme un doute sur ton code

    le frmDllForm ne correspond pas a ta Tform active
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       pan := TTransparentPanel.Create(FrmDlLForm);
        pan.Top := xtop;
        pan.Left := xleft;
        result := TPicButton.Create(pan);
        result.Parent := pan;
        pan.ParentWindow := hnd;
    en plus tu crée un TTransparentPanel alors que les autres sont des PicButton classique

    quand tu lit le code la façon Dynamique attache ton bouton à ta forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        PicButtonDynamique.ParentWindow := Form1.Handle;
        PicButtonDynamique.Top := Button1.Top+100;
        PicButtonDynamique.Left := PicButton1.Left;
        PicButtonDynamique.OnClick := PicButtonDynamiqueClick;
    met avis qu'il faut reprendre ton code

  3. #3
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Merci d'avoir regardé mon code, Anapurna !

    Voici les explications:

    1. Le segment
    pan := TTransparentPanel.Create(FrmDlLForm);
    pan.Top := xtop;
    pan.Left := xleft;
    result := TPicButton.Create(pan);
    result.Parent := pan;
    pan.ParentWindow := hnd;
    provient de la DLL. La DLL n'a pas accès à Form1 - elle ne connaît que le handle de Form1. Or, l'objet PicButton ne peut pas être injecté dans Form1 uniquement à l'ai de du handle - c'est un constat issu de mon fil de discussion précédent: si le bouton apparaît bien, les images ne sont pas affichées et le bouton re réagit pas au clic ! Seule solution: transformer le bouton en un objet "parenté". J'ai choisi comme parent un TPanel. Et comme, ultérieurement, je dois donner une forme arrondie à mon PicButton, le fond rectangulaire du TPanel apparaîtrait. J'ai donc dérive TPanel vers un TTransparentPanel qui résoud ce problème. Certes, pour le problème présenté ici, c'est un overkill, mais en remplaçant TTransparentPanel par un TPanel classique, on obtient exactement le même effet, en ce qui concerne le problème présenté ici. Maintenant, le crée ce TTransparentPanel sans parent, mais avec un owner qui est une pseudo-form définie et connue seulement dans la DLL: c'est FrmDllForm. Et du coup, je peux injecter le TTransparentPanel dans la Form1 via le handle de la form, et tout fonctionne: l'affichage des bitmaps, et la réception des clics. Cette partie du code est valide et réfléchie, et j'utilise cette technique d'ailleurs à de multiples reprises avec d'autres objets (TWebBrowser, TRichEdit, TMaskEdit, ...) pour les "parenter" avant injection dans une form. Une astuce qui m'a été indiquée initialement par un spécialiste de ce même forum, et je lui en suis reconnaissant !

    2. Le segment
    PicButtonDynamique.ParentWindow := Form1.Handle;
    PicButtonDynamique.Top := Button1.Top+100;
    PicButtonDynamique.Left := PicButton1.Left;
    PicButtonDynamique.OnClick := PicButtonDynamiqueClick;
    est extrait du programme de démo PicButtonProblem.dpr et non de la DLL. Il se trouve dans L'unité décrivant la Form1. Dans cette form, je crée également un PicButton dynamiquement, mais cette fois sans recourir à la DLL, justement pour mettre en évidence la différence du comportement du composant PicButton dans les deux cas. Le segment complet serait plutôt:
    PicButtonDynamique := TPicButton.Create(self);
    PicButtonDynamique.ParentWindow := Form1.Handle;
    // PicButtonDynamique.Parent := Form1;
    PicButtonDynamique.Top := Button1.Top+100;
    PicButtonDynamique.Left := PicButton1.Left;
    PicButtonDynamique.OnClick := PicButtonDynamiqueClick;
    et le calcul de la position verticale du PicButton créé s'explique par le fait du positionnement relatif par rapport au bouton de commande Button1 (Créer PicButton dynamique). Là encore, tout est normal, et à ce niveau-la, tout fonctionne bien.

    Le problème est lorsqu'on crée un PicButton par la DLL, avec le bouton à droite portant le libelle "Créer PicButton par DLL". Il apparaît bien, les bitmaps pour l'état normal (sorti) et cliqué (enfoncé) apparaissent bien, le bouton réagit normalement au clic. Tout comme celui de gauche, créé directement dans Unit1. Par contre, alors que ce bouton à gauche réagit correctement au survol par la souris en changeant de bitmap, celui de droite reste inerte lors du passage de la souris. Et j'ai vérifié: dans le composant, on ne reçoit jamais les évènements MouseEnter et MouseLeave. Et donc, le composant ne change pas le son statut en n'affiche pas la bitmap prévue pour le survol. Il est là, le problème.

    Je pense que ça vient du composant PicButton. Je l'ai trouvé sur internet, sous forme d'une simple page de texte, sans autre information. J'y ai déjà apporté quelques corrections, et dans mon fil de discussion précédent, ThWilliam a également corrigé quelque chose qui bloquait. Mais un détail échappe encore. Ce composant fonctionne parfaitement en l'état, pour un objet créé par l'IDE (il est installé dans la palette - c'est le bouton en haut), en création dynamique dans Unit1 (le bouton en bas à gauche). Seule la création dans une DLL pose problème, et encore uniquement ce problème de non-réception des messages MouseEnter et MouseLeave, comme tenté ainsi:
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    J'ai regardé de multiples tutos sur internet sur la façon d'ajouter ces évènements à un objet dérivé, et je n'arrive pas à trouver une erreur, d'autant que ça marche bien dans deux des 3 situations présentées ici.

    Crois-moi, avant de faire appel à ce forum, j'ai passé des heures et des jours à traquer le problème et tenter de trouver des solutions. Mais là, sur ce point précis, je sèche.

  4. #4
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Juste un complément d'information:

    J'ai imaginé que le fait d'incorporer le composant PicButton dans un TransparentPanel avec exactement les mêmes dimensions, pouvait avoir pour effet de diriger les évènements MouseEnter et MouseLeave vers le TransparentPanel et non vers le PicButton. J'ai donc agrandi le TransparentPanel de 100 pixels en largeur et en hauteur, et j'ai placé le PicButton en (50,50) sur le TransparentPanel, de sorte à avoir une marge de 50 pixels tout autour. Mais même en déplaçant le curseur lentement, du fond d'écran à-travers le TransparentPanel jusque dans le PicButteon, ce dernier ne reçoit pas ces évènements, et ne réagit donc pas au survol. Et ce phénomène se présente uniquement si le PicButton est créé dans la DLL. En création par l'IDE ou dynamiquement dans Unit1, ça marche.

    Je continue à faire des essais de mon côté...

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 449
    Points : 5 876
    Points
    5 876
    Par défaut
    salut

    bon j'ai lu le code de la dll
    je l'aurais écrit plutôt comme cela

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    function CreatePicButtonByDLL(winCtrl: TWinControl; xtop, xleft, solution: integer):TPicButton; StdCall; Export;
    var
      bm: TBitMap;
    {  *** pour solution 2  }
      Method: TMethodPointer;
    begin
      result := nil;
      try
        result := TPicButton.Create(winCtrl);
        result.Parent := winCtrl;
        pan.ParentWindow := winCtrl.Handle;
     
    {  *** pour solution 2   }
        Method.pMethod := @PicButtonDynamiqueDLLClick2;
        Method.pObject := nil;
     
        bm := TBitMap.Create;
        bm.LoadFromFile('Boutons2.bmp');
        result.PicNormal := bm;
        bm.LoadFromFile('Boutons2Down.bmp');
        result.PicPushed := bm;
        bm.LoadFromFile('Boutons2Hover.bmp');
        result.PicHiLight := bm;
        bm.Free;
        result.Top := xtop;
        result.Left := xleft;
     
    {  *** pour solution 1 }
        if solution=1 then 
          result.OnClick := TDummy.PicButtonDynamiqueDLLClick1;
    {  *** pour solution 2   ne réagit pas au clic gauche   }
        if solution=2 then 
           result.OnClick := TNotifyEvent(Method);
      except
        ShowMessage('Oups... Erreur en création.');
      end;
    end;

  6. #6
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Oui, je comprends ce que tu me montres. Au lieu de passer le handle de la form dans laquelle le PicButton doit apparaître, tu passes l'objet lui-même, ce qui rend possible d'utiliser pa propriété PAarent au lieu de la propriété ParentWindow.

    Malheureusement, ce n'est pas possible. Comme je l'ai exposé dans mon fil de discussion précédent, la DLL est destinée à servir pour des programmes écrits dans un autre langage que Delphi, et seul le handle de l'objet cible peut être passé en paramètre, pas l'objet lui-même. Tu trouveras la discussion ici. Et c'est ce qui conditionne l'obligation d'intercaler un Panel pour "parenter" le PicButton. Mais avec cette technique, tout fonctionne: le bouton apparaît bien, la bitmap pour l'état normal (bouton sorti) est bien affiché, en cliquant dessus, la bitmap correspondante (bouton enfoncé) est bien affichée tant que le bouton de la souris reste maintenu en bas, et l'évènement OnClick est correctement déclenché, quelque soit la méthode de lier la routine évènement au PicButton (soit par TMethodPointer, soit par la méthode de la Class Procedure).

    Ce qui ne marche pas, ce sont uniquement les évènements MouseEnter et MouseLeave qui ne se déclenchent pas. Pourquoi ? Mystère. Car en création dans Unit1 (en création "dynamique"), ça marche. Le problème n'existe qu'en création par la DLL.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 449
    Points : 5 876
    Points
    5 876
    Par défaut
    salut

    j'ai fait un bete test ... j'ai mis un transparent panel en création dynamique et .... cela ne marche pas non plus ... ce qui veut donc dire que
    le transparent panel intercepte les messages de ton bouton

  8. #8
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Ah... c'est une piste intéressante. Je vais chercher dans TransparentPanel.pas si je retrouve cela...

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut
    Bonjour,

    Je sais pas si ça peux aider (je suis beaucoup trop court pour ce genre de programmation ) mais :
    Chez moi :
    Windows 8.1 , Delphi XE Starter
    Apres re-création de la DLL et chargement du projet ça marche et ce avec les 3 options de création du bouton.
    Le bouton change de couleur (tres joli


    PS : ça marche a la première création, si je supprime le bouton , change la méthode, crée le bouton alors ça marche plus . Par contre si je ferme l'exe et que je le relance les 3 méthodes marchent.
    Si ça intéresse quelqu'un je peux envoyer l'exécutable (mais comme je sais que les développeurs n'aiment guère les exe de source inconnue ..)

  10. #10
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Merci, Gaby277, de t'intéresser à mon problème.

    Mais maintenant, j'en suis encore plus frustré ! J'ai uniquement Delphi 6 Personal Edition, et il faut que ça marche avec ça.

    En ce qui concerne la méthode qu'on peut choisir pour le bouton créé dans la DLL, cela ne concerne que la façon d'établir le lien avec la routine de traitement de l'évènement OnClick. Cela n'a aucun lien avec l'affichage des bitmaps.

    Je cherche à savoir quels sont les messages que Windows passe à mon TransparentPanel et/ou mon PicButton. Et une chose est certaine: je ne reçois pas le message CM_MOUSEENTER ni CM_MOUSELEAVE, dans le TranssparentPanel. Seul WM_NCHITTEST apparaît, même pas WM_MOUSEMOVE. Et ce même si je crée on TransparentPanel avec 100 pixels de plus que le PicButton, en plaçant le PicButton en (50,50). Pourtant, au survol, le curseur traverses forcément de TransparentPanel... Et, évidement, le PicButton ne reçoit pas non plus ces évènements. Par contre, il reçoit les messges WM_LBUTTONDOWN et WM_LBUTTONUP, car le bouton réagit parfaitement au clic. Et la routine OnClick est appelée après le traitement du LBUTTONUP. Normal.

    Mais alors, pourquoi les CM_MOUSEENTER et CM_MOUSELEAVE ne passent pas ?

    Or, en création dynamique en Unit1 (sans DLL), le PicButton reçoit bien ces évènements !

    Je fais en ce moment une multitude d'essais, et, il faut bien l'avouer, c'est un peu à l'aveuglette.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 400
    Points : 652
    Points
    652
    Par défaut
    les messages CM_XXX ne sont pas des messages Windows mais ils sont générés par la VCL

    ta dll ne les reçoit pas car tu as 2 formes qui ne partagent pas la même boucle de messages

    voir http://www.phidels.com/php/forum/for...&postid=108129

    il n'y a pas vraiment de solution propre

    lire la note en bas de la page : https://books.google.fr/books?id=YbS...EENTER&f=false

    dans le même genre

    https://groups.google.com/forum/?hl=...I/djU2uNIU9OoJ

    trouvé avec cette recherche https://www.google.fr/#q=delphi+dll+...EENTER&start=0

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Tpickbutton
    Bonjour,
    Dans le dernier Zip
    Une suggestion :
    //ligne 16 il y avaitPicButton1: TPicButton; // XE rale ..
    en commentaire ça passe mieux !

    //ligne 85 il y avait : PicButtonDynamique.Left := PicButton1.Left; // XE rale ..
    PicButtonDynamique.Left := Button1.Left;

    Oui je sais c'est mesquin

    Bon merci pour ce code corrigé (qui me passe un peu au dessus de la tete) et que j'essaierai de m'approprier pour progresser.

  13. #13
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    //ligne 16 il y avaitPicButton1: TPicButton; // XE rale ..
    C'est parce que j'utilise un composant PicButton dont le source est dans PicButton.pas (doit être dans le ZIP...).
    En D6, la présence de PicButton.pas suffit pour que la compilation se passe bien. Si l'on veut l'utiliser dans l'IDE, il faut bien sûr installer ce composant, ce qui ne pose pas de problème, en D6 en tout cas.

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Pickbutton
    Bonsoir
    En XE avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PicButton1: TPicButton;
    chaque fois que l'on sauvegarde il y a un message d'erreur : "Le champ Form1.Pickbutton n'a pas de composant correspondant Voulez vous retirer la déclaration"
    Si on répond oui l'EDI la supprime. Si on répond non ça n'empêche pas de compiler, mais a chaque sauvegarde il y a le message d'erreur.
    C'est un minuscule détail, mais quelquefois ça déconcerte un débutant qui teste le projet.

  15. #15
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Certes. Cela vient, comme je l'ai dit, de ce que le composant PicButton n'est pas installé dans l'IDE, dans un des onglets des composants disponibles.

    Je n'ai pas Delphi XE, mais il y a sûrement un menu "Composants", avec une fonction "Installer un composant". Choisis cette fonction, navigue vers PicButton.pas et valide, puis clique sur "Compiler".

    Ensuite, ça marchera mieux. Et tu pourras même te servir de ce bouton dans l'IDE...

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 305
    Points : 41 790
    Points
    41 790
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    chaque fois que l'on sauvegarde il y a un message d'erreur : "Le champ Form1.Pickbutton n'a pas de composant correspondant Voulez vous retirer la déclaration"
    En général c'est souvent parce que le composant est situé dans un répertoire non indiqué dans les chemins de recherche du projet ou de l'IDE

  17. #17
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    J'en suis convaincu. C'est pourquoi j'ai posté un ZIP contenant le dossier complet, avec toutes les sources, y compris PicButton.pas et TransparentPanel.pas, sources des deux composants spécifiques. Avec Delphi 6 Personal Edition, l'IDE va les chercher dans le dossier dans lequel se trouve le projet. Et seulement s'il ne les y trouve pas, il va chercher dans les chemins paramétrés dans l'EDI.

    Je ne sais pas comment ça se passe sous Delphi XE, mais je pense que de toutes façons, le comportement de mon logiciel risque d'être différent, vu que ces versions beaucoup plus récentes de Delphi altèrent tout de même certaines choses, en particulier au niveau du VCL...

  18. #18
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 449
    Points : 5 876
    Points
    5 876
    Par défaut
    salut

    je te rassure les version differente de delphi reagisse de la meme façon si
    ton composant posé sur la form n'existe pas dans tes panneau de composant delphi veux enlever l'information de ta form

    pour ce faire il faut qu'il créer un dpk et installe le composant dans une palette ... le message n'apparaitra plus

    en ce qui concerne ton soucis effectivement c'est un problème de messages, il faut pouvoir a partir de la dll
    injecter les message du composant dans la queue des message de ta form principale qui se trouve dans l'exe ... ce qui est loin d’être anodin

    de plus comme tu veut que la dll ne soit pas "typé" vcl il ne te reste plus que les solution api windows ou peut être les interfaces
    a voir du coté des plugin comment ils gèrent ce genre de problématique

  19. #19
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 172
    Points
    172
    Billets dans le blog
    1
    Par défaut
    Donc, si j'ai bien compris, AnaPurna, je devrais sous-classer la fenêtre cible (celle dans laquelle j'injecte mon composant) en "hookant" la WndProc de cette fenêtre, certainement par SetWindowLong ?

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Création dynamique d'un composant
    Bonjour,
    Une petite précision
    Quand à chaque fois qu’on sauvegarde un projet, ce que fait je suppose très souvent un développeur en action, je pense que c’est un peu gênant (sans plus) d'avoir systématiquement un message d'erreur ou d'attention.

    Apres il est bien clair que l’on peut ne pas être gêné et(ou) que l’on peut aussi supprimer le message de deux façons :
    - En mettant simplement " // " devant la ligne qui provoque le message, ce qui ne détériore en rien ni l’intérêt de la démonstration ni son bon fonctionnement,
    - En installant le composant.

    Mais comme le thème de la discussion c’est la création à l’exécution de composants …
    Il me semble que quand un composant est dans la palette il est plus simple, plus pratique et surtout plus rapide de le poser sur la Form que de le créer à l’exécution …
    Mais tout ça c’est peut-être une vision simpliste (et peut être trop productiviste) de la programmation … .

    Apres j’apprécie beaucoup la publication de l’intégralité du code ( intéressant et pédagogique ) ce qui en Delphi est de plus en plus rare (c’est un autre débat).
    Et je remercie KlausGunther de l'avoir fait.

Discussions similaires

  1. Création d'objets dans une boucle
    Par Ade14 dans le forum Débuter
    Réponses: 21
    Dernier message: 28/08/2014, 10h50
  2. Créations d'objets dans une collection
    Par tedori dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/07/2009, 17h45
  3. Création d'objets dans une boucle for
    Par urban_p dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/06/2008, 11h34
  4. Réponses: 2
    Dernier message: 20/04/2007, 11h24
  5. Création du timer dans une Dll
    Par Hokagge dans le forum MFC
    Réponses: 13
    Dernier message: 14/03/2006, 19h04

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