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 :

[Win32][D7] TPageControl : déplacer un tabsheet [FAQ]


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut [Win32][D7] TPageControl : déplacer un tabsheet
    Salut,

    Dans le cadre d'un développement, je souhaiterais ajouter la possibilité de déplacer un onglet (TTabSheet) par Drag'n'Drop dans mon PageControl ou en d'autres termes, changer la position de l'onglet avec la souris (un peu comme dans FireFox).

    Cependant, je n'arrive pas à utiliser correctement le Drag'n'Drop sur ce composant (la méthode semble différente des autres composants) et cette fonctionnalité ne semble pas être implémenté...

    Pensez-vous que c'est réalisable sans pour autant construire une usine à gaz ?
    Auriez-vous une idée sur la manière de réaliser cela ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Cpt Anderson
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    645
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 645
    Par défaut
    Puis-je te suggerer de mettre 2 boutons à droite avec des flèches <- ->

    Dessus tu fais un truc style

    PageControl1.ActivePage.PageIndex := PageControl1.ActivePage.PageIndex -1 ;
    PageControl1.ActivePage.PageIndex := PageControl1.ActivePage.PageIndex+1 ;

    Attention aux exceptions.

    Sinon pour le Drag & Drop...bonne chance

  3. #3
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    J'y avais songé mais ces boutons existe déjà pour faire défiler les onglets lorsque ceux-ci sont trop nombreux pour tenir dans la largeur du TPageControl

    J'ai peur que l'ajout de boutons supplémentaires porte à confusion pour l'utilisateur.

    merci

  4. #4
    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 : 63
    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
    Bonjour Yobenzen,

    Voici une solution qui pourrait te convenir:
    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
     
    uses ..., CommCtrl;
     
    implementation
    {$R *.dfm}
    // La propriété DragMode du TPageControl est à dmManual
    procedure TForm1.PageControl1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
        TPageControl(Sender).BeginDrag(False);
    end;
    procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
      Accept := Source is TPageControl;
    end;
    procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    begin
      TPageControl(Sender).ActivePage.PageIndex := GetDroppedIndex(X, Y);
      TPageControl(Sender).EndDrag(True);
    end;
    function TForm1.GetDroppedIndex(X, Y: Integer): Integer;
    var
      HitTestInfo: TTCHitTestInfo;
    begin
      HitTestInfo.pt := Point(X,Y);
      result := SendMessage(PageControl1.Handle, TCM_HITTEST, 0, Longint(@HitTestInfo));
    end;
    end.
    Teste ce code et tiens nous au courant.
    @+ Claudius

  5. #5
    Membre éclairé Avatar de Cpt Anderson
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    645
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 645
    Par défaut
    Excellent !

  6. #6
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    Citation Envoyé par Cpt Anderson
    Excellent !
    +1
    chapeau !

    Ca marche impeccable (beaucoup mieux que le bricolage que j'avais fais).

    merci

    on pourrait rajouter cela à la FAQ je pense

  7. #7
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Salut

    Tu peux faire comme ceci par exemple :
    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
    procedure DoTabDragDrop(Sender, Source: TPageControl; X,
      Y: Integer);
    const TCM_GETITEMRECT = $130A;
    var TabRect: TRect;
        i: Integer;
        SourceIndex,TargetIndex:Integer;
        ATabSheet:TTabSheet;
    begin
       if Sender=Source
       then begin
               for i := 0 to Sender.PageCount - 1 do
               begin
                 Sender.Perform(TCM_GETITEMRECT, i, LParam(@TabRect)) ;
                 if PtInRect(TabRect, Point(X, Y)) then
                 begin
                   if Sender.ActivePage.PageIndex <> i then
                     Sender.ActivePage.PageIndex := i;
                   Exit;
                 end;
               end;
            end
       else begin
               SourceIndex:=Source.ActivePage.PageIndex;
               TargetIndex:=-1;
               i:=0;
               while ((i<Sender.PageCount) and  (TargetIndex=-1)) do
               begin
                 Sender.Perform(TCM_GETITEMRECT, i, LParam(@TabRect)) ;
                 if PtInRect(TabRect, Point(X, Y))
                 then begin
                        TargetIndex:=i;
                        if x>((TabRect.Left+TabRect.Right) div 2) then Inc(TargetIndex);
                      end;
                 Inc(i);
               end;
     
                 ATabSheet:=Source.Pages[SourceIndex];
                 ATabSheet.PageControl:=Sender;
                 if TargetIndex<>-1 then ATabSheet.PageIndex:=TargetIndex;
            end;
    end;
     
    procedure TForm1.PageControl1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      if (Sender is TPageControl)
      then (Sender as TPageControl).BeginDrag(False);
    end;
     
    procedure TForm1.PageControl1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    begin
       if (Sender is TPageControl) and (Source is TPageControl) then 
       //utilisation de notre procedure magique
       DoTabDragDrop((Sender as TPageControl), (Source as TPageControl),X,Y);
    end;
     
    procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
       if (Sender is TPageControl) then Accept := True;
    end;

    Ca marche même entre plusieurs TPageControl
    Tout ce que tu as à faire c'est d'implémenter les évènements de ton ou tes PageContrl tel que je l'ai fait ici, avec le même code.

    Bon dev

  8. #8
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    Excellent !

    Faudrait mettre tout cela dans la FAQ Delphi

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/03/2007, 12h16
  2. [TPageControl] Ajouter un tabsheet dynamiquement
    Par qi130 dans le forum Langage
    Réponses: 6
    Dernier message: 29/09/2005, 21h57
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  4. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 13h38
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 14h34

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