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

Delphi Discussion :

[D7] Lancer une form avec un effet graphique


Sujet :

Delphi

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [D7] Lancer une form avec un effet graphique
    Bonjour à tous,

    Je me suis créé une petite form qui peut s'apparenter à un popupMenu.
    J'aimerais que lorsque je la crée, elle se lance en s'aggrandissant... Comme si elle s'ouvrait.

    J'ai fait ça, mais ca ne dessine pas les composant à l'interieur., ils ne s'affichent que quand la boucle est finie. :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TfrmGammes.FormActivate(Sender: TObject);
    var i: Integer;
    begin
      i := 0;
      while i<163 do begin
        Self.Width := i;
        Sleep(50);
        i := i+5;
      end;
    end;
    De plus, il retourne dans la boucle lorsque je ferme la form. :-( :-( :-(

    Avez vous une idée ?

    Merci d'avance.

  2. #2
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Hum, déja le form activate n'est pas le bon endroit pour executer ca, tu devrais plutot le faire apres le onshow, pour ca tu doit lancer un message a la fin du onshow:

    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
     
    uses(...)
    const
      CM_AFTERSHOW = WM_USER + 84;
    (...)
    Private
    procedure AfterShow(var Msg: TMessage); message CM_AFTERSHOW;
    (...)
     
    procedure onshow...
    begin
      PostMessage(Handle, CM_AFTERSHOW, 0, 0);
    end;
     
    procedure AfterShow(var Msg: TMessage); message CM_AFTERSHOW;
    begin
     // la form est bien visible a partir d'ici
    end;
    apres pour le resize des compo, j'ai pas testé mais si c'est bien en alclient, ca devrait être ok.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu peux aussi t''inspirer de ceci :
    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
    //Fiche animée à l'ouverture/fermeture
    uses shellapi; 
     
    // Lors du onShow :
    AnimateWindow(Handle, 250, SW_SHOWDEFAULT); //< 250 = vitesse en millisec 
     
    AnimateWindow(Handle, 250, AW_CENTER);
    AnimateWindow(Handle, 250, AW_HOR_POSITIVE);
    AnimateWindow(Handle, 250, AW_HOR_NEGATIVE);
    AnimateWindow(Handle, 250, AW_VER_POSITIVE);
    AnimateWindow(Handle, 250, AW_VER_NEGATIVE);
    AnimateWindow(Handle, 250, SW_SHOWMINNOACTIVE);
    AnimateWindow(Handle, 250, SW_RESTORE);
    AnimateWindow(Handle, 250, SW_SHOWDEFAULT);
    AnimateWindow(Handle, 250, AW_BLEND); // < Fonctionne pas avec la version Delphi 5 
     
    //Pour fixer son choix ou le faire varier :
    Randomize;
     
    i := random(6);
     case  i of
     0:AnimateWindow(Handle, 200, SW_MAX or AW_HIDE);
     1:AnimateWindow(Handle, 200, AW_VER_NEGATIVE or AW_HIDE);
     2:AnimateWindow(Handle, 200, AW_CENTER or AW_HIDE);
     3:AnimateWindow(Handle, 200, AW_HOR_NEGATIVE or AW_HIDE);
     4:AnimateWindow(Handle, 200, AW_HOR_POSITIVE or AW_HIDE);
     5:AnimateWindow(Handle, 200, AW_VER_POSITIVE or AW_HIDE);
     6:AnimateWindow(Handle, 200, AW_BLEND or AW_HIDE);
     end;
    close;

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ou tout simplement inclure un Application.processMessage dans ta boucle.

    Par contre pour que les composant interne semblent eux aussi "s'agrandir" il serait peut etre interessant de les basculer tous a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Anchors := [akTop, akLeft, akBottom, akRight]
    et ce juste avant la boucle.

    Un passage a akTop/AkLeft (ou autres valuers par defaut) en fin de boucle permet de retablir la situation au cas ou la fiche peut etre agrandie manuelement.

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour Clorish, Gilbert et souch,

    Merci à tous pour vos réponses, elles m'ont toutes servit !

    Par contre, pour les effets shellapi, ils sont plutot orientés pour fermer la fenêtre.
    Que faut il changer pour avoir l'effet inverse ?

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    AnimateWindow(Handle, 200, AW_VER_POSITIVE or AW_HIDE);
    Suffit de remplace AW_HIDE par un equivalent du genre AW__SHOW je suppose

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    AW_SHOW inconnu au bataillon

    Il n'y a que AW_ACTIVATE qui s'en rapproche.... Mais ca ne génère aucun effet.

    Pas plus que SW_SHOW, ni de mettre un and, ni que de ne rien mettre.

    En plus, l'aide de Delphi ne connait pas cette fonction.

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Aie, je rencontre un autre genre de pb.

    En fait, j'aimerais, que lorsque je clique sur un élement de cette fenetre, ca la ferme et en lance une autre.

    Seulement, l'autre fenetre se lance mais la première reste toujours fermée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TfrmGammes.lbGammesClick(Sender: TObject);
    begin
       frm2 := Tfrm2.Create(Self);
       Self.Close;
    end;
    ca me parait logique, mais je ne sais pas comment faire pour gérer ce comportement.
    Pas un thread, j'espère... Je sais à peu près ce que c'est mais je ne les maitrise pas.

    Faut-il que je poste un autre sujet ?

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    "AW_SHOW inconnu au bataillon" : Exact.

    "AW_ACTIVATE" : Merci, et en plus il convient bien dans le .FormShow() où effectivement l'appariton de la Form était quasi-instantanée même avec 20000 millisec.

    Voiçi ce qui a marché chez moi (sous D5/Win98) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TForm1.FormShow(Sender: TObject);
    begin     AnimateWindow(Handle, 20000, SW_MAX or AW_ACTIVATE );
                // tu pourras réduire la durée après essai
               // J'ai pas testé les autres possibilités du type AW_CENTER or AW_ACTIVATE ); mais cela devrait marcher également.
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin     AnimateWindow(Handle, 200000, SW_MAX or AW_HIDE);
    end;

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    je comprends pas trop ce que tu veux faire ....
    Mais deja, faire un TFrom.Create n'est pas toujours conseillé, surtout que delphi a tendance a ajouter lui meme le code de creation lors de l'ajout d'une nouvelle fiche

    Sinon pour relancer le thread, je te conseilel de cliquer sur "reslolut" afin de le desactiver

  11. #11
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    En gros, j'aimerais faire le close() avant de lancer ma form... Ce n'est pas possible, mais dans l'idée, c'est ca.

    Comment fait tu pour ne pas faire de create ?
    Tu met toutes tes fiches dans "Fiches créées automatiquement" du projet et pour les appeler tu fait show(), c'est ça ?

    C'est ce que je faisait avant, mais on m'a dit que ce n'était pas propre...
    Ca prennait du temps au démarrage de l'appli et plus de place en mémoire.

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Juste pour faire remonter la discution, vu que les 3 messages précédents ont pratiqment été écrits en même temps.

  13. #13
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Effectivement, je gere mes fiches actuelement pas "Application.FormCreate" au lancement.
    Mais j'en ai peu voir une seule ..... c'est pour ca aussi

    sinon c'est effectivement une solution.

    Donc si j'ai bien compris, ce que tu veux c'est que la premiere se ferme et ensuite l'autre s'ouvre c'est ca ?

    Si tu veux separer l'execution des 2 fenetres, un thread n'est pas necessaire mais un timer activé avec un interval tres court peut faire l'affaire.
    Ca a l'avantage ed laisser sortir l'execution de la procedure donc d'executer le close, et un peu plus tard, dans le OnTimer du timer executer le Create suivi d'un Timer.Enable a false pour eviter qu'elle se reecree tout le temps

    Il existe d'autres solutions plus ou moins "correctes" mais ca depends de ce que tu veux faire exactement et la maniere dont c'est codé.

  14. #14
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ca me surprenait, qu'une fois que la form soit détruite, le timer qui y est attaché continue son boulot.

    J'ai essayé, mais en effet, ca ne marche pas (timer à 200).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        ...
        tmrGammes.Enabled := true;
        Self.Close;
        ....
     
    procedure TfrmGammes.tmrGammesTimer(Sender: TObject);
    begin
      frm2 := Tfrm2.Create(Self);
      tmrGammes.Enabled := false;
    end;
    Mais je me demandais si une form peut renvoyer une valeur...
    De cette manière, je lancerais la 2ème fenetre a partir de la form mère (celle qui a lancé la 1ère... Juste après).

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    haaaaa mais en effet, le timer ne doit pas etre dans le form qui est detruite .....

    Sinon une form peut renvoyer "plein" de valuers
    C'est le principe des gestionaires d'evenements

    Tu peux lancer le timer dans le onClose .....
    ou creer un evenement special "OnQueryOpenForm" qui lui declanchera le timer .....

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bon, j'ai défini "ret: Integer;" dans "Public" que j'affecte avant le close.
    Et en effet, dans la mère j'arrive à récupérer la valeur.

    Est-ce la solution la plus convenable ?

  17. #17
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    non je ne pense pas trop
    mais si ca marche c'est plutot un bon debut

    Penche toi un peu plus sur des tutos de creations de property et des gestionaires d'evenemnts
    Ca te donneras de meilleurs idees

  18. #18
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bon, j'ai scruté la page de tutoriaux Delphi de developpez.com, mais, malgré tes mots clé, je n'ai rien trouvé qui répondait à mon cas de figure.

    Je pense que ca doit être dans le close, ou le destroy, un truc comme ca.
    Je verrais bien une surcharge de destroy pour lui mettre une valeur de retour (tout comme on surcharge create pour lui mettre des parametres), mais là, c'est trop hazardeux, pour attaquer sans didacticiel.

    Un indice supplémentaire... Un lien, c'est possible ?

  19. #19
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    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
     
    TSendTextEvent = procedure (Sender : TObject; AText : String) of Object;
     
    TMonOjb = class(...)
    Private
      FOnSendText = TSendTextEvent;
    Protected
      Procedure DoSendText(Str : String);
    Published
      Property OnSendText : String Read FOnSendText Write FOnSendText;
    End;
     
    Procedure TMonObj.DoSendText(Str : String);
    Begin
    If Assigned(Self.FOnSendText) Then Self.FOnSendText(Self, Str);
    End;
    Utilisation :
    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
     
    TUnObjet = CLass(...)
    Private
      Procedure ObjSendTExt(Sender : TObject; ATExt : String);
    End;
     
    Procedure TUnObjet.UneFonctionQuelconque;
    Begin
    Self.Obj.OnSendText := Self.ObjSendText; //Obj de type TMonObj
    End;
     
    Procedure TUnObjet.ObjSendText(Sender : TObject; ATExt : String);
    Begin
    // Traintement de AText
    End;
    Tu trouvera certaines ressemblence avec les evenements "OnClick" et autres

    C'ets un usage particulier des property .....

  20. #20
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ouf, il m'a fallut te relire plusieurs fois pour bien comprendre en quoi ca consistait.... Et encore, j'ai des doutes.

    En clair, dans ma fonction mère, pour l'instant, je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      frm1 := Tfrm1.Create(Self);
      frm1.ShowModal;
      if (frm1.ret>0) then
        frm1 := Tfrm1.Create(Self);
    Ce que toi tu me dit consisterait à créer une méthode en plus dans la mère et de passer la valeur dans une variable globale pour la récupérer dans ma fonction... C'est bien ça ?

    Ca me parait plutot acrobatique.
    Ce que j'avais en tête ressemblait plus à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      frm1 := Tfrm1.Create(Self);
      myRet:=frm1.ShowModal;
      if (myRet>0) then
        frm1 := Tfrm1.Create(Self);
    Envoyer une valeur de retour en fermant la form, quoi.
    Ce n'est pas possible ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Lancer un form avec une taille réduite
    Par Attila54 dans le forum VB.NET
    Réponses: 19
    Dernier message: 31/10/2013, 13h30
  2. Réponses: 10
    Dernier message: 31/01/2010, 12h45
  3. Tabulation dans une form avec entrée
    Par Cl@rk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/05/2008, 13h09
  4. [Winform][C#]Comment lancer une forme à partir du menu
    Par rb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/06/2005, 18h01
  5. [FLASH MX2004] Lancer une anim avec des paramètres ??
    Par gchanteux dans le forum Flash
    Réponses: 4
    Dernier message: 23/03/2005, 18h49

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