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

Langage Delphi Discussion :

[D6] Intégrer une Form d'une DLL dans une Form d'un exe.


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut [D6] Intégrer une Form d'une DLL dans une Form d'un exe.
    Comment intégrer une fenêtre d'une DDL dans une fenêtre d'un exe ?

    J'ai essayé de jouer avec la propriété ParentWindow, mais si la fenêtre (DLL) apparait bien à l'intérieure de la fenêtre (EXE), je n'ai plus la main; tout est bloqué.

    Voici un extrait de ce que je fais dans ma DLL :
    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
          FormOutilsColisage := TFormOutilsColisage.Create(Application);
          try
             //.Si fenêtre parent.
             if HandleFenParent <> 0 then
             begin
                FormOutilsColisage.BorderStyle := bsNone;
                FormOutilsColisage.Parent := nil;
                FormOutilsColisage.ParentWindow := HandleFenParent;
             end;
     
             //.Affichage de la fenêtre.
             FormOutilsColisage.ShowModal;
          finally
             FormOutilsColisage.Release;
          end;
    Sachant que HandleFenParent est de type HWND. Et dans l'exe hôte, je lui passe FormEXE.Handle.

    Comment faut-il faire ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    est-ce que ça affecterait le traitement des messages à la fenêtre parent ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Personnellement, je ne créerais rien dans la DLL. Je définirais uniquement une procédure exportée permettant d'enregistrer les classes (RegisterClass), les instantiations étant gérées normalement depuis l'exe.

    Voir ce sujet.

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    est-ce que ça affecterait le traitement des messages à la fenêtre parent ?
    C'est pas le but.
    La fenêtre de ma DLL est sencée être autonome.

    En fait, en fonction d'un paramètre que je lui passe :
    - soit la fenêtre de la DLL est indépendante, comme le serait une fenêtre fille modale.
    - soit elle est intégrée à l'intérieure d'une fenêtre de l'exe hôte (ce que je n'arrive pas à faire).

    Citation Envoyé par Andnotor Voir le message
    Personnellement, je ne créerais rien dans la DLL. Je définirais uniquement une procédure exportée permettant d'enregistrer les classes (RegisterClass), les instantiations étant gérées normalement depuis l'exe.

    Voir ce sujet.
    Je ne comprend pas le rapport avec mon problème.
    Tu peux expliquer un peu plus ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Dans le ShowModal, il y a désactivation des entrées de la fenêtre active :
    The EnableWindow function enables or disables mouse and keyboard input to the specified window or control. When input is disabled, the window does not receive input such as mouse clicks and key presses. When input is enabled, the window receives all input.
    Comme Form2 est enfant de Form1, elle ne reçoit donc plus les entrées...

    Ca semble interdire le ShowModal dans ce cadre...

    on peut bricoler de pâles imitations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //  Form2.Parent:=ForMain;
      Form2.ParentWindow:=self.Handle;
      Form2.BorderStyle:=bsNone;
    //  Form2.ShowModal;
    //  EnableWindow(ForMain.Handle, True);
      while Form2.ModalResult=0
      do begin
        Form2.SetFocus;
        Application.ProcessMessages;
      end;     
      ShowMessage('fini');
    mais le rendu n'est pas le même !

    Peut-on imaginer un Timer qui irait rendre le focus à Form2.Handle grâce à un EnableWindow ? Ce serait encore plus bricolo !!!
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    ce que tu peux faire c'est utiliser des frames plutôt que des forms. cela va beaucoup mieux pour les intégrer dans une autre form. Et si tu veux l'afficher en indépendante, il suffit de la coller dans une form vierge.

    @++
    Dany

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    while Form2.ModalResult=0
    do begin
    Form2.SetFocus;
    Application.ProcessMessages;
    end;
    ShowMessage('fini');[/code]
    mais le rendu n'est pas le même !
    J'ai testé ta solution.
    Effectivement, il y a un mieux, mais le reste de la fenêtre "hôte" répond mal.

    J'ai finit par séparer la création (et affichage) de la destruction de la fenêtre (DLL):
    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
    procedure InitOutilsColisageDLL(HandleApp: HWND; HandleFenParent: HWND; pSession: ...);
    ...
          FormOutilsColisage := TFormOutilsColisage.Create(Application);
          try
             //.Si fenêtre parent.
             if HandleFenParent <> 0 then
             begin
                FormOutilsColisage.BorderStyle := bsNone;
                FormOutilsColisage.Parent := nil;
                FormOutilsColisage.ParentWindow := HandleFenParent;
                FormOutilsColisage.Show;
                FormOutilsColisage.SetFocus;
                Application.ProcessMessages;
             end
             else
             begin
                //.Affichage de la fenêtre.
                FormOutilsColisage.ShowModal;
             end;
          except
             FormOutilsColisage.Free;
          end;
    ...
    end;
     
    procedure FermerOutilsColisageDLL;
    begin
       FormOutilsColisage.Free;
    ...
    Et là, ca semble bien fonctionner.
    On va dire que c'est bon (jusqu'à preuve du contraire).
    pour votre aide.

    Citation Envoyé par skywaukers Voir le message
    ce que tu peux faire c'est utiliser des frames plutôt que des forms. cela va beaucoup mieux pour les intégrer dans une autre form.
    J'en ai jamais utilisé. Mais, dans ce cas, il aurait peut-être fallu effectivement.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. Appeler dans une requête des variables définies dans une macro
    Par piflechien73 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/08/2009, 15h12
  2. Réponses: 22
    Dernier message: 11/06/2007, 23h24
  3. Réponses: 1
    Dernier message: 16/05/2007, 12h51
  4. [MySQL] récupérer dans une boucle chaque information MySQL dans une variable différente
    Par gtenthorey dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 22h34
  5. Réponses: 2
    Dernier message: 20/06/2006, 08h22

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