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

Composants VCL Delphi Discussion :

[D6] Gérer dynamiquement des TTabSheet avec des TSynEdit dedans


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut [D6] Gérer dynamiquement des TTabSheet avec des TSynEdit dedans
    Bonjour,

    bon voila je fais une sorte de mini Notepad mais améliorer avec des onglets pour chaque fichier.

    Je stocke chaque TTabSheet dans un TList (la variable ListeOnglet).
    J'arrive à gérer dynamiquement les onglets eux-mêmes mais comme je veux y incorporer à chacun un TSynEdit, je sais pas coment je peut faire pour gérer dynamiquement le TSynEdit qui se trouve dans chaque onglet.

    En faisant monTTabSheet^.EditeurOnglet sachant que j'ai fait Name:='EditeurOnglet' dans la fonction AjouterTab ca marche pas je peut pas accéder à mon SynEdit de cette façon. J'ai chercher il semble pas y avoir d'attribut Child ou un truc du genre.

    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    unit UnitMain;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ToolWin, ImgList, PngImageList, StdActns, ActnList,
      XPMenu, Menus, SynEdit;
     
    type
      TmainForm = class(TForm)
        ListeImages: TPngImageList; // Liste d'image
     
        { Action Manager et toutes les actions standards }
        Actions: TActionList;
     
        aEditCut: TEditCut;
        aEditCopy: TEditCopy;
        aEditPaste: TEditPaste;
        aEditSelectAll: TEditSelectAll;
        aEditDelete: TEditDelete;
        aFileSaveAs: TFileSaveAs;
        aFileExit: TFileExit;
        aFileNew: TAction;
        aFileOpen: TFileOpen;
        aFileClose: TAction;
        { ... }
     
        { Contrôle du menu et éléments du menu }
        MenuPrincipal: TMainMenu;
     
        mNouveau: TMenuItem;
        mFichier: TMenuItem;
        mOuvrir: TMenuItem;
        mSauver: TMenuItem;
        mSauverSous: TMenuItem;
        mFermer: TMenuItem;
        mFermerTout: TMenuItem;
        mQuitter: TMenuItem;
        mEdition: TMenuItem;
        mCouper: TMenuItem;
        mCopier: TMenuItem;
        mColler: TMenuItem;
        mSepb: TMenuItem;
        mSupprimer: TMenuItem;
        mToutSelect: TMenuItem;
        mSepa: TMenuItem;
        { ... }
     
        BarreStatus: TStatusBar;    // Contrôle de la barre de status
        PageGlobale: TPageControl;  // Contrôle du conteneur d'onglets
        OuvrirBoite: TOpenDialog;   // Boîte de dialogue "Ouvrir ..."
        SauverBoite: TSaveDialog;
        aFileSave: TAction;   // Boîte de dialogue "Sauvegarder ..."
     
        procedure FormCreate(Sender: TObject);
     
        { Evenements des actions }
        procedure aFileNewExecute(Sender: TObject);
        procedure aFileOpenAccept(Sender: TObject);
        procedure aFileSaveExecute(Sender: TObject);
        procedure aFileSaveAsAccept(Sender: TObject);
     
        { Fin déclaration contrôles }
      private
        ListeOnglet: TList;
        ListeChemin: TStringList;
        DocumentCreer: Integer;
      public
        function AjouterTab(ACaption: string; Fichier: PChar): pointer;
      end;
     
    var
      mainForm: TmainForm;
     
    implementation
     
    {$R *.dfm}
    {$R WindowsXp.res}
     
    function TmainForm.AjouterTab(ACaption: string; Fichier: PChar): pointer;
    var
      NewTabSheet: TTabSheet;
      NewSynEdit: TSynEdit;
    begin
      NewTabSheet:=TTabSheet.Create(self);
      with NewTabSheet do
      begin
        PageControl:=PageGlobale;
        Caption:=ACaption;
      end;
      NewSynEdit:=TSynEdit.Create(NewTabSheet);
      with NewSynEdit do
      begin
        Parent:=NewTabSheet;
        Align:=alClient;
        Name:='EditeurOnglet';
        if (Fichier <> nil) then
          Lines.LoadFromFile(Fichier);
      end;
      Result:=@NewTabSheet;
    end;
     
    { *** }
     
    procedure TmainForm.aFileNewExecute(Sender: TObject);
    begin
      ListeOnglet.Add(  AjouterTab(  Format('(Sans titre %d)', [DocumentCreer]), nil  ));
      Inc(DocumentCreer);
      ListeChemin.Add( '' );
    end;
     
    procedure TmainForm.FormCreate(Sender: TObject);
    begin
      ListeChemin:=TStringList.Create;
      ListeOnglet:=TList.Create;
      DocumentCreer:=1;
      aFileNew.Execute;
    end;
     
    procedure TmainForm.aFileOpenAccept(Sender: TObject);
    begin
      ListeOnglet.Add(AjouterTab(
         ExtractFileName(aFileOpen.Dialog.Filename), PChar(aFileOpen.Dialog.Filename)));
      ListeChemin.Add( aFileOpen.Dialog.Filename );
    end;
     
    procedure TmainForm.aFileSaveExecute(Sender: TObject);
    var
      CheminActif: String;
    begin
      CheminActif:=ListeChemin.Strings[(PageGlobale.ActivePageIndex)];
      if not FileExists(CheminActif) or (CheminActif = '') then
        ShowMessage('Fichier non enr.');//aFileSaveAs.Execute;
    end;
     
    procedure TmainForm.aFileSaveAsAccept(Sender: TObject);
    begin
      TTabSheet(ListeOnglet.Items[(PageGlobale.ActivePageIndex)]^).Child
    end;
     
    end.
    Merci pour vos réponse

  2. #2
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut Re:
    Tien ceci devrais t'aider http://developpez.net/forums/showthread.php?t=237571 sinon cherche sur le forum je suis sur qu'il y'a ce que tu cherche
    cordialement @+

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

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Bon j'ai lu le post, et il répond à pas mal de mes question. Le dernier message de big m'intéresse, est-ce que tu as testé son code ?

    Je penserai faire soit un TFrame qui contienne le synedit plus d'autres composants si y a besoin soit je crée un descendant de TTabSheet avec une propriété Data de type TObject.

    mais je sais pas trop comment je peux faire le descendant de TTabSheet;

    en admettant que je l'apelle TTabContener, je fais :

    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
    unit TabContener;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, ComCtrls;
     
    type
      TTabContener = class(ttabsheet)
      private
        fData: TObject;
        function GetData : TObject;
        procedure SetData(aValue: TObject);
      public
        property Data: TObject read GetData write SetData;
      end;
     
    implementation
     
    function TTabContener.GetData : TObject;
    begin
      Result := fData;
    end;
     
    procedure TTabContener.SetData(aValue: TObject);
    begin
      if aValue <> fData then
        fData := aValue;
    end;
     
    end.

  4. #4
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    et voici ma fonction AjouterTab que j'ai codé :

    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
    {*
      Cette fonction ajoute un onglet au TPageControl de la fiche
      Le paramètre ACaption spécifie le texte de l'onglet
      Le paramètre Fichier(facultatif), précise le chemin d'accès du fichier qui sera
        ouvert dans le TSynEdit
     
      Le résultat est un pointeur désignant l'adresse mémoire de l'onglet ainsi
        créé, et qui sera stockés dans la liste d'onglet ListOnglet (de type TList)
    *}
    function TmainForm.AjouterTab(ACaption: string; Fichier: PChar): pointer;
    var
      { Notre onglet.
        Il est de type TTabContener, descendant de TTabSheet et muni d'une propriété Data
        de type TObject qui va stocké le TSynEdit correspondant. On aurait pu déclarer la
        propriété Data de type SynEdit mais on gardera TObject pour plus de flexibilité.
      }
      NewTabSheet: TTabContener;
      { Le synedit qui sera incorporé dans notre onglet.
      }
      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;
        { Si l'appelant à préciser le paramètre fichier, on le charge dans le synedit. }
        if (Fichier <> nil) then
          Lines.LoadFromFile(Fichier);
      end;
      { On stocke notre SynEdit dans la nouvelle propriété Data de notre TTabContener.
        On récupèrera notre SynEdit ultérieurement par transtypage en faisant:
               TheSynEdit:=(TSynEdit) as TTabContener.Data;
      }
      NewTabSheet.Data:=NewSynEdit;
      { On retourne le pointeur qui désigne notre onglet nouvellement crée. }
      Result:=@NewTabSheet;
    end;
    Ouais je sais j'ai tendance à surcommenter.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 60
    Points : 54
    Points
    54
    Par défaut
    TSynEdit déclare les procédures HookTextBuffer et UnHookTextBuffer qui permette de switcher d'un buffer à un autre avec seulement une instance de SynEdit.

    Il te suffit de déclarer au préalable pour chaque tab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Buffer:= TSynEditStringList.Create;
    Undo:= TSynEditUndoList.Create;
    Redo:= TSynEditUndoList.Create;
    puis à chaque clique d'une tab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if SynEdit1.Lines <> Buffer then
    begin
      SynEdit1.UnHookTextBuffer();
      SynEdit1.HookTextBuffer( Buffer, Undo, Redo );
    end;

Discussions similaires

  1. Parser un JSON avec des variables avec des "-" et des ":"
    Par Quentin33 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 22/05/2011, 02h04
  2. Réponses: 4
    Dernier message: 02/04/2008, 18h51
  3. Gérer le stock mini avec des alertes
    Par moilou2 dans le forum IHM
    Réponses: 22
    Dernier message: 22/02/2008, 17h10
  4. Réponses: 3
    Dernier message: 16/12/2006, 13h59
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 14h45

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