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 :

[Frame] : création, libération


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut [Frame] : création, libération
    Bonjour,

    Je me prends pas mal la tete avec les frames. Je vais tenter de simplifier le pb.

    J'ai un formulaire principal FPrincipal.
    J'ai créé plusieurs frames de la même classe FrModele.

    Depuis mon formulaire FPrincipal, j'appel correctement chaque frame dans un conteneur TPanel.

    j'ai une variable publiée FMyFrame d'instance de classe FrModele;

    J'ai une procédure AfficherEcran
    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 TFPrincipal.AfficherEcran;
    begin
    try
      FreeAndNil(FMyFrame);
      if FMyEcran='FrEcran1' then FMyFrame := TFrmEcran1.Create(self);
      if FMyEcran='FrCreationfiche' then FMyFrame := TFrmCreationfiche.Create(self);
      if FMyEcran='FrListeParticipants' then FMyFrame := TFrmListeParticipants.Create(self);
      if FMyEcran='FrMajFiche' then FMyFrame := TFrmMajFiche.Create(self);
      if FMyEcran='FrMajAdresse' then FMyFrame := TFrmMajAdresse.Create(self);
      if FMyEcran='FrMajContacts' then FMyFrame := TFrmMajContacts.Create(self);
      if FMyEcran='FrMajSuperviseur' then FMyFrame := TFrmMajSuperviseur.Create(self);
      if FMyEcran='FrMajCatalogue' then FMyFrame := TFrmMajCatalogue.Create(self);
      FMyFrame.Parent := PanelFrame;
      FMyFrame.Afficher;
    except
        on E: Exception do MessageDlg('Contacter l''administrateur  :'#13#10+E.Message,mtError,[mbOk],0);
    end;
    end;
    Depuis les boutons de ma barre d'outils j'appel simplement ma procédure AfficherEcran comme suit

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFPrincipal.CreateFQClick(Sender: TObject);
    begin
      FMyEcran:='FrCreationfiche';
      AfficherEcran;
    end;
    Jusque là c'est pas bien compliqué, je vous l'accorde.

    ce qui se corse désormais c'est que je voudrai depuis une frame chargée pouvoir appeler une autre frame.

    pour cela je voudrai pouvoir le faire en appelant directement les procédures de mon formulaire FPrincipal.

    par exemple

    Evénement OnClick d'un bouton posé sur une de mes frames, j'appelle directement :

    TFPrincipal.CreateFQClick(sender);
    En faisant ainsi, cela fonctionne 1 fois et la 2nde je me mange un AccessViolation dans la tronche.

    Comment pourrais je réaliser ce que je souhaite facilement ?
    l'objectif étant de pouvoir facilement passer d'une frame à une autre en fonction d'une personnalisation de l'utilisateur.

    Merci de vos lumières

    @

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Je n'ai pas bien compris ton histoire d'appel, mais je suppose que tu as simplement affecté CreateFQClick au OnClick d'un bouton, car l'exemple d'appel que tu as fourni contient une erreur sur l'utilisation de méthodes de classes ...

    Sinon ... je n'utilises jamais les Frames, on peut faire exactement la même chose avec des Form, en changeant juste le BorderStyle à bsNone ...

    Ensuite, normalement, tes classes sont enregistrées, ce qui est nécessaire pour le mécanisme de flux via DFM ... (un RegisterClass peut être fait au cas où)

    et dans ce cas tu pourrais écrire simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FMyEcranClass := GetClass('T'+FMyEcran); 
    if Assigned(FMyEcranClass ) then
      FMyFrame := FMyEcranClass.Create(self);
    voir encore plus simple créer un Type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFrModeleClass = class of FrModele;
    et déclarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FMyEcran: TFrModeleClass;
    et l'utiliser comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Assigned(FMyEcran) then
      FMyFrame :=  FMyEcran.Create(self);
    l'avantage, tu peux ajouter autant de frame, tu n'auras que peu de code à maintenir, au lieu d'une cascade de if ...

    pour l'Appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFPrincipal.CreateFQClick(Sender: TObject);
    begin
      FMyEcran:= TFrCreationfiche; // Directement la class ... c'est plus "classe" qu'une chaine, et moins exposé aux erreurs ...
      AfficherEcran;
    end;
    En fin, essaye d'ajouter ceci avant le FreeAndNil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Assigned(FMyFrame) then
      FMyFrame.Parent := nil;

    Pour répondre à ton problème, si tu appeles toujours AfficherEcran, la variable FMyFrame va contenir la dernière Frame créée ... le problème est que si tu appels une frame depuis une autre, tu vas perdre la première ... tu peux donc essayer d'utiliser une TObjectList que tu te servira comme une FILO (First In Last Out), qui te serviras de pile, ou tu déposeras une fiche avec un Add, que tu récupérera avec un Last (il existe je crois) et que tu retira avec un Delete(Count -1) jusqu'à ce que count = 0

    et Sinon, tu oublies ton Système de Frame, et tu utilise du MDI, et cela donnera à mon avis globalement le même aspect en bénéficiant de quelques variables qui fournissent les MDIChild (je n'ai pas Delphi pour confirmé)

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/02/2007, 14h56
  2. Réponses: 5
    Dernier message: 19/12/2006, 11h32
  3. Création de frame depuis des Dll de classes
    Par ogasse dans le forum Delphi
    Réponses: 2
    Dernier message: 31/08/2006, 12h51
  4. TAdvTabsheet, création dynamique de frame
    Par gmc dans le forum Delphi
    Réponses: 2
    Dernier message: 24/08/2006, 09h37
  5. création frame
    Par Bilouzzz dans le forum MFC
    Réponses: 4
    Dernier message: 22/09/2005, 03h42

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