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 :

Variable sans objet


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 426
    Points : 3 064
    Points
    3 064
    Par défaut Variable sans objet
    Bonjour

    Quand on ajoute une TForm à un projet, on obtient une classe TFormxxx et Delphi génère le nom de variable pour la TForm en Formxxx.
    TForm1 va donner la variable:

    Est-ce qu'il y aurait un moyen de récupérer (et pointer sur) cette variable en ne connaissant que son nom ?
    Typiquement, j'ai une TFormDevis et la variable associée FormDevis dans la même unité.
    Depuis un autre emplacement du code, je veux créer une TFormDevis pas sur une variable au hasard mais bien sur la variable de l'unité qui définit TFormDevis.
    A partir de TFormDevis, j'enlève le le T initial pour avoir le nom de la variable. Ca c'est le plus facile.
    Après, comment je peux me servir de ce nom comme si je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormDevis := TFormDevis.Create(nil)
    ??

    FormDevis étant juste une chaîne de caractères, ça coince un peu.

    Je ne pense pas que ça soit possible mais bon, à tout hasard ....
    J-L aka Papy pour les amis

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 489
    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 489
    Points : 24 966
    Points
    24 966
    Par défaut
    La réponse est non sans le programmer et oui avec tout ce qui existe en Delphi
    Personnellement, seule pour la MainForm je conserve cette variable, toutes les fenêtres secondaires c'est une variable locale ou un membre d'une autre Form.

    Tu dois faire par exemple un TDictionnary<String, TForm> pour recenser l'instance avec un nom, c'est un registre
    Tu peux aussi parcourir Screen.Forms et regarder le Name
    Tu peux aussi définir un Owner comme Application et utiliser FindComponent
    La liste d'idée est longue
    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 expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 426
    Points : 3 064
    Points
    3 064
    Par défaut
    Tu peux aussi définir un Owner comme Application et utiliser FindComponent
    ça c'est une super idée. Je teste ça.

    Au passage, sur mon autre post, le RegisterClass qi ne fait rien n'est toujours pas résolu.
    Bizarrement, j'ai testé en dehors de mon projet et ça fonctionne.
    Comme dans le projet concerné le code qui ne fonctionne pas était dans une unité à part, j'ai testé en déplaçant ce code dans le mainform et bien c'est pareil.
    A n'y rien comprendre. Peut-être une directive de compilation qui fout le bazar.
    J-L aka Papy pour les amis

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 426
    Points : 3 064
    Points
    3 064
    Par défaut
    Le Owner + Findcomponent ne fonctionne pas et c'est évident.
    Le but est de créer une instance d'une TForm qui n'existe aps encore. FindComponent ne peut pas trouver ce qui n'est pas encore créee.
    Screen.Forms ne fonctionne pas non plus à cause du même principe.

    J'ai fini par utiliser un TDictionary pour retrouver facilement la variable représentant le classe.

    Merci pour ces différentes idées.
    J-L aka Papy pour les amis

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 489
    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 489
    Points : 24 966
    Points
    24 966
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Le but est de créer une instance d'une TForm qui n'existe aps encore.
    Votre question parlait de trouver l'instance de la variable Form1, ce n'était pas évident de comprendre que vous bloquiez encore sur l'instanciation

    un TDictionary d'un MetaClass, je n'avais pas assez explicité ma proposition de RegisterMe dans cette réponse à rtti et procédure de classe, j'ai tellement l'habitude ça de faire une MetaClass Registry puis Factory/Strategy pour instancier une classe selon un contexte, comme tout simplement instancier une fenêtre via son nom de classe
    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

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 426
    Points : 3 064
    Points
    3 064
    Par défaut
    J'aurais sans doute dû aller plus loin dans la description du problème.

    Le développeur originel avait codé dans la mainform tout un tas de procédures du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure Creation_FormClient;
    begin
    If Assigned(FormClient) = False then
      FormClient := TFormClient.Create(nil);
    FormClient.Show;
    Mais ça il y en a une cinquantaine du même style et pas toujours écrites de la même façon mais sur le même principe.
    Pire, Toutes les autres TForm du projet faisaient référence à la mainform pour utiliser ces mêmes procédures.
    J'ai donc extrait tout ça dans une unité à part pour éliminer tous les uses inutiles des unités concernées par ces procédures creation_xxxx.

    L'avantage est que chaque TForm hérite dune TForm commune bien nommée TFormAncetre.

    Mais, plutôt que réécrire chaque fois la même chose, je voulais faire une procédure Creation(FrmCls: TFormClass); et retrouver dans la procédure cette variable à initialiser.

    Tout ça pour isoler toutes ces procédures et rationaliser le code ... J'aurais pu tout laisser en l'état mais je trouvais ça vraiment pas propre.
    J-L aka Papy pour les amis

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 489
    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 489
    Points : 24 966
    Points
    24 966
    Par défaut
    Dans ce cas TDictionary<TFormAncetreClass, TFormAncetre> pour créer un registre d'une instance par classe
    Mais on peut via une TList<TFormAncetre> et faire une boucle de dessus pour voir si une instance existe déjà
    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

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

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. Sortie standard stockée dans variable sans rc
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 13/12/2005, 14h46
  3. Problème variable et objet
    Par Hacken dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/09/2005, 14h10
  4. Réponses: 5
    Dernier message: 25/05/2005, 22h29
  5. [PHP-JS] Envoi de variable sans passer par un submit
    Par adilou1981 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2004, 19h21

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