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 :

Dériver un TFrame


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut Dériver un TFrame
    Bonjour à tous.

    J'essaie de dériver un TFrame pour le spécialiser.

    J'aimerai juste y ajouter quelques champs.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TMaFrame = class(TFrame)
         private
            FChampSupp: Boolean;
         public 
            property ChampSupp:Boolean read FChampSupp write FChampSupp;
    end;
    J'aimerai inclure cette classe au sein d'une unité genre 'common.pas' et donc ne pas avoir de fichier dfm associé à ma classe.

    J'aimerai ensuite au sein d'un projet particulier, pouvoir dériver tout mes cadres non pas de TFrame, mais de TMaFrame, en faisant fichier > nouveau > etc..

    J'ai essayé plusieurs solutions, mais je n'y suis pas arrivé à chaque fois des erreurs.

    Quelqu'un pourrait-il m'indiquer la procédure à suivre,

    Merci d'avance,

    Fred

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Je ne le fais pas pour des Frame mais pour des Formes (je n'aime pas les frames, je ne leur trouve aucun intérêt, on peut faire la même chose avec des formes, le code est ainsi plus séparé entre la forme parente et la forme ancrée, cela oblige à utiliser un objet intermédiaire comme le veux le bon vieux modèle MVC ), et je le fais à la main, quand je créais une nouvelle forme, je passe par le menu standard, puis ma première action est de changer TForm en TBiduleCustomForm (objet sans DFM)

    Sinon, quelles sont les erreurs, sans savoir ce qui ne fonctionne pas, on ne pourra pas te donner de solution ...

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Si tu as créé ta classe TMaFrame dérivant de TFrame, il te suffit de l'ajouter au référentiel. (menu contextuel sur la frame).

    Ensuite quand tu ajouteras une dérivée de ta TMaFrame, il te suffira de préciser que ta nouvelle Frame hérite de TMaFrame. (fichier/nouveau...)

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Moi j'ai toujours fait "fichier > nouveau > autre > onglet du projet ...", et cela ne posait pas de soucis ... mais effectivement pour les frames, c'est peut-être plus élégant comme méthode (dans mes rares utilisation, j'ai fait Ajouter dans la Palette), faudra que je m'y penche sur cette histoire de référentiel

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Moi j'ai toujours fait "fichier > nouveau > autre > onglet du projet ...", et cela ne posait pas de soucis ... mais effectivement pour les frames, c'est peut-être plus élégant comme méthode (dans mes rares utilisation, j'ai fait Ajouter dans la Palette), faudra que je m'y penche sur cette histoire de référentiel
    Je fais pareil car en général toutes les frames et leurs descendantes sont liés à un seul projet.

    La méthode de pascal est bien pour des cadres génériques utilisés dans divers projets.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Merci à vous pour vos réponses.

    Ca ne marche toujours (parfaitement) pas.

    J'ai déja essayé les 2 techniques :

    - Ajouter au référentiel : Cela n'est possible que dans le cas d'un objet dérivant de tframe assorti d'un dfm. J'essayais de faire la même chose sans fichier dfm, afin de pouvoir placer plusieurs classes dérivées de tframe dans la même unité.
    D'apres mes lectures, pour faire cela, il faudrait que je passe par un package et la création d'un expert IDE. Cela étant trop lourd à gérer vu l'intérêt pour le projet j'ai abandonné cette solution.

    - Modifier l'ancetre "à la main": J'avais déja essayé cette méthode mais je n'ai jamais réussi sans erreurs, même si cela semble fonctionner.

    L'erreur rencontrée :
    j'ajoute un nouveau tframe au projet
    je modifie l'ancêtre à la main dans le pas => Cela fonctionne je vois toujours mon cadre =, je peux poser des composants dessus pas de pb.
    Je ferme le cadre, je l'ouvre à nouveau, et delphi me signale les erreurs suivantes :
    Erreur lors de la lecture de la propriété TabOrder. La propriété n'existe pas. Ignorer l'erreur et bla bla ?
    la même erreur se produit sur la propriété TabStop.

    Je pensais donc que je m'y prenais mal.

    Mais je ne comprends pas pourquoi, ces propriétés, déclarées published dans TFrame n'existent plus pour mon objet dérivé ??

    Elles n'apparaissent plus dans l'inspecteur d'objets.

    De plus, visuellement le cadre ressemble en tout point à une fiche, avec les bordures, barre de titre etc..?

    je précise que j'utilise D2005, est-ce un bug de l'IDE ?

    Cela fonctionne t-il sur D7 ?

    Merci de vos réponses

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    je vois deux autres solutions

    tu crées une unité MesFrames qui déclare une classe TMaFrame=class(TFrame) avec les modifications qui t'intéresse

    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 MesFrames;
     
    interface
     
    uses
     Classes,Forms,Graphics;
     
    type
     TMaFrame=class(TFrame)
     public
      Constructor Create(AOwner:TComponent); override;
     end;
     
    implementation
     
    constructor TMaFrame.Create(AOwner:TComponent);
    begin
     inherited;
     Color:=clBlack;
    end;
     
    end.
    puis tu viens modifier le code des tes frames en ajoutant un uses de MesFrames et tu changes le type parent de la fiche par TMaFrame

    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
     
    unit Unit2;
     
    interface
     
    uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      MesFrames;
     
    type
      TFrame2 = class(TMaFrame)
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    implementation
     
    {$R *.dfm}
     
    end.
    l'autre solution est plus fun encore

    tu ajoutes MesFrames en dernier dans la clause uses de Unit2 dont tu ne modifie pas le code ... et dans MesFrames tu écris ceci :

    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 MesFrames;
     
    interface
     
    uses
     Classes,Forms,Graphics;
     
    type
     TFrame=class(Forms.TFrame)
     public
      Constructor Create(AOwner:TComponent); override;
     end;
     
    implementation
     
    constructor TFrame.Create(AOwner:TComponent);
    begin
     inherited;
     Color:=clBlack;
    end;
     
    end.
    Si ton unité apparait bien après l'unité Forms dans la clause Uses c'est ta version du TFrame qui sera exploitée par la frame

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Pas mal la dernière solution, c'est osée, peu recommandé pour la maintenance ...

    pour la 1ère solution, ben c'est ma méthode, et fred64, l'a déjà essayé, et il n'a pas eu de succès, comment utilises-tu ta frame par la suite ?
    tu ne l'intègre pas via l'IDE, tu change le Parent ???

    sinon "type parent", disons plus clairement l'ancêtre, car la notion de Parent dans les frames est aussi important, autant ne pas mélanger les termes

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pas mal la dernière solution, c'est osée, peu recommandé pour la maintenance ...
    ça dépend, j'utilise cette technique dans SIPInside pour redécorer les bouton Windows...ça n'apporte donc aucune modification cruciale et ça simplifie les changements.

    Citation Envoyé par ShaiLeTroll Voir le message
    pour la 1ère solution, ben c'est ma méthode, et fred64, l'a déjà essayé, et il n'a pas eu de succès, comment utilises-tu ta frame par la suite ?
    tu ne l'intègre pas via l'IDE, tu change le Parent ???
    oui, c'est dans le cadre de modifications sans impact sur l'IDE, d'ailleurs il faut bien voir que si on vient modifier la propriété Color de la frame dans l'IDE, la valeur fixée dans le constructor hérité ne sera pas prise en comtpe.

    Citation Envoyé par ShaiLeTroll Voir le message
    sinon "type parent", disons plus clairement l'ancêtre, car la notion de Parent dans les frames est aussi important, autant ne pas mélanger les termes
    yep, ça doit être parcequ'on me parle un peu trop de mon age sur un autre forum que j'ai zapé le terme d'ancêtre

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Je parlais de la maintance d'une application développé dans un cadre professionnel, il faut penser que l'on est pas à vie dans une société, et qu'une fois parti, laisser ce genre de piège n'est pas un cadeau, ...

    Paul Toth, le vénérable ancien ...

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je parlais de la maintance d'une application développé dans un cadre professionnel, il faut penser que l'on est pas à vie dans une société, et qu'une fois parti, laisser ce genre de piège n'est pas un cadeau, ...
    ben "normalement" ça se documente une application professionnelle

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ben "normalement" ça se documente une application professionnelle
    ouais, normalement, et puis faut aussi que quelqu'un sache où est la doc, imagine, là où je travaille, tu as plus de 200 projets delphi, avec un serveur de fichier qui doit contenir plus de 1 000 000 fichiers doc, excel, et autre ... va trouver un truc la dedans ... ah et les commentaires, lol, doit y avoir 0.01% de commentaire sur l'ensemble des sources, j'en ai commis plus de la moitié sur une petite centaine d'unité de lib interne ou métier ...

    et puis un "cadre professionnel" ne veut pas dire que c'est fait dans les règles de l'art (même si pas conscience professionnel, j'essaye que cela le soit, je n'ai pas toujours le temps, et puis quand tu maintiens une appli déjà sans doc, cela ne t'encourage pas à faire mieux que les autres), un professionnel est souvent limité par le temps (budget), et donc les docs, ben ça passe à la trappe ... je n'ai documenté que les nouveautés, les antiquités ont été améliorées mais pas documentées pour autant ... mais si c'est pas documenté, mieux vaut éviter les figures de style (tient celle-ci, que je n'ai pas documenté d'ailleurs alors que c'est un peu retord, ...)

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    ben quand tu bosses seul (c'est mon cas) c'est pas mieux, car ça te motive pas vraiment de documenter quelque chose que tu es le seul à utiliser...au cas ou éventuellement il devait advenir que le projet devrais être repris pas un hypothétique programmeur si toute fois l'application devait être modifiée après mon envisageable départ

  14. #14
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Bonjour,

    Je voie que fred64 n'a toujours pas eu de réponse à son problème.

    Je dérive régulièrement les TFrame. Et chaque fois, je rencontre le même problème que fred64 à un moment ou à un autre.

    Je pense qu'il doit y avoir un bug dans l'IDE de Delphi. Pour que ça marche, il faut procéder comme ceci :

    - Tu crée une nouvelle Frame par défaut.
    - Tu vas dans le source et tu modifie le parent à la main.
    - Tu affiche le dfm en mode text.

    Et tu remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object MaFrame : TMaFrame
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inherited MaFrame : TMaFrame
    Il faut remplace la déclaration object par inherited dans le dfm. Si tu ne fais pas ça, au moment de recharger la frame, l'IDE va consiférer qu'il s'agit d'une TFrom et pas d'un TFrame. D'où l'affichage qui ressemble à une fiche, et les messages d'erreurs parce qu'une fiche n'a pas de TabOrder...

Discussions similaires

  1. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 15h35
  2. URGENT DRIVER ODBC
    Par Casp dans le forum Débuter
    Réponses: 3
    Dernier message: 28/04/2003, 16h24
  3. [PostgreSQL] PB de drivers JAVA
    Par koundelitch dans le forum Administration
    Réponses: 5
    Dernier message: 14/03/2003, 15h09
  4. [MFC] Utilisation Drivers
    Par LAPLACE dans le forum MFC
    Réponses: 4
    Dernier message: 21/12/2002, 10h29
  5. Problème avec un TFrame
    Par mixi dans le forum Langage
    Réponses: 4
    Dernier message: 12/09/2002, 13h25

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