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

Langage Delphi Discussion :

Instanciation d'une classe fille depuis une classe mère


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut Instanciation d'une classe fille depuis une classe mère
    Bonjour, je suis nouveau dans ce forum.
    J'expose mon problème: je développe une application BDD dont l'interface est au style firefox par exemple, donc il y a des frames qui constituent les fiches en question et dont le parent est affecté à un PageControl dont les tabs sont masqués.

    l'invocation de chaque fiche (frame dans ce cas) est situé dans un TAction, l'appel est du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TfrmListeEmployes.CreatePage(MainPC, Action1, nil);
    où CreatePage est une méthode de classe que j'ai créé dans la classe de base des frames nommée TBaseFrame dont le source est le suivant:
    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
    unit U_BaseFrame;
     
    interface
     
    uses
    	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    	Dialogs, ActnList, ComCtrls, dxBar;
     
    type
     
    	TDerivedPageControl= class(TPageControl);
     
    	TBaseFrame = class(TFrame)
    	private
    	 fFrameCreated: Boolean;
    	 fCaption: String;
    	 fIsMultiInstance: Boolean;
    	 procedure SetCaption(Val: String);
    	 procedure SetIsMultiInstance(Val: Boolean);
    	public
    	 constructor Create(AOwner: TComponent); override;
    	 destructor Destroy; override;
    	 //
    	 class procedure CreatePage(AOwnerPageControl: TPageControl; LinkAction: TAction; BarApplicationMenu: TdxBarApplicationMenu); virtual;
    	 //
    	 property Caption: String read fCaption write SetCaption;
    	 property IsMultiInstance: Boolean read fIsMultiInstance write SetIsMultiInstance;
    	end;
     
    implementation
     
    {$R *.dfm}
    var
    		NewFrame: TBaseFrame;
     
    class procedure TBaseFrame.CreatePage;
    var NewTabSheet: TTabSheet;
    begin
     if Assigned(NewFrame) then
    	begin
    	 AOwnerPageControl.ActivePageIndex:= LinkAction.Tag; // Page déjà ouverte !
    	 TDerivedPageControl(AOwnerPageControl).Change;
    	 Abort
    	end;
     if LinkAction= nil then
    	Abort;
     try
    	Screen.Cursor:= crHourGlass;
    	NewFrame:= TBaseFrame.Create(AOwnerPageControl.ActivePage);
     
    	NewTabSheet:= TTabSheet.Create(AOwnerPageControl);
    	with NewTabSheet do
    	 begin
    		TabVisible:= false;
    		PageControl:= AOwnerPageControl;
    		with PageControl do
    		 begin
    			ActivePage:= NewTabSheet;
    			ActivePage.Hide;
    			NewFrame.Parent:= ActivePage;
    			ActivePage.Caption:= NewFrame.Caption;
    			NewTabSheet.Update;
    			ActivePage.Show;
    			LinkAction.Tag:= ActivePageIndex;
    			TDerivedPageControl(AOwnerPageControl).Change;
    			//
    			if Assigned(BarApplicationMenu) then
    			 with BarApplicationMenu.ExtraPane.Items.Add do
    				Text:= Caption
    		 end
    	 end;
     finally
    	 Screen.Cursor:= crDefault
     end
    end;
     
    procedure TBaseFrame.SetIsMultiInstance;
    begin
     fIsMultiInstance:= Val
    end;
     
    procedure TBaseFrame.SetCaption;
    begin
     fCaption:= Val
    end;
     
    constructor TBaseFrame.Create(AOwner: TComponent);
    begin
     SetIsMultiInstance(false);
     SetCaption('Page vide');
     fFrameCreated:= true;
     inherited Create(AOwner)
    end;
     
    destructor TBaseFrame.Destroy;
    begin
     fFrameCreated:= false;
     inherited Destroy
    end;
     
    end.
    TfrmListeEmployes est une classe qui hérite de la classe de base TBaseFrame du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TfrmListeEmployes= class(TBaseFrame)
    ...
    ..
    .
    end;
    bien sur j'ajoute les composants spécifique que je veux dans chaque classe héritant de TBaseFrame. le problème que j'ai est dans l'appel de la fonction CreatePage(...), elle me crée toujour une instance de la classe de base TBaseFrame, ce qui est logique en fonction de la façon dont je l'ai codée.
    Si vous avez une idée comment faire pour rendre cette fonction valide pour chaque classe qui hérite de la classe de base TBaseFrame, c.a.d modifier cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewFrame:= TBaseFrame.Create(AOwnerPageControl.ActivePage);
    de la fonction CreatePage par une autre dont j'arrive pas à la faire, j'ai pensé à utiliser RegisterClass et FindClass mas j'ai pas abouti au résultat voulu!

    du help S.V.P
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 789
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 789
    Points : 13 449
    Points
    13 449
    Par défaut
    Dans une méthode de classe, Self représente la classe. Donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NewFrame := Self.Create(AOwnerPageControl.ActivePage);
    //ou simplement
    NewFrame := Create(AOwnerPageControl.ActivePage);

  3. #3
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    effectivement vous avez raison, c'est bête quand même de m'échapper.
    Merci.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/06/2010, 13h19
  2. [MySQL] Listing des entrées d'une table fille depuis listing table mère
    Par Romain_33 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/05/2009, 00h48
  3. [Doxygen]Commenter une fonction héritée depuis la classe fille
    Par khazna dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 31/01/2009, 14h20
  4. Accèder à une classe fille depuis la classe mère
    Par Phreak0x dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/10/2008, 10h14
  5. Comment récupérer la classe window d'une application wpf depuis une application ext
    Par rsiwpf dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 14/10/2008, 15h10

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