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 :

Création dynamique de forms & multi-écran


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut Création dynamique de forms & multi-écran
    Je cherche à crée dynamiquement des formulaires en fonction du nombre d'écrans présents sur ma machine, et lorsqu'ils sont crées les placer chacun dans l'écran qui leur correspond.

    Je rencontre un problème lors de l'execution de la fonction 'Show' qui me redéplace tout mes formulaires sur mon écran n°1.

    (Show me permet d'afficher le contenu et de redimenssioner mon formulaire à la bonne taille)


    Voilà mon code pour la création dynamique des formulaires (contenu dans le formulaire 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
    20
    21
    22
    23
    procedure TForm1.FormCreate(Sender: TObject);
    var
      loop   : integer;
    begin
      Form1.BorderStyle:=bsnone;
      Displays := TDisplays.Create; // on crée l'objet qui va contenir la liste des moniteurs
      EnumDisplayMonitors(0,Nil,@EnumProc,Nil);
      setlength(t_form,Displays.Count);
      For loop := 0 to (Displays.count - 1) do
      begin
        t_form[loop] := TForm.Create(self);
        with t_form[loop] do
        begin
          Align := alClient;
          Caption := 'Suivi étuve n°' + inttostr(loop+1);
        end;//with
        t_frame[loop] := TFrame2.Create(t_form[loop]);
        t_form[loop].Show;
        SetWindowPos(t_form[loop].Handle, 0, Displays.Item[loop].Monitor.Left,
          Displays.Item[loop].Monitor.Top,
          0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
      end;//for
    end;//procedure
    et la librairie que j'utilise ici : unit_gestion_ecran.pas

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Pourquoi ne pas ajouter des fenêtres enfants dans une application mdi (multiple document interface) ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    A vrai dire, je ne sais pas de quoi tu parles.

    (je me renseigne...)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Une application MDI (Multiple Document Interface) est constitué d'une fenêtre principale appelé le parent et des fenêtres enfants. Cette interface permet à la fenêtre principale de contenir des fenêtre enfant
    Le truc c'est que je ne souhaite pas que les formulaires que je génère soient contenus dans le fomulaire principal.
    Mon formulaire principal n'a pas lieu d'être pour autre chose que la génération de mes formulaires dynamiques, ca ne poserait pas problême?

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Je t'ai mis un exemple téléchargeable à l'adresse suivante :
    http://www.aw-informatique.fr/echange/fact.zip

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    En fait le MDI ne résoudra pas mon problème étant donné que je suis obligé de garder les formulaires ainsi générés à l'intérieur du formulaire d'origine. Je souhaite vraiment que les formulaires générés soient, après création, indépendants et notamment du formulaire principal.

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Est ce que ces fiches doivent communiquer ensemble ou ce sont autant d'applications indépendantes ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    elles ne communiquent pas entre elles et ne sont pas liées c'est juste qu'elles contiennent des données similaires.

  9. #9
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Tu peux traiter l'information de la manière suivante.
    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
     
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    var
      Form1: TForm1;
    implementation
    uses Unit2;
    {$R *.dfm}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      I1   : integer;
      Formx : TForm2 ;
    begin
      Form1.BorderStyle:=bsnone;
      For i1 := 0 to 4 do
      begin
        Application.CreateForm(TForm2, Formx);
        Formx.Caption := 'Suivi étuve n°' + inttostr(I1+1);
        Formx.Visible := true ;
        SetWindowPos(formx.Handle, 0, i1*10,i1*10,
          0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
      end;
    end;
    end.
    L'application contient une deuxième fiche Form2
    Le programme principal doit avoir le contenu suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    program Project1;
    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};
    {$R *.res}
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Tu mets ce que tu veux sur ta fiche Form2. Tous les objets de chaque fiche form2 sont accessibles par formx après création. Tu n'as pas besoin de tableau de form

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    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 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    ou est renseigné la position des different moniteur ?
    on peut voir EnumDisplayMonitors et EnumProc ?
    les formes sont elle en poDesigned ?

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    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
      // Type utilisé par la fonction GetMonitorInfo pour
    // retourner les informations sur le moniteur voulu
    Type
      PMonitorInfoEx=^TMonitorInfoEx;
      TMonitorInfoEx=Record
        cbSize    : DWord;
        rcMonitor : TRect;
        rcWork    : TRect;
        dwFlags   : DWord;
        szDevice  : Array[0..CCHDEVICENAME-1]Of Char;
      End;//record
     
    // Fonction donnant des informations sur un moniteurs
    Function GetMonitorInfo(Montiteur:THandle;LpInfo:PMonitorInfoEx)
         :Bool;StdCall; external User32 name 'GetMonitorInfoA';
    // Fonction d'énumération des moniteurs présents
    Function EnumDisplayMonitors(DC:HDC;LpRect:PRect;CallBack:TFarProc;Param:Pointer)
         :Bool;StdCall; external user32 name 'EnumDisplayMonitors';
    // Procédure appelée par l'énumérateur des moniteurs
    Function EnumProc(Moniteur:THandle;DC:HDC;Rect:PRect;Param:Pointer):Bool;StdCall
    Var
      Infos   : TMonitorInfoEx;
      Display : TDisplay;
    Begin
        // Pour chaque moniteurs rencontré, on en recherche le nom
      Infos.cbSize:=SizeOf(Infos);
      If GetMonitorInfo(Moniteur,@Infos)Then
      begin
        Display := TDisplay.Create('Device',Infos.szDevice, Infos.rcMonitor, Infos.rcWork ); // création du moniteur
        Displays.Add(Display); // on l'ajoute dans la liste
      end;//if
    End;//function
    voilou Mr

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    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 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    Un premiere chose donne un nom different a chaque display que tu creer
    [FONT=monospace]
    [/FONT]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // création du moniteur
    Display := TDisplay.Create('Device',Infos.szDevice, Infos.rcMonitor, Infos.rcWork ); 
    Display.name := 'Display'+InttoStr(Displays.Count+1)
    // on l'ajoute dans la liste
     Displays.Add(Display);
    ca va te permettre de verifier que c'est bien le bon Display
    que tu utilise

    dans ta premiere methode que tu as fournit
    remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowPos(t_form[loop].Handle, 0, Displays.Item[loop].Monitor.Left,      Displays.Item[loop].Monitor.Top,      0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Var 
    adisplay: TDisplay;
    ...
    adisplay := Displays.Item[loop]
    //tu peut mettre un point d'arret afin de verifier les infos
    SetWindowPos(t_form[loop].Handle, 0, adisplay.Monitor.Left, adisplay.Monitor.Top, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  13. #13
    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 770
    Points
    2 770
    Par défaut
    Citation Envoyé par ArkSquall
    elles ne communiquent pas entre elles et ne sont pas liées c'est juste qu'elles contiennent des données similaires.
    alors pourqoi pas crée chaque faeille dans un prog a part, et les executes à partir de votre form principal
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    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 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    A priorie il faut qu'il regarde le SDI et nom pas le MDI
    un peut comme le fait delphi

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Développeur Objet
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Objet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut [Résolu]
    J'ai résolu mon problème :

    En fait cela venait du BorderStyle du form. Si je le mettais à none avant d'exécuter le Show il me replaçait le formulaire généré dans l'écran 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
    20
    21
     
        t_form[loop] := TForm3.Create(self);
        t_frame[loop] := TFrame2.Create(t_form[loop]);
        with t_frame[loop] do
        begin
          Align := alClient;
          Parent := t_form[loop];
        end;//with
        with t_form[loop] do
        begin
          Align       := alNone;
          FormStyle   := fsStayOnTop;
          WindowState := wsMaximized;
          Caption := 'Suivi étuve n°' + inttostr(loop+1);
        end;//with
        SetWindowPos(t_form[loop].Handle, 0, Displays.Item[loop].Monitor.Left,
          Displays.Item[loop].Monitor.Top,
          0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
        t_form[loop].Show;
        t_form[loop].BorderStyle := bsNone;
        Form1.BorderStyle:=bsnone;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/02/2008, 15h02
  2. Création dynamique de Forms
    Par Blaede dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2007, 18h07
  3. création dynamique de forms
    Par jomree dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2007, 13h48
  4. D7/création dynamique d'une Form
    Par jer64 dans le forum Delphi
    Réponses: 4
    Dernier message: 05/09/2006, 21h36
  5. [D7] Création dynamique de Form
    Par jer64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2003, 12h20

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