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 :

Surcharger la méthode Create du composant TImage


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut Surcharger la méthode Create du composant TImage
    Bonjour,

    J'ai parcouru le forum, lu les tutos sur la POO mais je ne parviens pas à mes fins

    J'ai créé un classe TTable, dérivée de TImage.
    Voici le code :

    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
    unit Table;
     
    interface
    uses Champs,QExtCtrls,Dialogs,SysUtils;
     
    type TabListeChamps = array of TChamps;
     
    type TTable=class(TImage)
     
    private
    nom:string;
    lesChamps:TabListeChamps;
    nbElements:integer;
    indiceCourant:integer;
     
    public
     
     
    procedure setNom(unNom:string);
    function getNom:string;
    procedure AddField(leChamps:TChamps);
    procedure RemoveLastField;
    procedure RemoveAField(intitule:string);
    procedure RemoveAllFields;
    function ListFields:TabListeChamps;
    procedure DrawTable;virtual;abstract;
    constructor Create;
    end;
     
    implementation
     
    constructor TTable.Create;
    begin
    nbElements:=0;
    indiceCourant:=0;
    end;
     
    procedure TTable.RemoveAllFields;
    begin
    nbElements:=0;
    SetLength(lesChamps,nbElements);
    end;
     
    procedure TTable.RemoveAField(intitule:string);
    var
    i,j:integer;
    trouver:boolean;
    begin
    i:=0;
    trouver:=false;
    if (nbElements<>0) then
    begin
    repeat
     //if (i<high(lesChamps)) then
     //i:=i+1;
     if (lesChamps[i].getIntitule = intitule) then
     trouver:=true
     else
     i:=i+1;
    until ((trouver) or (i=high(lesChamps)+1));
     
    if (trouver) then
    begin
    for j:=i to high(lesChamps)-1 do
    lesChamps[i]:=lesChamps[i+1];
    nbElements:=nbElements-1;
    SetLength(lesChamps,nbElements);
    end
    else
    ShowMessage('L''élément à supprimer n''existe pas');
    end
    else
    ShowMessage('Aucun champs présent pour cette entité');
    end;
     
    function TTable.ListFields:TabListeChamps;
    begin
    result:=lesChamps;
    end;
     
    end.
    Ensuite, viens 2 classes enfants à TTable qui TEntite et TRelation.

    Voici la déclaration d'une d'entre elles :

    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
    unit Entite;
     
    interface
     
    uses QExtCtrls,Dialogs,SysUtils,Table;
     
    type TEntite=class(TTable)
     
    public
    procedure DrawTable;override;
     
    end;
     
    implementation
     
    uses UPrincipale;
     
    procedure TEntite.DrawTable;
    begin
    ShowMessage('Essai de la méthode');
    end;
     
    end.
    Je ne sais pas comment déclarer le create pour :
    - dans la classe TTable, je puisse initialiser des valeurs
    - dans mes classes dérivée de TTable, pourvoir avoir le create de la classe TTable tout en y ajoutant du code supplémentaire.

    J'espère que vous pourrai m'éclairer car entre override, overload, inherited etc ... je commence a m'emmélé les pinceaux :

    Si je comprends bien :
    - override surcharge une méthode avec des paramètres supplémentaires
    - overload permet de redéfinir entièrement une méthode (cela veut-il dire que l'on reprends une méthode et qu'on "la vide" ?)
    - inherited permet d'appelant une méthode d'un parent.

    Merci de votre aide
    Cordialement Ero-Sennin

  2. #2
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    bonjour,

    Citation Envoyé par ero-sennin
    J'ai créé un classe TTable
    Horreur, ce nom existe déjà !

    Citation Envoyé par ero-sennin
    Je ne sais pas comment déclarer le create pour :
    - dans la classe TTable, je puisse initialiser des valeurs
    comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor TTable.Create;
    begin
      // Appel la création de l'objet dont il hérite
      inherited; 
      
      // initialisation :
      nbElements:=0;    
      indiceCourant:=0;
    end;
    Citation Envoyé par ero-sennin
    - dans mes classes dérivée de TTable, pourvoir avoir le create de la classe TTable tout en y ajoutant du code supplémentaire.
    Que dire de plus, voir au dessus.

    a+

  3. #3
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Sur le principe :

    Surcharger une méthode de classe, c'est ajouter un traitement avant ou apres le traitement de la classe parente...

    En gros ton Timage à son create, qui fait plein de trucs bien que tu ne dois pas enlever.

    Mais toi tu veux que ton TTable fasse tout les trucs du TImage mais avec en plus des propres actions.

    C'est là qu'est utile le override et le inherrited.

    override pour dire que tu vas surcharger.

    Et le inherrited est en quelque sorte la surcharge elle meme.

    Si tu commence ta procedure create avec inherrited, tout le chargement va se faire avant ton propre traitement.
    Si tu mets ton traitement suivi du inherrited, le traitement du Timage se fera apres.

    Do U understand ?

    No... Me too....

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Merci pour ces 2 premières réponses !

    => Yurck:

    Je ne savais pas que le nom de cette classe existait déjà ! Je changerai cela donc ....

    Pour ce qui est de ton code, je ca ne fonctionne pas
    Il me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Erreur] Table.pas(34): Types incompatibles
    Je poste ici juste le create :

    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
    type TabListeChamps = array of TChamps;
     
    type TTables=class(TImage)
     
    private
    nom:string;
    lesChamps:TabListeChamps;
    nbElements:integer;
    indiceCourant:integer;
     
    public
     
     
    procedure setNom(unNom:string);
    function getNom:string;
    procedure AddField(leChamps:TChamps);
    procedure RemoveLastField;
    procedure RemoveAField(intitule:string);
    procedure RemoveAllFields;
    function ListFields:TabListeChamps;
    procedure DrawTable;virtual;abstract;
    constructor Create;
    end;
     
    implementation
     
    constructor TTables.Create;
    begin
    Inherited;// ERREUR ICI
    nbElements:=0;
    indiceCourant:=0;
    end;
    =>jambonstar :

    Je pense avoir saisi en gros ! Merci de ta réponse

  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

    Dans la partie interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      constructor Create(AOwner: TComponent); override;
    Dans la partie Implementation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    constructor TTables.Create(AOwner: TComponent);
    begin
      Inherited Create(AOwner);
      // ...
    end;
    @+

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Merci à Cl@udius et à toi Yurck! Ces 2 propositions fonctionne parfaitement !

    Petite question tout de même :
    Laquelle de ces 2 méthodes est la plus propre ?
    Y a t-il une différence quelconque ?

    Il me reste à faire le create des classes dérivées (je pense m'en sortir avec tout ca).

    Merci

  7. #7
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Lorsque tu veus surcharger une méthode tu dois avoir la même signature.

    Timage lui même à un ascendant qui a un ascendant etc...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .....
    
        constructor Create(AOwner: TComponent); override;
      end;
    
    implementation
    
    constructor TTables.Create(AOwner: TComponent);
    begin
      Inherited;
      nbElements:=0;
      indiceCourant:=0;
    end;

  8. #8
    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 Yurck,

    Citation Envoyé par Yurck
    Je vois plus un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Inherited Create(Owner);
    Non ?

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Je réouvre le Post ! Bé oui, je m'en sors pas

    Mon soucis :
    ajouter des paramètre supplémentaire à mon create, ton en gardant les paramètres de ceux de la classe mère.

    Dans la classe TTables (héritée de TImage) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor Create(AOwner: TComponent);override;
     
    implementation
     
    constructor TTables.Create(AOwner: TComponent);
    begin
    Inherited;
    nbElements:=0;
    indiceCourant:=0;
    end;
    Dans la classe TEntite (héritée de TTables)
    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
    constructor Create(AOwner: TComponent);override;
     
    implementation
     
    constructor TEntite.Create(AOwner: TComponent);
    begin
    inherited;
    Self.Width:=150;
    Self.Height:=200;
    Self.Canvas.Pen.Color:=clBlack;
    Self.Canvas.Brush.Color:= clWhite;
    Self.Canvas.Brush.Style:=bsSolid;
    Self.Canvas.Rectangle(0,0,Self.Width,Self.Height);
    Self.Canvas.Polyline([Point(0,20),Point(Self.Width,20)]);
    Repaint;
    end;
    Dans la classe TRelation (héritée de TTables)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor Create(AOwner: TComponent;EntiteA:TEntite;EntiteB:TEntite);override;
     
    implementation
     
    constructor TRelation.Create(AOwner: TComponent;EntiteA:TEntite;EntiteB:TEntite);
    begin
    inherited;
    //suite du code à définir
    end;
    Mais j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Erreur] Relation.pas(11): La déclaration de 'Create' diffère de la déclaration précédente
    Cela viendrait-il du fait que le create de TTables diffère de celui défini dans TRelation?

    Compliquer les constructeurs quand même !

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Utilise reintroduce en lieu et place de override
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    constructor Create(AOwner: TComponent;EntiteA:TEntite;EntiteB:TEntite);reintroduce;
    Cela aura pour effet de pouvoir ajouter des paramètres à la déclaration de l'ancêtre.
    Attention dans ce cas, ce que j'ai dis avant à Cl@udius tient toujours: Puisque les paramètres sont différents, tu ne peux plus faire:
    Tu es obligé d'appeler le Create explicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inherited Create(AOwner);
    sinon, Delphi se perd
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Encore une fois, ca fonctionne!

    Ca fait beaucoup de choses assimilées en peu de temps!
    Donc reintroduce pour ajouter des paramètres.

    Mais je ne comprends pas une chose.
    Pourquoi ne puis-je pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor Create(AOwner: TComponent;EntiteA:TEntite;EntiteB:TEntite);reintroduce;override;
    Car si j'ai suivis :
    - override permet de surcharger sans redéfinir les paramètre de la méthode
    - reintroduce permet d'ajouter des paramères à une méthode tous en masquant les avertissements du compilateur informant qu'une méthode virtuelle précédemment déclarée est masquée.

    EDIT :

    J'ai vu sur certains posts, qu'il fallait mettre overload.
    C'est donc ceci que je dois utiliser si je veux surcharger mon create?

  12. #12
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par ero-sennin
    J'ai vu sur certains posts, qu'il fallait mettre overload.
    C'est donc ceci que je dois utilié si je veux en surcharger mon create?
    Tu te mélanges un peu les pinceaux:
    overload: permet de déclarer 2 fonctions avec des paramètres différents mais toujours accessibles
    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
     
    TMaClasse = class
    private
      procedure MaProcedure(Param: double); virtual
    end;
     
    TMaClasse2 = class(TMaClass)
    private
      procedure MaProcedure(Param: integer);overload;
    end;
     
    procedure Machin;
    begin
      MaClasse2.MaProcedure(12.4);
      MaClasse2.MaProcedure(12);
      //Tu gardes la possibilité d'appeler la méthode de la classe ancêtre
    end;
    reintroduce: permet de surcharger une méthode de l'ancêtre en modifiant les paramètres. 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
     
    TMaClasse = class
    private
      procedure MaProcedure(Param: double); virtual
    end;
     
    TMaClasse2 = class(TMaClass)
    private
      procedure MaProcedure(Param: integer);reintroduce;
    end;
     
    procedure Machin;
    begin
      MaClasse2.MaProcedure(12);
      //Tu ne peux que appeler ce Create
    end;
    Voila en gros sans les subtilités et j'espère que je ne me plante pas

    Citation Envoyé par ero-senin
    - reintroduce permet d'ajouter des paramères à une méthode tous en masquant les avertissements du compilateur informant qu'une méthode virtuelle précédemment déclarée est masquée.
    Ca sert à plus qu'à ça
    En fait, si le compilo te dit ça, c'est que tu redéclares une méthode avec le même nom qu'un méthode virtuelle de l'ancêtre. Donc la méthode ancêtre est cachée. Tu n'y a plus accès. Alors qu'en la surchargeant (override, overload ou reintroduce) tu gardes la possibilité de faire un inherited.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    OK!

    En effet, je me perds un peu dans tout ca...

    Je vais faire quelques tests simple comme tu as fais afin de bien cerner ces mots clés car c'est hyper important de bien comprendre les différences entre ces divers mots clés !

    Merci d'avoir pris le temps de bien tout m'expliquer Pedro!

    Allez, je vais faire mes quelques tests

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/12/2010, 11h26
  2. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57
  3. [BCB6]Redimentionnement manuel d'un composant TImage
    Par vsavoir dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/09/2004, 11h55
  4. [C#] Une seule méthode pour plusieurs composants
    Par niPrM dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/06/2004, 14h41
  5. mettre a blanc le composant TImage
    Par Chonchon dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/11/2003, 09h24

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