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 de TApplication, impossible ?


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut Dériver de TApplication, impossible ?
    Bonjour,

    Voilà ma question, tout bête.

    En regardant la VCL je m'aperçois que pour une application standard (Windows avec GUI) l'instance globale "Application" était créé dans l'unité "Controls" via un appel à "Application := TApplication.Create(nil);" dans la méthode "InitControls".
    Oh désespoir cela réduirait-il à néant la possibilité de dériver "TApplication" pour par exemple créer des projets d'un type plus spécifique que "Application Windows avec GUI) directement depuis l'EDI Delphi et dont la variable globale ne serait pas de type "TApplication" mais "TXXXApplication" (comme pour les services ou composants du panneau de configuration) qui hériterait du "TApplication" défini dans "Forms".

    Pour cela il aurait juste fallu que Borland déclare une variable globale dans "Controls" qui soit du type 'class of TApplication' et d'instancier "Application" avec... Hors Delphi 2009 ne semble pas inclure de variable de ce type.

    Comment peut-on contourner cela ? Peut-être redéclarer un type dérivé de TApplication qui contienne l'instance globale "Application" en interne et qui redirige toutes les méthodes de base de TApplication en les appelant via "Application" ? Ya un moyen de faire ça propre et en assurant une compatibilité future (si jamais on ajoutait de nouvelles méthodes/propriétés à la classe "Application") ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Si tu es en Delphi 2009, tu peux faire un ToolHelp non ? étendre une classe sans l'hériter !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    je ne vois pas trop pourquoi c'est pas possible de dériver un TApplication?

    l'objet TApplication est stocké dans un variable globale il me semble. il suffit de la remplacer par un dérivé. l'inconvenient c'est qu'il faut caster pour accéder au méthode de l'objet dérivé.

    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
     
    TMonApp = class(TApplication)
    public
     function ForTest: string;
    end;
     
    function MonApp: TMonApp;
     
    implementation
     
    function MonApp: TMonApp;
    begin
      Result := Application as TMonApp;
    end;
     
    function TMonApp.ForTest: string;
    begin
      ShowMessage('Salut');
    end;
     
    initialization
       Application.Free;
       Application := TMonApp.Create(nil);

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Tout à fait Kafëine, c'est juste un peu oser de faire le .Free !
    Il faut être sûr que la section initialization de Controls a bien lieu AVANT celle de l'unité de TMonApp
    Je pense qu'un mécansime comme la THintWindowClass aurait pu être valable avec une TApplicationClass ... et biensur en remplaçant dans le DPR, les "uses"

    C'est un peu crado ce qu'ils ont fait pour TApplication, déclaré dans Forms, instanciés dans Controls ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Citation Envoyé par ShaiLeTroll
    c'est juste un peu oser de faire le .Free !
    oui c'est vrai. je supposais que l'initialization des uses de la unit était appelé avant le initialization de la unite les contenants, d'ailleurs ça à l'air d'être ce comportement si on regarde le code source du projet.

    peut être que le compromis c'est d'instancier ce TMonApp dans le source du projet justement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    begin
      Application.Free; 
      Application := TMonApp.Create(nil);
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TfrmMain, frmMain);
      Application.Run;
    end.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Tout à fait, cela fait les clauses initialization des uses puis celle de l'unité en cours, cela fait une sorte de récursivité finalement ...

    donc si tu mets "Controls" dans uMonApp, c'est normalement OK, non, ce qui me pose plus de problème c'est le Free\Create, voire si cela ne créé par des instances dans Window genre les Mutex et autre ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par ZZZzzz2 Voir le message
    Bonjour,

    Voilà ma question, tout bête.

    En regardant la VCL je m'aperçois que pour une application standard (Windows avec GUI) l'instance globale "Application" était créé dans l'unité "Controls" via un appel à "Application := TApplication.Create(nil);" dans la méthode "InitControls".
    Oh désespoir cela réduirait-il à néant la possibilité de dériver "TApplication" pour par exemple créer des projets d'un type plus spécifique que "Application Windows avec GUI) directement depuis l'EDI Delphi et dont la variable globale ne serait pas de type "TApplication" mais "TXXXApplication" (comme pour les services ou composants du panneau de configuration) qui hériterait du "TApplication" défini dans "Forms".

    Pour cela il aurait juste fallu que Borland déclare une variable globale dans "Controls" qui soit du type 'class of TApplication' et d'instancier "Application" avec... Hors Delphi 2009 ne semble pas inclure de variable de ce type.

    Comment peut-on contourner cela ? Peut-être redéclarer un type dérivé de TApplication qui contienne l'instance globale "Application" en interne et qui redirige toutes les méthodes de base de TApplication en les appelant via "Application" ? Ya un moyen de faire ça propre et en assurant une compatibilité future (si jamais on ajoutait de nouvelles méthodes/propriétés à la classe "Application") ?
    la question que je me pose est plutôt mais pourquoi donc voudrais-tu hériter de TApplication ?

    J'ai décidé de le faire dans LVCL et RemoteVCL (sur mon site), mais en fait c'est toute la VCL (en fait non, juste un petit bout) qui est réécrite ^^
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Installation Drivers Impression Brother Impossible
    Par filos dans le forum Windows 7
    Réponses: 8
    Dernier message: 22/06/2013, 10h52
  2. Réponses: 5
    Dernier message: 09/02/2010, 02h02
  3. Installation drivers du moniteur impossible
    Par marc_60 dans le forum Installation
    Réponses: 2
    Dernier message: 14/04/2008, 10h20
  4. Impossible de charger le driver MySQL
    Par supernova dans le forum JOnAS
    Réponses: 4
    Dernier message: 04/04/2007, 19h01
  5. Installation impossible des drivers
    Par MrEddy dans le forum Matériel
    Réponses: 4
    Dernier message: 02/05/2004, 11h58

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