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 :

Main Form pour programme multiform


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut Main Form pour programme multiform
    Salut a tous

    Je suis en train de développer une application de tchat sur réseau local. L'application est composée de 2 fiches, une fiche "accueil" et une fiche "client". La premiere fiche permet de se logger et de vérifier si le serveur permet la connection. Elle s'apparente à la fenetre de connection de MSN. La deuxième fiche permet l'envoi et la réception de messages ... Les deux fenetres ne peuvent pas être affichées en meme temps. En premier s'affiche la fiche accueil, puis quand on clique sur connecter, la fiche client s'affiche, et l'autre se masque. Quand je clique sur déconnecter, l'accueil s'affiche et l'autre se masque.

    Mon probleme est le suivant : je voudrais que la fiche affichée se comporte comme si elle était la "MainForm" : c'est a dire que si on la réduit, elle se réduise, et que quand on la restaure, elle se restaure.

    J'ai commencé par mettre la fiche "accueil" en fiche principale : j'affiche la deuxieme fiche en Show, et je masque la premiere. Sauf que si je réduit la fiche "Client", l'application n'est pas réduite ! En fait, il reste toujours la fiche "Accueil", mais invisible ...

    J'aimerais aussi que la fiche Client ne soit pas créée au démarrage ... Donc je ne peux pas la définir comme fiche principale.

    Enfin, j'ai trouvé une technique qui permet de changer la propriété MainForm qui est pourtant en lecture seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure SetAsMainForm(aForm:TForm);
    var
      P:Pointer;
    begin
      P := @Application.Mainform;
      Pointer(P^) := aForm;
    end;
    Avec ca, ca marche a peu près, mais je récupere des "Erreurs abstraites" qui me semblent liées à ca ...

    Ma question est la suivante : comment faire une application avec 2 fiches, donc chacune se comporte comme si elle était la mainform ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    N'utilise pas CreateFom dans le DPR pour créer la fenêtre d'accueil ...
    ensuite tu as forcément une seule mainForm, mais tu peux faire en sorte que lorsque l'on ferme la seconde cela ferme l'appli aussi, ou inversement, tu peux faire en sorte que tant que la seconde n'est pas fermé, tenter de fermer la principal ne fait que la réduire ...

    tu peux aussi avoir un mainForm "invisible", et les deux fenêtre secondaires
    Voir SetWindowLong pour cacher les fenêtres ...
    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 chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Merci pour cette réponse, mais il y a plusieurs problèmes a cela :
    ensuite tu as forcément une seule mainForm, mais tu peux faire en sorte que lorsque l'on ferme la seconde cela ferme l'appli aussi, ou inversement, tu peux faire en sorte que tant que la seconde n'est pas fermé, tenter de fermer la principal ne fait que la réduire ...
    Je ne veux pas récupérer l'évenement OnClose, car ca, ca ne me pose pas de problemes. Le truc, c'est que j'aimerais récupérer l'évenement OnMinimize de la Form qui n'est pas principale. Or, cette form n'a pas d'évenement OnMinimize ... De plus, l'évenement OnHide ne fonctionne pas, et OnDesactivate ne fonctionne pas si la form principale n'est pas visible .

    tu peux aussi avoir un mainForm "invisible", et les deux fenêtre secondaires
    Voir SetWindowLong pour cacher les fenêtres ...
    J'y avais aussi pensé, mais il reste le meme probleme : comme la form principale est invisible, il n'y a pas d'évenement OnMinimize associé aux forms secondaires ...

    Je n'ai pas réussi à utiliser correctement SetWindowLong. F1 ne reconnait pas, et sur internet, c'est pas bavard. Pour cacher la fenetre, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FClient.Hide;
    FClient.Visible:=False;
    ShowWindow(FClient,SW_HIDE);
    Mais rien n'y fait, je suis toujours incapable de récuperer l'évenement OnMinimize de la form secondaire.

    Quelle form me conseillerais tu de mettre en principale ? Sachant que l'accueil doit être affichée en premier, et que la fiche client sera le plus souvent celle utilisée ...

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je te conseille de mettre la fenêtre de chat en principal, et le login en secondaire. à priori le login est obligatoire, il peut être affiché par un ShowModal au lancement non ?

    cela peut aussi être la même fenêtre qui contient deux panels ou deux cadres
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    cela peut aussi être la même fenêtre qui contient deux panels ou deux cadres
    +1

    Je ne verrais qu'un fiche principale affichant alternativement 2 frames.

    @+ Claudius

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Pas mal, je pensais que cette solution n'était pas élégante ... Mais comme vous pensez ca, j'y songerai plus tard

    Pour l'instant, je pense choisir la solution de Paul, celle du ShowModal ... J'avoue ne pas avoir pensé a ca ... Bien vu. Le seul hic, c'est que ma form client sera créée au démarrage ... Tant pis ...

    J'en profite, avant le résolu : Quelle différence entre Form2.Close, Form2.Free et Form2.Destroy ? Sachant que Form2 est une form secondaire ?

    En tout cas, Merci a tous

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Pas mal, je pensais que cette solution n'était pas élégante ... Mais comme vous pensez ca, j'y songerai plus tard

    Pour l'instant, je pense choisir la solution de Paul, celle du ShowModal ... J'avoue ne pas avoir pensé a ca ... Bien vu. Le seul hic, c'est que ma form client sera créée au démarrage ... Tant pis ...

    J'en profite, avant le résolu : Quelle différence entre Form2.Close, Form2.Free et Form2.Destroy ? Sachant que Form2 est une form secondaire ?

    En tout cas, Merci a tous
    Form2.Close ferme la fiche...ça passe par OnCloseQuery, OnClose et la fiche ne sera détruite que si Action vaut caFree.

    Form2.Destroy est la destruction de l'objet

    Form2.Free c'est la même chose sauf que l'objet test que Self <> nil avant d'appeler Destroy (c'est le cas de tous les objets Delphi, pas simplement des fiches)

    Ceci dit, une fiche se détruit normalement par Form2.Release
    la différence est que c'est la seule méthode que l'on peut invoquer sans problème depuis une méthode de Form2...le cas typique est le bouton "close" qui détruit la fiche sur laquelle il est assis
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Close c'est la fermeture visuel de la Form
    Close appelle Hide ou Release (un Free différé) selon les actions du OnClose

    Free c'est la méthode de libération dîte protégée qui appelle Destroy (c'est aussi une méthode non virtuelle, ce qui a un intérêt tout particulier, son adresse relative est ainsi toujours la même pour n'importe quel objet)

    Destroy c'est le destructeur, son utilisation doit être uniquement dans le cadre d'un héritage et d'une surcharge du destructeur
    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
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Ok, Merci pour vos éclaircissement ....

    J'ai un autre probleme. Si j'appelle la Form Accueil en showmodal pendant le FormCreate de FClient, elle se met automatiquement comme MainForm, alors qu'en conception, j'ai bien réglé sur FClient...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFClient.FormCreate(Sender: TObject);
    begin
      Application.CreateForm(TFAccueil, FAccueil);
      FAccueil.ShowModal;
      ShowMessage(Application.MainForm.Caption);
    end;
    Me retourne FAccueil ... Vous auriez une solution pour ca ? L'avantage de mettre le showmodal dans le formCreate, c'est que le Fclient n'est pas affiché pendant ce temps ...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 692
    Points : 13 122
    Points
    13 122
    Par défaut
    OnCreate survient pendant le processus de création, MainForm n'a pas encore été assigné ! TFAccueil est la première finalisée, donc celle choisie par Application.

    Cet appel devrait résoudre ton problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFClient.FormCreate(Sender: TObject);
    begin
      FAccueil := TFAccueil.Create(Self); 
    end;
    Ou alors, tu détruit FAccueil AVANT de sortir de OnCreate.

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Merci de ta réponse Andnotor Problème résolu !

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

Discussions similaires

  1. Les outils que vous utilisez pour programmer en assembleur
    Par Smortex dans le forum x86 32-bits / 64-bits
    Réponses: 36
    Dernier message: 15/08/2022, 11h28
  2. Réponses: 5
    Dernier message: 27/10/2009, 09h29
  3. Réponses: 3
    Dernier message: 27/08/2003, 21h14
  4. cle pour programme
    Par mumu2001 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 04/11/2002, 10h34

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