2009-08-17 9 views
14

Je me demandais pourquoi Delphi (2007) fournit trois widgets qui semblent faire la même chose, et quels sont les avantages/inconvénients de chacun.TTabSet vs TTabControl vs TPageCtrl/TTabSheet?

Sur le même sujet, si je veux afficher différents ensembles de contrôles, pourquoi devrais-je favoriser eg. PageControl + TabSheets + cadres, au lieu de simplement afficher des cadres différents directement sur le formulaire parent?

Merci.

Répondre

23

De l'helpfile sur TTabSet:

commandes de réglage Tab sont couramment utilisés pour affichage à onglets pages dans une boîte de dialogue . TTabSet est fourni pour la compatibilité arrière . Utilisez le composant TTabControl dans les applications Windows 32 bits .

Donc la vraie question est, quelle est la différence entre TTabControl et TPageControl? La différence est que TTabControl n'a qu'une seule "page", alors que TPageControl a une page pour chaque onglet. Cela les rend utiles dans différentes situations. TPAGEControl est utile pour les boîtes de dialogue dans lesquelles vous voulez insérer plus d'IU à l'écran que vous n'avez d'espace dans l'écran. Organisez votre interface utilisateur en catégories et placez chaque catégorie sur une seule page. Vous voyez beaucoup ce modèle dans les boîtes de dialogue Options, par exemple. D'autre part, TTabControl fonctionne bien pour travailler sur un tableau/une liste d'objets.

Créez une interface utilisateur pour afficher et modifier les propriétés d'un seul objet, placez-le sur un TTabControl, puis créez un onglet pour chaque objet et configurez les gestionnaires d'événements pour charger un nouvel objet du tableau dans les contrôles à chaque fois que vous changer d'onglet. En ce qui concerne la question sur les trames, la principale raison d'utiliser un TPageControl en conjonction avec des trames est qu'il fournit un moyen prédéfini pour décider de l'image à afficher. De cette façon, vous n'avez pas à réinventer un mécanisme pour cela.

+0

Merci Jim. Donc un TTabControl est une solution préférée lors du remplissage d'un onglet avec des objets lors de l'exécution, alors qu'un PageControl + TabSheets + Frames est une meilleure option lors de la configuration de l'interface utilisateur au moment de la conception? – Gulbahar

+2

Non. TTabControl est la solution préférée lors de la modification des propriétés d'une liste d'objets du même type, car la modification des onglets ne modifie pas les contrôles que vous voyez, mais uniquement l'index des onglets. Un contrôle de page permet de mettre plus d'une page de contrôles différents sur un formulaire à la fois. (Et Jim n'a pas écrit cette réponse, je l'ai fait, il a fait un montage.) –

+0

Merci Mason, c'est logique. Pour mon utilisation, il ressemble à un PageControl + quelques feuilles de tabulation, chacune tenant un cadre est la solution préférée pour ce que j'ai besoin de faire. – Gulbahar

5

Une méthode que j'ai utilisée avec beaucoup de succès consiste à utiliser des trames avec un TPageControl et à lier tard mes trames à tPageControl la première fois que la page est sélectionnée. Cela permet de réduire le temps de chargement du formulaire, en ne créant pas de cadres qui ne sont jamais visualisés, mais en permettant la flexibilité d'être créé, l'état est maintenu lors du changement entre les onglets. Récemment, je suis passé à l'utilisation de formulaires et à leur intégration au lieu de cadres ... mais le concept est le même. La même chose peut être faite en utilisant un seul "point de montage" sur un TTabControl et en l'éteignant quand l'onglet est changé, mais ensuite la question de savoir comment traiter l'état de tabulation lorsque les onglets sont inversés est également affichée.

[EDIT] La question se pose de savoir comment gérer la communication entre la trame et la forme parente. C'est en fait très facile à faire en utilisant des interfaces. Il suffit de créer une nouvelle unité qui sera partagée par la forme et le cadre et ajouter deux interfaces:

type 
    IFormInterface = interface 
    [guid] 
    procedure FormProc; 
    end; 

    IFrameInterface = interface 
    [guid] 
    procedure SetFormController(Intf:IFormInterface); 
    end; 

ont la forme de la mise en œuvre IFormInterface, et le cadre de la mise en œuvre IFrameInterface.Lorsque vous cliquez sur un onglet et d'afficher un cadre, puis exécutez le code comme suit:

var 
    FrameIntf : IFrameInterface; 
begin 
    if Supports(FrameObj,IFrameINterface,FrameIntf) then 
    FrameIntf.SetFormController(Self); 
end; 

votre mise en œuvre du cadre de la méthode de SetFormController convoquaient sur la référence passée, ce qui lui permettrait d'appeler vers le haut dans la forme .

procedure TFrame1.SetFormController(Intf:IFormInterface); 
begin 
    fFormController := Intf; 
end; 

Procedure TFrame1.Destroy; override; 
begin 
    fFormController := nil; // release the reference 
    inherited; 
end; 

Procedure TFrame1.Button1Click(Sender:tObject); 
begin 
    if fFormController <> nil then 
    fFormController.FormProc 
    else 
    Raise Exception.Create('Form controller not set'); 
end; 
+0

Merci pour le conseil. Lorsque vous avez utilisé un PageControl et plusieurs images, comment avez-vous vérifié dans le formulaire parent quel bouton a été cliqué dans quel cadre? – Gulbahar