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 :

Intégrer un objet Ole WIA dans un panel ou une fenêtre


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut Intégrer un objet Ole WIA dans un panel ou une fenêtre
    Bonjour,

    Dans une application Delphi Rio en VCL 32 bits, j'utilise pour l'impression un appel Ole au WIA de windows.

    Code d'appel :
    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
    procedure ShowPhotoPrintWizard(Files: TStrings);
    var
      I: Integer;
      CommonDialog: OleVariant;
      Vector: OleVariant;
    begin
      if not Assigned(Files) then Exit;
      CommonDialog := CreateOleObject('WIA.CommonDialog');
      Vector := CreateOleObject('WIA.Vector');
      for I := 0 to Files.Count - 1 do
        Vector.Add(Files[i]);
      CommonDialog.ShowPhotoPrintingWizard(Vector);
      Vector := Unassigned;
      CommonDialog := Unassigned;
    end;
    Tout fonctionne parfaitement, la fenêtre de dialogue de l’objet Ole s'ouvre au dessus de la fenêtre de mon application, mais dans certains cas ce dialogue part dessous mon application.
    A ce moment là, l'utilisateur n'a plus la main et ne peut ni lancer ni abandonner l'impression.

    Est-il possible d'afficher cet objet WIA dans un panel ou une fenêtre de mon appli que je puisse le gérer complètement ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Cela ne se produirait pas le plus souvent en DEBUG ?
    Même MessageDlg peut aussi bloquer en se cachant derrière.

    Ayant aussi ce problème avec 'Excel.Application', j'ai bricolé un SetForegroundWindowAsync pour que le Excel passe devant mais dans le cas du ShowPhotoPrintingWizard, est-il facile de savoir le classe ou le titre de la fenêtre ?

    Je ne l'ai pas sous la main mais j'avais aussi bricolé un truc avec un TThread qui surveillait les TMessageForm pour éviter les problèmes de perte de focus, par exemple, lorsque que l'on change d'application (ALT+TAB, Clic Systray ...), si un TMessageForm était visible, j'ajoutais un effet de clignotement pour que l'utilisateur voit le message (l'utilisateur pouvait navigueur entre 3 EXE pour son travail, lié entre eux par des invocations, passez de l'un à l'autre pouvait va savoir pourquoi passer les MessageDlg en arrière)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut
    Non cela ne semble pas se produire plus en debug qu'en fonctionnement normal.
    Lorsque le dialogue WIA est affiché, une manip hors de cette fenêtre semble l'envoyer derrière !
    C'est assez pénible. Il y a aussi les MessageDlg aussi qui ont bien tendance à passer derrière lorsque l'on navigue entre plusieurs applis effectivement.
    Pour eux j'ai résolu la question en faisant de l'affichage sur un Panel directement dans mon appli.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Tu peux gérer le Z-Order; demander à la fenêtre de toujours se placer derrière celle d'impression.
    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
    type
      TForm1 = class(TForm)
      private
        procedure WMWindowPosChanging(var Message :TWmWindowPosChanging); message WM_WINDOWPOSCHANGING;
      end;
     
    procedure TForm1.WMWindowPosChanging(var Message: TWmWindowPosChanging);
    var
      Wnd :hWnd;
    begin
      Wnd := FindWindow('NativeHWNDHost', 'Imprimer les images');
     
      if Wnd <> 0 then
        Message.WindowPos.hwndInsertAfter := Wnd;
    end;

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut
    Merci Andnotor, c'est exactement ce que je cherchais.
    Cela fonctionne parfaitement pour les premiers tests.
    Merci

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Wnd := FindWindow('NativeHWNDHost', 'Imprimer les images');
    Citation Envoyé par ShaiLeTroll Voir le message
    est-il facile de savoir le classe ou le titre de la fenêtre ?
    Voilà, j'ai ma réponse
    et je note ce WM_WINDOWPOSCHANGING, si un jour j'ai des IHM à faire (rarissime), cela doit être plus pratique que ce que j'avais mis en place lors de la maintenance d'un projet existant depuis D7
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut
    Effectivement c'est facile de trouver la classe et le nom de la fenêtre quand Andnotor le donne !!
    Par contre j'ai déjà vu des applis qui donnent ces infos, mais je ne les ai plus en tête. Si quelqu'un peut me rafraîchir la mémoire : Merci

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    WindowSpy, en Delphi

    KillApplic (utilise EnumWindows), une adaptation d'un projet Phidels, je m'en suis servi récemment pour le forum
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Ici en l’occurrence on a hwndInsertAfter qui va fatalement, une fois, représenter la fenêtre d'impression. GetClassName/GetWindowText nous permettent d'en extraire les informations.

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

Discussions similaires

  1. [Lazarus] Afficher une form dans le panel d'une autre form
    Par jojo86 dans le forum Lazarus
    Réponses: 2
    Dernier message: 22/05/2012, 00h02
  2. [Problème] JFreechart dans un panel d'une JDialog
    Par Nodens dans le forum NetBeans
    Réponses: 0
    Dernier message: 03/02/2011, 16h11
  3. Expanders dans un panel avec une scrollbar
    Par royto dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 13/11/2009, 09h23
  4. Réponses: 1
    Dernier message: 05/10/2009, 03h50
  5. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 21/04/2008, 16h08

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