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 :

Onglet contenant une boite d'édition, ma classe TTabContener


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut Onglet contenant une boite d'édition, ma classe TTabContener
    Bonjour,

    je souhaite faire un éditeur avec un système d'ouverture multi-onglet.
    Je développe donc une classe TTabContener dérivé de TTabSheet.

    Voici son unité :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    unit TabContener;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, ComCtrls, SynEdit, Dialogs;
     
    type
      { Notre onglet.
        Il est de type TTabContener, descendant de TTabSheet et muni d'une propriété Editor
        de type TSynEdit qui va stocké le TSynEdit correspondant. Elle est aussi muni d'une propriété
        Data de type TObject pour plus de flexibilité, une propriété Chemin qui stocke le chemin du
        fichier et les méthodes d'ouverture/enregistrement.
      }
     
      { Descendant de TTabSheet }
      TTabContener = class(ttabsheet)
      private
        { Champ permettant de stocker n'importe quel objet }
        fData: TObject;
        { Champ qui stocke notre SynEdit }
        fEditor: TSynEdit;
        { Champ qui renseigne le chemin d'accès du fichier en cours }
        fChemin: TFileName;
     
        { Méthodes d'accès privées aux propriétés }
        function GetData : TObject;
        function GetEditor : TSynEdit;
        procedure SetData(aValue: TObject);
        procedure SetEditor(aValue: TSynEdit);
     
        procedure Nettoyer();
      public
        { Méthodes d'entrées/sorties publiques }
        procedure OuvrirFichierDans(pChemin: TFileName);
        procedure SauverContenuSous(pChemin: TFileName);
        procedure SauverContenu();
     
        property Chemin: TFileName read fChemin write fChemin;
        property Data: TObject read GetData write SetData;
        property Editor: TSynEdit read GetEditor write SetEditor;
      end;
     
    implementation
     
    resourcestring
       SFileNotFound = 'Le fichier n''existe pas.';
       SDoYouErase   = 'Le fichier existe déjà. Voulez-vous l''écraser ?';
     
    function TTabContener.GetData : TObject;
    begin
      Result := fData;
    end;
     
    procedure TTabContener.SetData(aValue: TObject);
    begin
      if aValue <> fData then
        fData := aValue;
    end;
     
    function TTabContener.GetEditor: TSynEdit;
    begin
      Result := fEditor;
    end;
     
    procedure TTabContener.SetEditor(aValue: TSynEdit);
    begin
      if aValue <> fEditor then
        fEditor := aValue;
    end;
     
    procedure TTabContener.Nettoyer();
    begin
      fEditor.Lines.Clear;
    end;
     
    procedure TTabContener.OuvrirFichierDans(pChemin: TFileName);
    begin
      Chemin:=pChemin;
      Nettoyer();
      if FileExists(pChemin) then
        Editor.Lines.LoadFromFile(pChemin)
      else
        Editor.Lines.Add(SFileNotFound);
    end;
     
    procedure TTabContener.SauverContenuSous(pChemin: TFileName);
    begin
      if FileExists(pChemin) then
        if MessageDlg(SDoYouErase, mtConfirmation, [mbYES, mbNO], 0) = mrYes then
           Editor.Lines.SaveToFile(pChemin);
    end;
     
    procedure TTabContener.SauverContenu();
    begin
      if not FileExists(Chemin) then
        SauverContenuSous(Chemin)
      else
        Editor.Lines.SaveToFile(Chemin);
    end;
     
    end.
    Bon dans mon programme j'ai une procedure AjouterTab qui rajoute un TTabContener dans le TPageControl de la page. Elle stocke les onglets dans la variable ListeOnglet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      var
        ListeOnglet: TList;
    en fait on stocke les pointeurs sur les onglets. Voici l'implementation de ma fonction AjouterTab:

    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
    function TmainForm.AjouterTab(ACaption: string): pointer;
    var
      NewTabSheet: TTabContener;
      NewSynEdit:  TSynEdit;
    begin
      { On crée l'onglet }
      NewTabSheet:=TTabContener.Create(self);
      with NewTabSheet do
      begin
        { On la place dans la page PageGlobale de type TPageControl }
        PageControl:=PageGlobale;
        { On assigne le paramètre ACaption qui désigne le titre de l'onglet à l'onglet. }
        Caption:=ACaption;
      end;
      { On crée le synedit }
      NewSynEdit:=TSynEdit.Create(self);
      with NewSynEdit do
      begin
        { On la place dans notre onglet }
        Parent:=NewTabSheet;
        { On lui fait prendre toute la place ;) }
        Align:=alClient;
     }
      end;
      NewTabSheet.Data:=NewSynEdit;
      { On retourne le pointeur qui désigne notre onglet nouvellement crée. }
      Result:=@NewTabSheet;
    end;
    comme vous le voyez dans l'unité j'ai fait une procedure OuvrirFicherDans donc dans mon programme je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TmainForm.aFileOpenAccept(Sender: TObject);
    var
      OngletCree: TTabContener;
    begin
      ListeOnglet.Add(AjouterTab(
         ExtractFileName(aFileOpen.Dialog.Filename)));
     
      OngletCree:=TTabContener(ListeOnglet.Items[(ListeOnglet.Count)-1]^);
      OngletCree.OuvrirFichierDans(aFileOpen.Dialog.FileName);
     
    end;
    Mais pour une raison bizarroïde il me met "Image icône incorrecte" j'utilise les PngComponents mais ca a rien à voir l'erreur survient à la ligne Editor.Lines.LoadFromFile(pChemin);

  2. #2
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Bonjour,

    Bel effort d'explication !
    Tu mets du code et du code mais pas tout le code ?

    Du coup il faut extrapoler pour comprendre où tu veux en venir.
    Ou alors celui-ci est faux !
    En effet je ne vois pas ta méthode de surcharge du create qui te permettrait d'instancier ton éditeur ?

    Tu créer ton éditeur dans "TmainForm.AjouterTab" mais tu ne fais pas le lien entre Data et feditor ?

    Un objet ne devrait-il pas être autonome ?

    a+

  3. #3
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut
    Salut,

    Bel effort d'explication !
    Tu mets du code et du code mais pas tout le code ?
    Bah je vais pas non plus mettre tout mon projet dans ce post.
    Je me suis souvent fait envoyer chier parce que j'avais mis tout mon code dans un post du coup je sais pu ou me mettre ?

    Bon pour en revenir au code, oui j'ai merder je sais pas fce que j'ai foutu, si je met ça c'est bon ?

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    unit TabContener;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, ComCtrls, SynEdit, Dialogs;
     
    type
      { Notre onglet.
        Il est de type TTabContener, descendant de TTabSheet et muni d'une propriété Editor
        de type TSynEdit qui va stocké le TSynEdit correspondant. Elle est aussi muni d'une propriété
        Data de type TObject pour plus de flexibilité, une propriété Chemin qui stocke le chemin du
        fichier et les méthodes d'ouverture/enregistrement.
      }
     
      { Descendant de TTabSheet }
      TTabContener = class(ttabsheet)
      private
        { Champ permettant de stocker n'importe quel objet }
        fData: TObject;
        { Champ qui stocke notre SynEdit }
        fEditor: TSynEdit;
        { Champ qui renseigne le chemin d'accès du fichier en cours }
        fChemin: TFileName;
     
        { Méthodes d'accès privées aux propriétés }
        function GetData : TObject;
        function GetEditor : TSynEdit;
        procedure SetData(aValue: TObject);
        procedure SetEditor(aValue: TSynEdit);
     
        procedure Nettoyer();
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy;
        { Méthodes d'entrées/sorties publiques }
        procedure OuvrirFichierDans(pChemin: TFileName);
        procedure SauverContenuSous(pChemin: TFileName);
        procedure SauverContenu();
     
        property Chemin: TFileName read fChemin write fChemin;
        property Data: TObject read GetData write SetData;
        property Editor: TSynEdit read GetEditor write SetEditor;
      end;
     
    implementation
     
    resourcestring
       SFileNotFound = 'Le fichier n''existe pas.';
       SDoYouErase   = 'Le fichier existe déjà. Voulez-vous l''écraser ?';
     
    function TTabContener.GetData : TObject;
    begin
      Result := fData;
    end;
     
    procedure TTabContener.SetData(aValue: TObject);
    begin
      if aValue <> fData then
        fData := aValue;
    end;
     
    function TTabContener.GetEditor: TSynEdit;
    begin
      Result := fEditor;
    end;
     
    procedure TTabContener.SetEditor(aValue: TSynEdit);
    begin
      if aValue <> fEditor then
        fEditor := aValue;
    end;
     
    procedure TTabContener.Nettoyer();
    begin
      fEditor.Lines.Clear;
    end;
     
    procedure TTabContener.OuvrirFichierDans(pChemin: TFileName);
    begin
      Chemin:=pChemin;
      Nettoyer();
      if FileExists(pChemin) then
        Editor.Lines.LoadFromFile(pChemin)
      else
        Editor.Lines.Add(SFileNotFound);
    end;
     
    procedure TTabContener.SauverContenuSous(pChemin: TFileName);
    begin
      if FileExists(pChemin) then
        if MessageDlg(SDoYouErase, mtConfirmation, [mbYES, mbNO], 0) = mrYes then
           Editor.Lines.SaveToFile(pChemin);
    end;
     
    procedure TTabContener.SauverContenu();
    begin
      if not FileExists(Chemin) then
        SauverContenuSous(Chemin)
      else
        Editor.Lines.SaveToFile(Chemin);
    end;
     
    constructor TTabContener.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      fEditor:=TSynEdit.Create(Self);
     
      with fEditor do
      begin
        Parent:=Self;
        Align:=alClient;
      end;
    end;
     
    destructor TTabContener.Destroy;
    begin
      FreeAndNil(fData);
      fEditor.Free;
    end;
     
    end.

Discussions similaires

  1. Mettre en place une boite a onglet
    Par pyoan- dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/12/2012, 14h21
  2. Réponses: 3
    Dernier message: 03/01/2009, 18h43
  3. Réponses: 2
    Dernier message: 24/10/2008, 15h50
  4. Réponses: 1
    Dernier message: 15/06/2007, 19h37
  5. Onglet contenant une JTable scrollable et un panel
    Par xtaZy dans le forum Composants
    Réponses: 3
    Dernier message: 06/03/2007, 20h40

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