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] Perdu avec TFrame


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut [D7] Perdu avec TFrame
    bonjour,

    j'ai une application développée qui fonctionne actuellement avec des onglets.
    c'est un vrai bordel, car tout tient dans une seule page, ce qui était parfait au début, mais le projet grossissant, ça le fait plus du tout.

    je pensais donc créé une page principale avec un menu permettant de modifier le contenu de ma page.
    je pensais donc que je devais créer un TForm (Acceuil.pas) dans lequel je mettrais un TFrame dont le contenu changerait en fonction, du menu choisit.
    je créerais ensuite plusieurs TFrame (en gros, un par onglet actuel).

    je ne sais pas comment je dois m'y prendre.
    je n'ai pas trouvé de bon tutos. quelqu'un saurait-il me conseiller ?

    merci d'avance.
    ben
    Dernière modification par Roland Chastain ; 20/09/2014 à 14h39. Motif: retouché le titre (majuscule)

  2. #2
    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 430
    Points
    28 430
    Par défaut
    Bonjour,

    tu places le contenu de chaque onglet dans un TFrame par un couper/coller et tu déportes le code associé dans la frame. Dès lors tu peux réinjecter le tout dans l'onglet.

    avantage: visuellement aucune différence
    inconvénient: la dispersion du code rend les choses parfois un peu compliqué (comment utiliser depuis Frame1 un composant dans Frame2)...NB: il est possible de conserver le code dans la fiche principale en associant par exemple Frame1.Button1.OnClick à Form1Button1Click()

    maintenant il est aussi possible de ne pas charger les frame dans l'IDE mais sur le OnChange des onglets, quand un onglet s'affiche - si le frame correspondant n'est pas déjà chargé - tu le crées dynamiquement et le place en enfant de l'onglet.

    Remarque: les frames permettent d'éclater une fiche, mais la même frame peut aussi être insérée dans différentes fiches, dès lors son code ne doit pas présupposer de la fiche dans laquelle il se trouve (ni de la présence de Frame2 dans cette fiche par exemple)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Invité
    Invité(e)
    Par défaut
    en fait, l'application évolue, je vais donc utiliser des menus pour revoir et améliorer la navigation dans l'appli, je ne vais donc pas conserver les onglets.
    sinon, effectivement, j'aurais inséré le contenu des onglets dans des frames.

    je fais des tests pour trouver la bonne structure.
    j'ai donc créé un form acceuil avec mon menu dans laquelle vont venir mes différentes frames.

    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
    procedure TForm1.mnPageClick(Sender: TObject);
    var
      precedent: TFrame;
    begin
     
      if Sender = ActMajPage1 then
        contenu := TPage1.Create(Self)
      else if Sender = ActMajPage2 then
        contenu := TPage2.Create(Self)
      else
        contenu := TAcceuil.Create(Self);
     
      contenu.Parent := Self;
    end;
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
      with TAcceuil.Create(Self) do Parent := Self;
    end;
    ce n'est pas bon.
    je pense que je dois supprimer la frame présente dans le Form, avant d'en ajouter une nouvelle, mais je ne sais pas comment faire, 'contenu.destroy;' ne fonctionne pas.

    si je comprends bien, on ajoute un nouveau composant du type de la frame que l'on affiche dans le form en faisant
    Parent := Self;

  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 430
    Points
    28 430
    Par défaut
    alors petite remarque au passage, dans ce mode de fonctionnement les Frame peuvent tout aussi bien être des Form sans bordure, ça ne change rien puiqu'il n'est pas question de les intégrer via l'IDE...et la frame n'ayant pas certains événements ou propriétés de TForm ça peut être nécessaire.

    ensuite je te recommande de faire les choses plus proprement

    sur chaque menuitem te définie un Tag

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;
     
    type
      TFrameClass = class of TFrame;
     
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Frames1: TMenuItem;
        Frame11: TMenuItem;
        Frame21: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure MenuItemClick(Sender: TObject);
      private
        { Déclarations privées }
        FFrame: TFrame;
      public
        { Déclarations publiques }
        procedure SetFrame(AFrame: TFrameClass);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
     
    uses Unit2, Unit3;
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetFrame(TFrame2);
    end;
     
    procedure TForm1.SetFrame(AFrame: TFrameClass);
    begin
      if FFrame <> nil then
      begin
        if FFrame is AFrame then
          Exit;
        FFrame.Free;
      end;
      FFrame := AFrame.Create(Self);
      FFrame.Parent := Self;
    end;
     
    procedure TForm1.MenuItemClick(Sender: TObject);
    begin
      case TMenuItem(Sender).Tag of
        1: SetFrame(TFrame2);
        2: SetFrame(TFrame3);
      end;
    end;
     
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Invité
    Invité(e)
    Par défaut
    merci beaucoup, c'est exactement ce que je cherchais !

    je vais tester ça et je te redis

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Une petite parenthèse : on écrit accueil, comme recueil, écueil, etc.

    Et éventuellement on peut éviter d'écrire b***l.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Une petite parenthèse : on écrit accueil
    zut ! j'ai oublié de corrigé, car je fais souvent la faute, mais oublié de corrigé

    en tout cas ça fonctionne parfaitement, merci beaucoup !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    alors petite remarque au passage, dans ce mode de fonctionnement les Frame peuvent tout aussi bien être des Form sans bordure, ça ne change rien puiqu'il n'est pas question de les intégrer via l'IDE...et la frame n'ayant pas certains événements ou propriétés de TForm ça peut être nécessaire.
    dis-moi, pour info, cela fonctionne parfaitement avec les frames, mais suite à ta remarque j'ai voulu tester avec des forms.
    j'ai donc ajouté la fonction SetForm(AForm: TFormClass)

    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
    78
    79
    80
    81
    82
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;
     
    type
      TFrameClass = class of TFrame;
      TFormClass  = class of TForm;
     
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Frames1: TMenuItem;
        Frame11: TMenuItem;
        Frame21: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure MenuItemClick(Sender: TObject);
      private
        { Déclarations privées }
        FFrame: TFrame;
        FForm : TForm;
      public
        { Déclarations publiques }
        procedure SetFrame(AFrame: TFrameClass);
        procedure SetForm (AForm : TFormClass );
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
     
    uses Unit2, Unit3, Unit5;
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetFrame(TFrame2);
    end;
     
    procedure TForm1.SetFrame(AFrame: TFrameClass);
    begin
      if FFrame <> nil then
      begin
        if FFrame is AFrame then
          Exit;
        FFrame.Free;
      end;
      if FForm <> nil then
        FForm.Free;
      FFrame := AFrame.Create(Self);
      FFrame.Parent := Self;
    end;
     
    procedure TForm1.SetForm(AForm: TFormClass);
    begin
     
      if FFrame <> nil then
        FFrame.Free;
      if FForm <> nil then
      begin
        if FForm is AForm then
          Exit;
        FForm.Free;
      end;
      FForm := AForm.Create(Self);
      FForm.Parent := Self;
    end;
     
    procedure TForm1.MenuItemClick(Sender: TObject);
    begin
      case TMenuItem(Sender).Tag of
        1: SetFrame(TFrame2);
        2: SetFrame(TFrame3);
        3: SetForm (TForm5 );
      end;
    end;
     
    end.
    il n'y a pas d'erreurs à la compilation, mais le form ne s'insère pas donc ma page...
    savez-vous se qui ne va pas ?

    merci de votre aide

  9. #9
    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 430
    Points
    28 430
    Par défaut
    la propriété Visible de la fiche doit être à False
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Invité
    Invité(e)
    Par défaut
    merci beaucoup de ton aide.


    effectivement, c'était juste ça, il suffisait de mettre BorderStyle à bsNone.

    par contre, il ne faut mettre soit que des Frames, soit que des Forms, on ne peut pas avoir les 2 ?

  11. #11
    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 430
    Points
    28 430
    Par défaut
    si il suffit de prendre un ancêtre commun et en laissant Visible à False sur la fiche tu évites de l'avoir à l'écran avant d'être incluse dans le parent

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;
     
    type
      TChildClass = class of TScrollingWinControl;
     
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Frames1: TMenuItem;
        Frame31: TMenuItem;
        Form21: TMenuItem;
        procedure Form21Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        FChild: TWinControl;
      public
        { Déclarations publiques }
        procedure SetChild(AChild: TChildClass);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses Unit2, Unit3;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetChild(TFrame3);
    end;
     
    procedure TForm1.Form21Click(Sender: TObject);
    begin
      case TMenuItem(Sender).Tag of
        1: SetChild(TFrame3);
        2: SetChild(TForm2);
      end;
    end;
     
    procedure TForm1.SetChild(Achild: TChildClass);
    begin
      if FChild <> nil then
      begin
        if FChild is AChild then
          Exit;
        FChild.Free;
      end;
      FChild := AChild.Create(Self);
      if FChild is TForm then
        TForm(FChild).BorderStyle := bsNone;
      FChild.Align := alClient;
      FChild.Parent := Self;
      FChild.Visible := True;
    end;
     
     
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Invité
    Invité(e)
    Par défaut
    ok, super, je vais tester ça.

    merci beaucoup de ton aide !!

  13. #13
    Invité
    Invité(e)
    Par défaut
    je confirme que cela fonctionne nickel !
    merci encore

  14. #14
    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 430
    Points
    28 430
    Par défaut
    dans un très vieux projet (Delphi 2 je pense) j'avais voulu reproduire le fonctionnement du web, j'utilisais ce mécanisme mais au lieu de détruire la précédente frame, elle était placée dans un TList et une fonction HistoryBack() me permettait de revenir dessus

    il faut dire qu'à l'époque j'avais travaillé intensivement sur AS/400 pendant 2 ans et que j'aimais bien l'idée des applications mono fenêtrées avec historique de navigation
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [C# ado.NET] perdu avec les datarelations
    Par tatayet_le_felee dans le forum Accès aux données
    Réponses: 9
    Dernier message: 12/06/2007, 14h09
  2. Complètement perdu avec le graphisme
    Par olympecomm dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 12/09/2006, 11h28
  3. [ODBC] Je suis perdu avec ODBC
    Par Nowhere dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 19/05/2006, 08h50
  4. Un peu perdu avec sql server!
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2005, 13h14
  5. Perdu avec la communication avec le port serie
    Par gilles641 dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2005, 20h11

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