2009-09-15 15 views
5

Je développe une application MDI qui attribue un onglet pour chaque enfant MDI créé. Je dois "attraper" les événements OnActivate, OnCreate et OnDestroy du formulaire enfant dans le code de formulaire principal (parent). Il est impossible pour moi d'appeler le code sous forme d'enfants, car il existe de nombreuses classes utilisées comme enfants MDI, le plugin peut aussi charger son propre formulaire ...Delphi MDI - gestion ouvrir/fermer/activer le formulaire enfant

Alors, ma question est: comment attraper ça? Le formulaire enfant MDI a été activé/désactivé sans utiliser les événements de formulaire enfant?

Répondre

3

J'ai écrit un type de composant de la barre des tâches il y a quelques années pour faire ce genre de chose. Il s'appelle TrmMDITaskbar. Vous pouvez en trouver une copie sur Torrys, cela fait partie du paquet de la bibliothèque rmControls. Il gère l'activation, la minimisation, la maximisation, etc.

L'essentiel de la façon dont cela fonctionne est qu'il accroche la poignée de la fenêtre MDIParents à la recherche d'événements MDIChild et fait des choses basées sur ces événements.

Si vous cherchez à écrire votre propre, je dirais que c'est un bon point de départ.

Ryan.

P.S. La version sur Torrys est un peu plus ancienne mais devrait encore fonctionner. J'ai une version plus récente disponible sur mon site Web de support. (Mills Enterprise)

+0

merci. enfin je l'ai résolu en utilisant le code de SpTBXLib qui utilise le drapeau WH_CBT ... :) – migajek

+0

salut ryan, je vais essayer ce composant mais le site de support me donne une Erreur 403 - Interdit (Vous avez essayé d'accéder à un document pour lequel vous n'avez pas de privilèges.) –

+0

@Alin Sfetcu, J'ai récemment changé mon service d'hébergement et je n'ai pas encore réinstallé tous mes liens et forums. Pour dire la vérité, je pensais que j'avais déjà les forums de support fonctionnant. Je vais regarder dans ce ASAP. Désolé pour le goof. Comme je l'ai dit, la copie du site de Torry devrait toujours fonctionner. –

1

Vous pouvez toujours accrocher les événements "après coup" à partir de votre code lors de l'exécution. Fondamentalement créer un OnActivate générique qui ressemble à ceci:

type 
    TEventHolder = class 
    private 
    FSFActivate: TNotifyEvent; 
    published 
    property SavedFormActivate : TNotifyEvent 
     read FSFActivate write fSFActivate; 
    end; 

type 
    TMainForm = class(Tform) 
    : 
    SavedEvents : tStringList; 
    procedure ChildFormActivate(Sender: TObject); 
    procedure InitChildForm(MdiForm:TForm); 
    end; 

procedure TMainForm.ChildFormActivate(Sender: TObject); 
var 
    i : integer; 
begin 
    // your special processing here this is called for the child form. 
    i := SavedEvents.IndexOf(ClassName); 
    if i <> -1 then 
    tEventHolder(SavedEvents.Objects[i]).SavedFormActivate(Sender); 
end; 

procedure TMainForm.InitChildForm(MdiForm:TForm); 
var 
    OrigEvents : TEventHolder; 
begin 
    if not Assigned(SavedEvents) then 
    SavedEvents := tSTringlist.create; 
    if Assigned(MdiForm.OnActivate) then 
    begin 
     OrigEvents := tEventHolder.create; 
     OrigEvents.SavedFormActivate := MdiForm.OnActivate; 
     SavedEvents.AddObject(MdiForm.ClassName,OrigEvents); 
    end; 
    MdiForm.OnActivate := ChildFormActivate; 
end; 

Ensuite, appelez le InitChildForm pour définir les gestionnaires d'événements à vos versions génériques à un moment donné dans votre programme (droit le plus probable après avoir créé le formulaire). Bien sûr, lors de la fermeture du formulaire principal, vous voulez libérer les SavedEvents (et les objets liés).