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 :

Récupérer au runtime la liste des composants delphi disponibles


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut Récupérer au runtime la liste des composants delphi disponibles
    Bonjour,

    C'est une petite idée qui me trotte dans la tête depuis un moment (XE4 -> XE7 en fait) et qui depuis revient régulièrement me hanter.

    tout à commencé avec les TADxxxxxxx (anydac) devenant des TFDxxxxxxx (Firedac), puis des migrations BDE et autres -> Firedac
    déclenchement final le Défi Pascal !
    Gexpert nous fournissait une fonction intéressante : le remplacement d'un composant par un autre

    Fonction que je ne retrouve pas dans L'EDI de XE10 suis-je aveugle ?

    j'en arrive à ma question (avant d'éplucher les sources de Gexpert) , titre de mon sujet

    1-Est-il possible de récupérer au runtime (d'une application quelconque) la liste des composants delphi disponibles ?
    2-Question subsidiaire s'il est possible de les récupérer, savoir quelles sont ses dépendances (unités) ?

    Vous voyez où je veux en venir ? un programme qui permettrait de changer un ou plusieurs composants dans les sources (pas et dfm) pour aider les migrations
    est-ce dans le domaine du faisable ? c'est ce que les Questions 1 et 2 pourraient déterminer

    Non, je ne participerais pas au défi (surtout à cause des délais) mais Oui si cela abouti je le partagerais

    Merci de votre lecture

    Serge
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Édit: Message totalement hors-sujet , mais je le laisse parce que SergioMaster m'a répondu

    À moins que je n'ai rien compris au truc, mais c'est juste un problème de conception

    Dans le constructeur d'un TCustomForm, il y a un booléen qui permet de savoir si on charge le fichier .DFM associé à la classe ou pas.

    Et ensuite, il y a un mécanisme pour charger le fichier .DFM: c'est la méthode il me semble ReadComponentResFile


    Et d'après mes tests, la forme principale doit obligatoirement avoir un fichier .DFM sinon une exception est levée (il me semble).

    Enfin, tous tes fichiers .DFM se retrouvent non chiffrés dans ton exécutable. Tu peux le voir avec le logiciel Resource hacker (je pense à un truc sale d'ouvrir ton exécutable en binaire et de le parcourir/ modifier à l'arrache)


    Voila, mais travaillant en C++ avec Xe sûrement qu'il y a des différences

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par foetus Voir le message
    À moins que je n'ai rien compris au truc
    je me suis peut être mal exprimé
    c'est bien sur les sources que je veux modifié pas un programme exécutable.
    Quand je parle de au runtime c'est que je pense à un programme qui interroge je ne sais quoi (d'où la question) pour obtenir la liste des composants installés pour une version particulière de Delphi .
    Disons pour l'exemple les sources du programme à migrer sont en D7, je veux les migrer vers XE10
    a) je balaye les dfm et .pas du programme et récupère les composants utilisés
    b) (ma question) : je balaye les composants installés pour XE10
    .... saisie des transformations à faire
    c) sauvegarde de la source ou autre manip transformation des éléments selon besoin (clauses uses, et composants dans pas et dfm)
    tout ça certainement à grand coup de regexpressions et replacestr
    un truc de ce genre à été proposé à la sortie de XE5 pour remplacer les TADxxxx en TFDxxxxx mais non graphique, à base d'expressions régulière et je ne me souviens plus de quel exe
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai moi aussi réfléchi à faire un outil de migration.
    Pour commencer, c'était un début de soft pour passer de bde à ADO.
    Ça ne faisait pas tout mais ça mâchait au moins une partie du travail.
    On me laisse malheureusement pas le temps au bureau pour aller plus loin.

    Une remarque tout de même concernant l'outil de migration vers Firedac: il vaut mieux l'oublier :-(
    Ou alors, avec une très grosse sauvegarde du code source et de multiples tests très complets ensuite.
    Ça m'a pourri un gros code source à mon premier essai à cause de nom de composant qui étaient détectés par le système de regex et qui n'avaient rien à voir avec Firedac.
    Disons que ça partait d'une bonne intention mais ça n'est pas assez complet pour être parfait.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai moi aussi réfléchi à faire un outil de migration.
    Content de voir que je ne suis pas le seul
    Citation Envoyé par Papy214 Voir le message
    Une remarque tout de même concernant l'outil de migration vers Firedac: il vaut mieux l'oublier :-(
    ....
    Disons que ça partait d'une bonne intention mais ça n'est pas assez complet pour être parfait.
    tout à fait d'accord
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut Je répond à ma première question
    La liste des composants se retrouve dans le Registre (fourre tout Windows)
    bien sûr cela va dépendre des versions et de l'éditeur (donc un peu de constantes à mettre dans mon futur programme)

    Delphi 7 HKEY_CURRENT_USER\SOFTWARE\Borland\Delphi\7.0\Palette
    ...
    XE4 ? HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\11.0\Palette\Cache
    ...
    XE10 HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\17.0\Palette

    j'ai le fond, la forme change elle aussi entre D7 et XE, mais ma première piste est trouvée !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il y a éventuellement une autre solution: rechercher les fichiers .bpl dans dans ton dossier Embarcadero\RAD Studio\X.X\bin.

    Après, il me semble qu'avec Xe6, les composants peuvent être installés dans un dossier public.

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    un truc de ce genre à été proposé à la sortie de XE5 pour remplacer les TADxxxx en TFDxxxxx mais non graphique, à base d'expressions régulière et je ne me souviens plus de quel exe
    Bonjour,
    il me semble que c'est l'utilitaire refind.exe qui se trouve dans le répertoire \bin du répertoire d'installation de Delphi (http://docwiki.embarcadero.com/RADSt...Ex_Expressions).

    Il est fourni avec les versions supérieures à XE5.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    c'est bien cet outil.
    Mais quand tu as développé tes propres classes et que tu as eu le malheur de les préfixer comme les composants TAD...... , ben le résultat est catastrophique :-)

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Je sais bien que cet outil existe mais mon objectif est d'élaborer un GUI plutôt qu'un outil de ligne de commande
    et surtout plus facile (en essayant d'éviter le problème rencontré par Papy214 )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    la plus grosse difficulté c'est de définir les composant qui remplacerons les autres
    après c'est juste un "recherche et remplace" dans chaque source à disposition
    le plus simple étant de se concentrer sur le répertoire où se trouve les sources (je suppose que l'on veut pas modifier les source de Delphi ^^)

    là ou cela peut ce compliquer c'est si tu veut aussi modifier les propriété de ces objets
    c'est plus sioux il faut pour chaque objet appliquer des règles de correspondance
    ensuite pour chaque Class retrouver la variable correspondant et de la rechercher un terme correspondant à "variable.lamethode"
    sans compter les passage de paramètre et autre joyeuseté
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par anapurna Voir le message
    là ou cela peut ce compliquer c'est si tu veux aussi modifier les propriétés de ces objets
    non juste remplacement d'un composant par un autre à la manière GExpert /Replace Component mais en groupe
    i.e
    migrer de BDE vers FireDac
    TConnection -> TFDConnection
    TTable -> TFDTable
    TQuery -> TFDQuery
    etc....
    d'où la question subsidiaire sur les uses, je sais quels sont les paquets utilisés mais pas les uses à déclarer (l'ouverture du pas/dfm modifier s'en chargera mais pas d'ôter ceux qui ne sont plus nécessaire)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    donc il faut que tu te créé une liste de record du genre

    TCompo = Record
    RNom : String;
    RUses : String;
    end;
    ce qui permettra par la même occasion de les exclure de la motif

    je vois bien en code de ce genre pour traiter les uses
    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
     
        j := 0;
        while  J < (Lines.Count - 1) do
        begin
          	if AnsiPos('uses', AnsiLowerCase(Lines[J])) > 0 then
          	begin
               K := J;
    	   while K < (Lines.Count - 1) do
    	   begin
    	     CurrText := Lines[K];
                 // on parcours tout les uses a modifier
                 For z := low(OldtabUses) to High(OldtabUses) do 
                 begin
      	        if AnsiPos(OldtabUses[z], Lines[K]) > 0 then
    	        begin
    	           CurrText := ReplaceString(CurrText,OldTabUses[z],NewTabUses[z]);
    	           Lines[K] := CurrText;
    	       end;
                 end;
                 J:= k+1;
                // un fois la ligne traité on regarde si elle n'a pas un point virgule   
                 if AnsiPos(';', Lines[K]) > 0 then
    	         break;
    	     Inc(K);
    	  end;
    	end;
    ...
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonsoir,
    Citation Envoyé par anapurna Voir le message
    donc il faut que tu te créé une liste de record du genre
    TCompo = Record
    RNom : String;
    RUses : String;
    end;
    Oui, c'est bien un truc de ce genre que j'ai en tête le tout est de trouver les unités maintenant, puisque je tiens la liste des composants

    je vois bien en code de ce genre pour traiter les uses
    là moi je vois plutôt une utilisation extensive de regexpressions mais oui c'est l'idée
    idem pour les composants de la forme et du DFM

    tout ça est encore nébuleux (et je n'ai pas de stagiaire sous la main ) mais c'est l'idée générale !
    Quand j'y repense je me dit que l'outil transformant des VCL en FMX (MIDA) fait plus qu'un peu ce même travail
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    pour le dfm c'est plutot simple
    une fonction qui permet de verifier si le fichier est un dfm binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function IsDFMBinary(FileName: string): Boolean;
    une fonction pour transformer le binaire to txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure DFM2TXT(Src, Dest: string);
    une fonction text vers binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure TXT2DFM(Src, Dest: string);
    et un code global pour gérer ça
    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
     
        TempFile := ChangeFileExt(FileName, '.$$$');
        if FileExists(TempFile) then
          DeleteFile(TempFile);
     
         if IsDFMBinary(FileName) then
         begin
          	DFM2TXT(FileName, TempFile);
    	ChangeToNewObjet(TempFile);
    	TXT2DFM(TempFile, FileName);
         end
         else
         begin
          	RenameFile(FileName, TempFile);
          	ChangeToNewObjet(TempFile);
        end;
        DeleteFile(TempFile);
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2010, 15h40
  2. Réponses: 5
    Dernier message: 09/09/2006, 21h30
  3. actualiser la liste des composants d'un projet
    Par Ndugu dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/09/2006, 16h31
  4. liste des composants installés
    Par sami_c dans le forum ASP
    Réponses: 1
    Dernier message: 18/05/2006, 20h13
  5. [Swing] liste des composants d'un container
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/02/2006, 12h50

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