J'essaie de commencer à faire mes propres bibliothèques avaïnbles en tant que packages avant de compiler mes applications avec ces packages, d'où modulariser mon code. Pendant des années, j'ai une "sorte de" packages compris, respirant un soupir de soulagement lorsque je charge un package de composants et cliquez sur "Installer" et ça fait. Je comprends que le processus d'installation d'un composant (ou de composants) via la création d'un BPL qui est ensuite enregistré avec l'IDE. P>
où je commence à me perdre, c'est comment faire des fichiers disponibles afin que je puisse compiler avec un package ou des DCU pré-compilé (comme les vendeurs tiers du tiers) et sans pointe mon projet au code source tout le temps. Je peux créer un package avec les paramètres suivants: p>
p>
où j'ai spécifié que toute ma sortie ira dans 'C: \ Scratch \ WOW'. Après une construction, je trouve test.bpl, test.dcp et beaucoup de Duc. Maintenant, lorsque je pointe un autre projet dans ce dossier pour utiliser le DCU, je reçois une erreur DFM manquante (une des unités est une forme). Devrais-je copier manuellement les fichiers DFM nécessaires dans ce dossier de sortie? Le DPK connaît ce formulaire, alors pourquoi ne pas avoir copié le DFM pour moi? Je suppose qu'à utiliser test.bpl, ce fichier contient tout, mais je souhaite travailler dans les deux modes. Bien sûr, je peux contourner cela en incluant le dossier source de mon chemin de recherche de projet pour trouver le DFM mais que les bibliothèques tiers semblent avoir déjà les DFM dans leur dossier de sortie. Ont-ils l'installé là-bas à l'aide de l'installateur? Merci p>
au lieu de la place p>
4 Réponses :
Oui, vous devez copier le fichier .DFM dans le répertoire avec les unités compilées (.DCUS), si c'est le seul répertoire souhaité dans votre chemin de recherche. Le BPL contiendra bien sûr le fichier .dfms et vous avez besoin d'un fichier .DCP pour pouvoir relier un BPL avec votre application. P>
Les outils tiers doivent avoir mis les .DFMS avec le fichier .dcus dans le répertoire à l'aide de leur installateur, en effet. P>
au lieu de copier * .dfm manuellement, vous pouvez utiliser l'événement post-construction (projet / options / événement de construction), ex:
Bonne idée. J'utilise déjà cette même méthode pour utiliser madexcept pour corriger le binaire.
@Brian: Si vous installez MakedXcept dans l'IDE, vous n'avez pas besoin d'un événement de poste pour corriger l'EXE. MakeXcept le fera elle-même (si son option est activée, voir Projet | Options Madoxcept une fois installées).
@Serg: Comment la performance des événements de construction? J'ai essayé une fois et chaque construction a ensuite pris environ 30 secondes supplémentaires pour copier l'EXE à un autre endroit ... a abandonné dessus, mais peut-être trop tôt?
@Marjan - c'est étrange. Je n'ai jamais rencontré de problèmes avec des événements de post-capitaine, bien que je les utilisais pour copier * .res et * .DFM fichiers uniquement (lors de la construction de packages).
@Serg: Merci c'est bon de savoir. Il peut alors juste être chère ol 'Kaspersky (Anti-Virus) Obtenir ses mains grubées dans le mélange lors de la copie d'une exécutable ...
@Marjan Venema: est jolie avec AVS - car ils essaient de tout surveiller, ils peuvent b> causer de cette étrange lenteur (parce qu'ils analysent un grand exécutable étant copié) ... c'était le cas sur une question serveurfault.com il y a quelque temps .....
@Marjan: Désolé, je n'étais pas clair - j'utilise des produits de poste pour madexcept sous contrôle d'un fichier de commandes. Quand dans l'IDE, je laisse fairexcepter faire sa propre chose.
Comme d'autres disent que vous pouvez utiliser des événements post-construction pour copier vos fichiers DFM en place. D'autres personnes utilisent un fichier de commandes externe unique qui copie le DFMS dans le dossier DCU. P>
Personnellement, je vois très peu d'avantages à faire des forfaits pour des choses qui ne sont pas développées aussi comme des composants réutilisables. Je vois également très peu d'avantages à partitionnement d'une application existante en packages, lorsque vous n'avez pas raisonnablement besoin d'utiliser le même sous-section ou le même package plus d'une fois ou à la conception. P>
Des choses que je voudrais mettre en paquets: p>
Composants Visuels et non visuels Delphi. p> li>
choses qui doivent absolument être branchées au moment de l'exécution ou laissées de côté. Par exemple, supposant que je vendrai Métaware Light and Metaware Pro, et au lieu d'utiliser Compiler IFDEFS pour construire une différence binaire, j'ai préféré pour une raison quelconque de ne pas expédier rapidement la protéie. P> li> ol>
choses à méfier avec des packages: p>
J'ai rencontré beaucoup de bugs compilateurs lors de la combinaison de packages avec des génériques. J'ai également rencontré des accidents de l'IDE et des lockups, à Delphi 2009, 2010, XE et XE2. (Je crois que XE3 est meilleur) p> li>
Vous devriez apprendre un peu de Borlandmm.dll et de la gestion de la mémoire partagée dans le monde BPL avant de passer à elle. Il y a des subtilités. P> li>
Les paquets limitent la capacité de la liaison à décider quoi supprimer. En fait, il le détruit à peu près. Les paquets contiennent tout ce qui est lié à eux et rien d'accessible publiquement peut être supprimé. P> li>
Une fois que vous avez créé un package binaire et l'a envoyé à un client, vous avez un contrat de modification assez difficile (cette BPL contient une interface binaire de signature ou d'application particulière), vous devez faire attention à l'avenir. ne les changez jamais, ni mélanger et les faire correspondre. Méfiez-vous de DLL enfer, même parmi vos propres clients, et soyez prêt à utiliser la version sur vos paquets. Juste comme les packages Delphi ont un suffixe de version, je vous recommande d'utiliser des suffixes de version dans vos propres packages, puis de les cogner chaque fois que la compatibilité binaire a changé. P> LI>
Delphi gère les poignées de développement de dépendances entre les colis à propos de ce qui pourrait être espéré, ce qui est moins bien qu'une seule application monolithique. Dans les applications que j'ai, j'ai une utilisation intensive de packages, je trouve des groupes de projets contenant un tas de packages qui dépendent de l'autre sont très difficiles à gérer et à construire rapidement. En fait, j'ai vécu que les deux compiles et les constructions sont plus lentes et plus frustrantes qu'elles ne seraient dans un mégaproject singulier 750kline. p> li> ol>
Je me demande vraiment si vous n'êtes pas cela dans la zone d'emballage de Delphi (vous respirez un soupir de soulagement chaque fois qu'un composant Delphi construit et s'installe sans problème?) Si vous voulez vraiment emménager dans les paquets du monde. Par tous signifie, vous devriez expérimenter. Mais je ne parierais pas encore la ferme. En savoir plus d'abord. P>
+1 pour une très belle explication, merci. J'étais au courant de ces problèmes (DLL HELL), c'est pourquoi je me suis tenu depuis si longtemps, mais j'essaie de rattraper tout ce genre de choses, notamment de trouver des moyens d'automatiser davantage l'installation de composants que nous utilisons qui n'ont pas de Installateur - Tout ce qui nécessite que je comprenne les packages. J'ai un amour d'espoir que, avec XE, je peux passer à BPL avec plus de pros que les inconvénients (mes applications sont d'environ 750K lignes).
Intéressant que maintenant avec Delphi 10 Seattle, avec un projet de ligne de 750k, vous devriez pouvoir travailler sans colis et avoir beaucoup de temps que vous ne pouviez à Delphi Xe Era.
Vous semblez dire que les colis sont plus de problèmes, alors ils valent la peine (et basé sur mon expérience, je aurais tendance à être d'accord), cependant quoi de l'affaire lorsque vous avez de grandes sections de code partagées entre plusieurs applications (par exemple, de nombreux objets de périphérique) et vous souhaitez également faire respecter les limites pour réduire les dépendances et maintenir l'architecture. Avec des DLL standard, vous auriez des masses d'appels de fonction plate pour entretenir et il serait agréable d'accéder directement aux interfaces d'objet? Est-ce encore une mauvaise idée?
Ce n'est pas qu'ils ne valent pas la peine. Notez qu'il existe une différence entre l'utilisation des packages de conception dans l'IDE (élément central de l'expérience Delphi). Il est si vous avez choisi de construire vos propres applications cibles à l'aide de BPLS dans le cadre de celui-ci, c'est vraiment la problématique. Vous n'envisageez pas une alternative sane (DLLS versus BPLS). La question est "DLL ou non". Absolument tous les problèmes ci-dessus avec BPLS s'applique aux DLL, car (obtenir celui-ci) Les BPLS sont des DLL. Allez statique. Évitez de faire vos propres dlls.
J'ai trouvé un moyen de faire cela sans déplacer des fichiers .dfm dans le répertoire des fichiers .DCU, vous pouvez donc avoir un répertoire pour les fichiers .DCU uniquement pour les fichiers .DCP uniquement et un autre pour les fichiers .bpl uniquement. p>
Tout ce que vous avez à faire est de créer un autre répertoire sur votre bonne structure, comme je le fais. Le répertoire s'appelle RES et, il doit être placé tous les fichiers de ressources (fichiers .RES, les fichiers non utilisés) utilisés par les applications compilées à l'aide de vos packages (composants). Dans le chemin de la bibliothèque Delphi, vous devez inclure en plus du répertoire DCU (vous devez déjà avoir) un répertoire nommé Res. P>
sur votre composant (heure de conception) Faites tout ce que vous voulez avec le formulaire (concevez-le, mettez d'autres composants, etc.). Dans le code source de l'unité, vous remplacez {$ r * .dfm} avec {$ r unitéName.dfm}. Ce faisant, économisez tous et fermez le DPK. Maintenant déplacez le fichier .dfm (ne copiez pas, déplacez-vous!) Dans le dossier RES (le fichier .dfm est un fichier de ressource sur Delphi. La directive {$ R} est la preuve!) Et après cela ouvre à nouveau le DPK pour comprendre Ce qui a changé. P>
Réalisez d'abord que vous ne pouvez pas ouvrir le formulaire (F12) de son appareil, bien qu'aucune erreur n'a été émise par Delphi à propos de "DFM manquant". P>
Maintenant, faites une construction sur votre colis puis de l'installer. Réalisé à nouveau? Aucune erreur affichée! Cela s'est produit parce que vous avez indiqué l'emplacement du fichier .DFM dans le chemin de recherche de la bibliothèque DELPHI (répertoire RES). P>
fait! Vous pouvez utiliser votre composant et DFM se trouvera lorsque votre composant est inclus dans une application. P>
Beaucoup d'entre vous peuvent maintenant dire que de cette façon, je ne serai plus en mesure de modifier visuellement un formulaire dans le temps de conception du composant. Oui, c'est vrai, mais si vous y réfléchissez, pourquoi voudrais-je changer si souvent une forme dans une composante qui, dans la pratique, ne devrait être utilisée que légèrement modifiée? Dessinez vos propres conclusions;) p>
Wild Guess: Est-ce que Hardlinking Le fichier DFM fonctionne?
@Lrich Gerhardt - Que voulez-vous dire par "HardLinking"? Placez le contenu du fichier .DFM dans un vrai fichier .res? Je crois que cela peut fonctionner, mais je ne sais pas comment le faire;)
Voir en.wikipedia.org/wiki/hard_link . C'est une fonctionnalité de système de fichiers qui vous permet d'avoir des liens vers un fichier b> dans plusieurs répertoires et avec des noms différents.
@Lrich Gerhardt - Salut! Je crois que cela ne fonctionnera pas car les besoins Delphi des fichiers réels, mais comme cette technique semble être plus sophistiquée que de faire un lien normal, vous voudrez peut-être essayer. Si vous êtes prêt, comme le savez le plus le sujet, vous pourriez essayer de poster les résultats ici.
HMM, un test rapide indique que Delphi brise la liaison dure lors de la sauvegarde du DFM. :-(
Pourquoi préférez-vous des packages à la liaison statique? On dirait que cela vous donnera beaucoup de problèmes sans avantages.