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 :

Taille d'un TtabSheet


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut Taille d'un TtabSheet
    Bonjour tout le monde,


    Comment peut-on récupérer la taille d'un TTabSheet d'un TPageControl ?

    Je souhaite placer une TPanel à droite du dernier TTabsheet connu.


    Ce TPanel comprends une iumage qui me servira lors d'un clic dessus de créer dynamiquement un autre tabsheet, donc ensuite se Tpanel ce déplace d'un TTabsheet.

    voilà ce que je fait actuellement

    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
     
     
    // Fonction developpez.com
    function TForm1.GetDroppedIndex(X, Y: Integer): Integer;
    var
      HitTestInfo: TTCHitTestInfo;
    begin
      HitTestInfo.pt := Point(X,Y);
      {Utilisation de l'API Windows SendMessage, avec envoi d'un message
      TCM_HITTEST au TPageControl. Le résultat de la fonction
      nous donne l'index de l'onglet "visé" par la souris.}
      result := SendMessage(PageControl1.Handle, TCM_HITTEST, 0, Longint(@HitTestInfo));
    end;
     
    procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    //  Edit1.Text := 'X : '+inttostr(X);
    //  Edit2.Text := 'Y : '+inttostr(Y);
    //  Edit3.Text := 'Num Tab = '+ inttostr(GetDroppedIndex(X,Y));
     
      if GetDroppedIndex(X,Y) = PageControl1.PageCount - 1 then
      begin
     
        image2.Parent := Spanel1;
        image2.Align := alClient;
     
        sPanel1.Left := ??
        sPanel1.top := ??
      end;
    end;

    Merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Par défaut
    Hello.

    1/ Pour le composant TPageControl tu mets la prop CustomDraw de l'inspecteur comme étant True.

    2/ Ensuite tu assignes un evenement 'OnDrawTab', de manière classique , en double cliquant sur l'item dans l'inspecteur d'évenement

    3/ Tu obtiens qqch comme
    procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
    begin
    end;
    A partir du paramètre Control, l'autocompletion te permet d'atteindre Control.Canvas .Dans ce cas précis control.Canvas représente la surface de ton tab (c'est à dire le titre, par vraiment la sheet, plutôt le tab), sur laquelle il serait possible de mettre le control 'new tab'.

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    Si je comprends bien tu veux un comportement comme ff ou chrome pour l'ajout d'onglet par un onglet avec un signe "+".

    perso, plutot que de placer un panel, j'ajouterai une page au TPageControl. Cette page étant toujours la dernière tu peux détecter sur l'évènement OnChange du pageControl que l'utilisateur vient de cliquer dessus donc faire les traitements d'ajout d'une nouvelle page. Je ne sais pas si il est possible de base d'avoir une image pour remplacer le dessin standard de l'onglet mais il me semble qu'en mettant le ownerDraw du TPageControl à true il est possible de redéfinir l'évènement OnDrawTab et donc de faire un pageControl avec des onglets personnalisés... Cette méthode me semblerait plus simple que de passer par des panels et le placement est fait automatiquement puisque tu obtient un TRect en paramètre de OnDrawTab.

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    Si je comprends bien tu veux un comportement comme ff ou chrome pour l'ajout d'onglet par un onglet avec un signe "+".

    .....
    C'est exactement cela, alors depuis dans premier poste j'ai oublié de dire que je ne souhaite pas justement utilise le OnDrawTab du TPageControl parcque j'utilise un composant spécifique qui dessine déjà dessus et je ne veux pas perdre ce décor.

    Alors comme tu le souligne, (mettre un tab vide) c'est la dessus que je me dirige, je vais faire apparaitre un icone sur le tab sheet vide, ensuite au clique sur l'icone je le fait disparaitre au profis d'un titre sur le tab et j'ajoute encore un vide etc....

    Je vais voir si sur le onchange si c'est mieux car il faut quand meme que je sache sur quel onglet je clique.

    Merci à vous deux.

  5. #5
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut Buzz

    Quelque chose comme ça ?
    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
    procedure TForm1.PageControl1Change(Sender: TObject);
    var
      NewTabSheet: TTabSheet;
    begin
      with Sender as TPageControl do
      begin
        if ActivePageIndex = PageCount - 1 then
        begin
          // Ajout d'un nouvel onglet
          NewTabSheet := TTabSheet.Create(TPageControl(Sender));
          with NewTabSheet do
          begin
            PageControl := TPageControl(Sender);
            Caption := 'NewTab';
            PageIndex := PageCount - 2;
          end;
          ActivePage := NewTabSheet;
        end;
      end;
    end;
    @+

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Salut le Claude

    Super ta technique, et je t'avoue avoir fait un copier coller sur mon projet Evidement j'y est ajouteé ma sauce, car pendant la création de mon tab sheet il faut que je lui assigne une dizaine de composants (edit, memo, combobox etC..) mais là tout va bien.

    Avec ta proposition je vais plutot afficher un Hint sur PageCount-1 qu'une image.

    J'ai une dernière question, lorsque je ferme le form avec tous ces tabsheets autocréer et les composants egalement autocréer dois-je faire quelquechose de spéciale pour la mémoire ? ou le simple fait de fermer la form (qui sera en showmodal autocréer aussi) cela liberera bien la mémoire ?

    Merci.

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Je vous remercie pour votre aide.


    @Claudius

    @ AndNotOr

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

Discussions similaires

  1. Connaitre la taille de la RAM
    Par dway dans le forum Assembleur
    Réponses: 23
    Dernier message: 15/09/2004, 10h05
  2. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  3. Réponses: 3
    Dernier message: 22/07/2002, 14h19
  4. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 12h06
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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