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 :

Test Assigned() et mise à nil d'une instance.


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Test Assigned() et mise à nil d'une instance.
    Salut à tous.
    J'ai une fiche principale avec une pagecontrol . Mes autres fiches s'affiche dans les tabsheet du pagecontrol comme 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
     
    var tab : TTabSheet;
    begin
      tab :=  frmMain.GetMDITab('tabDocList');
      if tab = nil then
      begin
        Tab := TTabSheet.Create(Self);
        with Tab do
        begin
          Name        := 'tabDocList';
          Caption     := '';
          PageControl := frmMain.pageList;
          TabVisible  := True;
          Caption     := 'Liste des documents';
        end;
        if Not Assigned(DocList) then
        begin
          DocList := TfrmDocList.Create(Tab);
          With DocList do
          begin
            Parent      := Tab;
            Align       := alClient;
            Show;
          end
        end;
      end;
    J'ai aussi un bouton calé sur la partie supérieur du pagecontrole qui me sert à supprimer le tabsheet courant par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        pageList.ActivePage.Free;
    La première fois que j'affiche la fiche dans un onglet, ça marche bien.
    Dès que ferme le tabsheet via le bouton, et que je re affiche de nouveau, le Assigned(DocList) n'est pas valable et j'ai une erreur dès le show.
    Comment faire ?

    Merci

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 758
    Points : 13 357
    Points
    13 357
    Par défaut
    Pas d'autre possibilité que d'ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pageList.ActivePage.Free;
    DocList := nil;
    Mais comme tu as fait (et si DocList est utilisé ailleurs), tu pourras créer plusieurs TabSheet, mais seul le premier aura une page affichée...

    Tu devrais te passer de cette variable et accéder directement à la fiche par un TfrmDocList(PageControl1.ActivePage.Controls[0]).

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Effectivement l'onglet contenant doclist ne doit se créer qu'une et une seule fois, elle affiche la liste des documents actifs.
    Je tente de simuler une appliquation MDI en utilisant une pagecontrole.
    Par contre je fais comme ceci pour l'affichage des mes autres fiches filles :
    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
     
    procedure TDmData.AfficherDetailDoc(aDocNumber : Integer);
    var
      tab : TTabSheet;
    begin
      tab :=  frmMain.GetMDITab(aDoCNumber);
      if tab = nil then
      begin
        Tab := TTabSheet.Create(Self);
        with Tab do
        begin
          Name        := Format('tabDocEdit%d',[aDocNumber]);
          Caption     := '';
          PageControl := frmMain.pageList;
          TabVisible  := True;
          Caption     := Format('Recette %d',[aDocNumber]);
          Tag         := aDocNumber;
        end;
        begin
          With TfrmDocEdit.Create(Tab) do
          begin
            Parent      := Tab;
            NumDoc  := aDocNumber;
            Show;
          end
        end;
      end;
      frmMain.pageList.ActivePage := tab;
      frmMain.hdrInfo.Sections[1].Text  := Format('Document  %d',[aDocNumber]);
    Ici les 2 fonctions overloadés de GetMDITab
    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
     
    function TfrmMain.GetMDITab(aTabName: String): TTabSheet;
    var
      i   : Integer;
    begin
      Result := Nil;
      If pageList.PageCount > 0 then
      begin
        for i:= 0 to pageList.PageCount -1 do
        begin
          if pageList.Pages[i].Name = aTabName then
            Result := pageList.Pages[i];
        end
      end;
    end;
     
    function TfrmMain.GetMDITab(aTabTag: Integer): TTabSheet;
    var
      i   : Integer;
    begin
      Result := Nil;
      If pageList.PageCount > 0 then
      begin
        for i:= 0 to pageList.PageCount -1 do
        begin
          if pageList.Pages[i].Tag = aTabTag then
            Result := pageList.Pages[i];
        end
      end;
    end;
    Le souci est que le Free de la tabsheet provoque la destruction de la fiche de type TfrmDocEdit. Or dans la procedure AfficherDetailDoc effectue une instanciation dynamique sans utiliser une variable. Quand est il du pointeur sur TfrmDocEdit vu qu'il faut soit même le mettre à nil à la destruction. Est ce qu'il n'y aurait pas une fuite de mémoire.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 758
    Points : 13 357
    Points
    13 357
    Par défaut
    TfrmDocEdit n'est pas une variable, mais une classe. Tu n'as pas à t'en occuper.

    Et même dans ton premier post, la variable DocList sera toujours là. Qu'elle pointe sur une adresse valide ou non (nil).

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Mais le With TFrmDocEdit.Create(Owner) ne crée t-il pas un variable de type TFrmDocEdit ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 758
    Points : 13 357
    Points
    13 357
    Par défaut
    Oui et non

    Non, il alloue seulement les ressources nécessaires en mémoire. Tu n'est pas obligé d'avoir une variable pointant dessus.

    Oui, puisque tu lui assignes un propriétaire. Il apparaitra dans sa propriété Controls. Et c'est pour cela que tu n'as pas besoin de t'occuper de sa destruction.

    Je sais pas si je me fais bien comprendre .

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Chef oui chef

    Merci Andnotor

Discussions similaires

  1. [2.x] Méthode de mise à jour d'une instance par un formulaire.
    Par Procyon dans le forum Symfony
    Réponses: 3
    Dernier message: 19/05/2013, 12h23
  2. [Jena] Mise à jour d'une instance
    Par megaloplex dans le forum Frameworks
    Réponses: 5
    Dernier message: 02/09/2011, 23h01
  3. Réponses: 1
    Dernier message: 10/01/2007, 12h04
  4. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  5. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01

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