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 :

focus form dans une dll


Sujet :

Langage Delphi

  1. #1
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut focus form dans une dll
    j'ai crée une forme dans une dll,
    quand d’appel la procédure de la dll de création de la forma, tout marche bien (même si il se crée minimisé), mais la forme ne prend pas le focus (entête reste grisé, ne se met pas une 2éme fois en top si je click dessus)
    alors j'ai dû faire un petit bricolage pour la rendre active, focus et en top.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
        procedure FormClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormConstrainedResize(Sender: TObject; var MinWidth,
          MinHeight, MaxWidth, MaxHeight: Integer);
      private
        { Déclarations privées }
        Procedure MonMessage(var msg:Tmessage);message wm_user;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
    Function  ShowFenetre(P:THandle):Longint;stdcall;
    implementation
     
    {$R *.dfm}
     
    Function  ShowFenetre;
    begin
     
         with TForm1.CreateParented(p) do
           try
             Parent:=nil;
    //         ParentWindow:=p;
             Result:=Handle;
             Show;
           except
             Result:=-1;
           //  Free;
           end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
         PostMessage(handle, wm_user, 1, 0);
         PostMessage(handle, wm_user, 2, 0);
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     //    Action:=caNone;
    end;
    procedure TForm1.MonMessage;
    begin
        case msg.WParam of
          1:begin
            SendMessage(handle, WM_NCACTIVATE, Ord(True), 0);
            BringWindowToTop(Handle);
            windows.SetFocus(handle);
            end;
          2:begin
              if Width<400 then Width:=400;
              if Height<200 then Height:=200;  
            end;
        end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         Close;
    end;
     
    procedure TForm1.FormClick(Sender: TObject);
    begin
          SendMessage(handle, wm_user, 1, 0);
    end;
    procedure TForm1.FormConstrainedResize(Sender: TObject; var MinWidth,
      MinHeight, MaxWidth, MaxHeight: Integer);
    begin
       //  MinHeight:=200;
       //  MinWidth:=400;
    end;
    cette fenêtre doit être applet depuis un programme non delphi
    bien sûr avec tout ce bricolage sa marche,
    mais y a pas une autre méthode plus propre??merci

    [edit] je veux que ma form soit modal, j'ai pas creusé encore, mais surement il y a du bricolage pour sa, si il y a une idée pour la rendre modal,

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 736
    Points : 25 645
    Points
    25 645
    Par défaut
    Pourquoi utilises-tu CreateParented si tu veux un ShowModal ?

    Pour avoir tester en C++Builder, le Windows.SetParent avec un Handle pour intégré une Form d'une DLL dans un Panel d'une Form de l'EXE, n'est pas terrible justement en terme de Focus !
    En utilisant Control.SetParent avec un TWinControl de l'EXE passé à la DLL, c'est nettement mieux !

    J'ai fait une Entorce à mes DLL, j'utilise un paramètre TWinControl*, normalement, je n'utilise pas de type objet entre mes DLL, j'utilise des PChar, BSTR, des interfaces mais pas des objets !
    Mais là comme le gain de comportement était notable !
    Mes DLL de toute façon ne sont pas conçus pour être appelés en dehors de nos projets !

    Aucune des mes fenêtres de DLL sont directement utilisés, même celle qui pourrait être autonome, je les mets dans un conteneur de l'EXE, pour en améliorer le Contrôle (le OnClose par Exemple)

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    merci shelltroll de ta réponse
    normalement, on a un programme non delphi type mDI, qui appel un programme delphi".exe", mais le bos, veux que la fenêtre de l'exe soit incorporé de l'exe de l'appelant, alors, j'ai fais ces manipes. c'est pourquoi j'ai utilisé creatparent
    pour fiche dll. et j'ai voulu qu'elle soit modal, -c'est pas obligatoi-, qu'elle aura le focus jusqu’à le close d'elle
    je veux pas utilisé les hooks (clavier et sourie), et je cherche actuellement du coter "rendre l'appelant desiable" (ou inactive au sourie et clavier)
    mais bien sûr tout sa c'est du bricolage, et j’espère avoir des méthode sûr
    merci

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    salut
    j'ai un actuellement un autre problème, le programme que je dois transformer en dll, à des réaction bizarre, si j'appelle la procédure de création de la fenêtre en dll , le programme plante, dés l'appel de create (avec nil ou application) ou creatparent(handleparent), alors j'ai ajouter la dll de teste dans le programme appelant, pour s’assurer que c'est pas le programme appelant,
    quand j'appelle en premier la dll principal, tout plante, mais quand j’appelle la dll exemple puis la dll principal sa plante pas,
    quelqu'un à t il une idée? merci

    autre chose, j'ai ajouter un entrypoint dans la ddl principal,
    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
        case dwReason of
            DLL_PROCESS_ATTACH:
            begin
                  showmessage('attach from process');
            end;
     
            DLL_PROCESS_DETACH:
            begin
                showmessage('detaching from process ');
            end;
            DLL_THREAD_ATTACH:
            begin
                showmessage('THREAD_ATTACH');
            end;
            DLL_THREAD_DETACH:
            begin
                showmessage('THREAD_DETACH');
            end;
        end;
    alors le DLL_THREAD_ATTACH est appler par les 2 dll, ????

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    le probléme est liée à adoconnection,
    quand je retire ce composant de la dll example; et l'appler puis appel de la dll principal, le programme plante,

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 736
    Points : 25 645
    Points
    25 645
    Par défaut
    Pense que DLL_PROCESS_ATTACH n'est jamais appelé en Delphi, il faut le gérer à la main !
    C'était à l'époque de D7, j'ignore si cela a changé depuis !

    Evite le showMessage, utilise OutputDebugString, c'est moins intrusif !
    Perso, j'ai souvent vu des EXE mal supporté le passage en DLL

    Pense que le ShowModal, cela n'a d'effet qu'au sein d'une application, je ne suis pas convaincu qu'un ShowModal de DLL a un effet sur un programme non Delphi, certe c'est bloquant car cela reste une boucle, mais pour le blocage du Focus, cela ne doit pas être terrible !
    Dans ta fenêtre, un Timer, tu vérifie si le GetForegroundWindow ne te renvoie pas le Handle d'une fenêtre de l'application appelant, si c'est le cas, tu force un Focus sur ta fenêtre

    Si tu as des DLL_THREAD_ATTACH, c'est qu'il a des threads secondaires qui utilisent la DLL, si tu as de la VCL, ça peut faire mal !

    Je serais toi, je ferais une DLL Proxy
    Cette DLL lance l'EXE avec des paramètres sur la ligne de commande dont par exemple le Handle du Parent !
    Dans l'EXE, si il y a le paramètre de Handle, tu caches les bouton dans la Barre des taches (un petit SetWindowLong), et tu ancres la MainForm dans l'Exe appelant via ce Handle (ouch mettre une fenêtre d'une application SDI dans un MDI ???)
    Je suppose que tu peux modifier l'application appelante, comme je le disais, fait une fenêtre MDI Child vide qui servira de conteneur pour la Form Delphi !

    Perso, je n’appelle pas la création de fenêtre durant le LoadLibrary,
    Je fais une fonction à part appeler bien après le LoadLibrary
    J'ai même constaté qu'arrêter des threads internes à la DLL (ou interne à d'autres DLL utilisées par ma DLL) durant le FreeLibrary était difficile
    Du coup, j'ai mis en place une fonction Initialize et Finalize, très proche d'un CoInit\CoUn... d'ailleurs, BCP de dll de tiers ont ce principe !

    Ensuite pour avoir un dialogue entre la DLL et l'EXE, tu peux utiliser des messages, des pipes, un file mapping, un ActiveX via RegisterActiveObject pour partager la même instance entre DLL et EXE...

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    merci à shailltroll de ta réponse
    quand le programme appelant démare, j'ai des message de DLL_PROCESS_ATTACH
    pour DLL_THREAD_ATTACH, sauf si je laisse le composant adoconnection
    je fais pas de loadlibriry, c'est un appel static

    je sais rien sur dll proxy, mais je vais me documenter

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 736
    Points : 25 645
    Points
    25 645
    Par défaut
    DLL Proxy étant plus un terme qu'une technologie !
    Pour désigner un élément intermédiaire ! un Proxy ! c'est une Design Pattern, c'est aussi le terme pour en DCOM pour désigner l'élements qui fait la passerelle entre le out-process et le client COM

    Lien Static, ah là là !
    Donc on ouvre ta DLL dès l'ouverture de l'autre programme, je n'aime vraiment pas cette pratique !

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Lien Static, ah là là !
    Donc on ouvre ta DLL dès l'ouverture de l'autre programme, je n'aime vraiment pas cette pratique !
    c'est dans le programme example, mais normalment, le "Vrai" programme, va être dynamique , c'est pas option, c'est une obligation

Discussions similaires

  1. [Lazarus] Une Form dans une DLL ?
    Par jojo86 dans le forum Lazarus
    Réponses: 2
    Dernier message: 21/05/2012, 12h45
  2. form dans une dll
    Par arnopub dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/09/2009, 15h48
  3. Réponses: 9
    Dernier message: 19/08/2009, 11h43
  4. Form dans une DLL
    Par kikimnet dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2005, 18h56
  5. Réponses: 9
    Dernier message: 29/03/2005, 10h36

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