Afficher des documents dans FoxPro
Créer un lecteur de documents rapide pour des applications FoxPro existantes, sans devoir moderniser au préalable l’ensemble de l’application hôte.
Lire la suiteActualités
La maintenance logicielle est parfois prévisible. Parfois, elle exige dix heures dans Visual FoxPro, d’anciens contrôles ActiveX, des fichiers DBF temporaires, du code compilé obscurci, des visionneuses cachées, des composants PDF instables et un système de gestion du transport particulièrement tenace.

Parfois, la maintenance du logiciel est un travail propre et prévisible. Et parfois, c'est dix heures de regarder dans Visual FoxPro, les contrôles ActiveX hérités, les fichiers DBF temporaires, le code compilé scramblé, les téléspectateurs cachés, les composants PDF en panne, et un système de gestion des transports très têtu qui refuse de s'expliquer.
Hier, c'était le deuxième type.
Nous avons passé presque toute une journée de travail à enquêter sur un grave problème de stabilité TransportMaster TMS en cours d'exécution à l'intérieur AccountViewLes symptômes n'étaient pas subtils. Après avoir parcouru quelques dizaines de documents PDF, AccountView commençait à se déchirer. Les fichiers temporaires FoxPro s'accumulaient. L'état interne semblait devenir instable. Dans les pires moments, AccountView ne démarrait plus correctement et signalait des erreurs telles que des objets internes manquants et des définitions de classes corrompues.
La première solution était douloureusement simple: supprimer les fichiers dans le répertoire temporaire de l'utilisateur et essayer à nouveau. Cela a fait que AccountView redémarre, mais bien sûr, ce n'est pas une solution. C'est l'équivalent numérique d'éteindre et de redémarrer l'alimentation du bâtiment parce qu'un interrupteur lumineux est hanté. Utilisant en cas d'urgence, ce n'est pas exactement quelque chose que vous voulez documenter comme une procédure de support.
La racine du problème était l'ancien pipeline d'affichage PDF à l'intérieur AccountView. AccountView contenait toujours son affichage PDF caché d'origine, basé sur des composants anciens tels que Les résultats de la recherche et Résultats de l'enquête. Ces composants étaient utilisés dans un environnement hôte Visual FoxPro où la propriété des fenêtres, les rappels COM, les temporisateurs, les fichiers temporaires, les panneaux d'accueil et le comportement du cycle de vie ActiveX sont tous importants.
Le vieil spectateur était encore en train d'être créé dans les coulisses, recevant toujours des chemins, redimensionnant toujours, participant toujours au cycle de vie du formulaire, et toujours capable de déstabiliser AccountView. C'était la découverte importante: le nouveau spectateur n'était pas un substitut pour l'ancien. Le lecteur PDF original AccountView était caché, mais toujours vivant.
Cela expliquait le comportement étrange: le nouveau téléspectateur pouvait être stable, mais l'ancien téléspectateur caché pouvait encore corrompre la session. C'était comme réparer la porte d'entrée alors que la porte arrière était encore largement ouverte.
La session a commencé par une erreur dans le chemin PDF-TIFF AccountViews:
PROCEDURE PDF_MANAGER.WRITE_PDF_AS_TIFF Numéro d'erreur: 1429 Impossible de définir la commande d'opération. Impossible d'écrire. Erreur 0xE8.Au début, le soupçon était que le fichier HiQPdf était incomplet. La saisie a été ajoutée afin que nous puissions voir si AccountView appelait dans des fonctions ou des chemins de commande que notre fichier n'a pas encore mis en œuvre. Puis le contrôle du spectateur PDF a été remplacé et testé. Pendant un court moment, il a semblé stable. Puis, après avoir parcouru suffisamment de documents, AccountView a commencé à tourner à nouveau.
Nous avons ensuite inspecté les annuaires temporaires FoxPro, la pile de procédures chargée, le code add-in AccountView et la nouvelle intégration FoxDocViewer.
Plusieurs fois, nous avons pensé que le système était stable. Plusieurs fois AccountView a immédiatement prouvé le contraire.
L'objet TMS_LIC n'a pas été trouvé.Ce n'était pas exactement le message de motivation que l'on espérait après des heures de débogage. Mais il nous a poussés vers le vrai problème: AccountView l'état de démarrage et d'ajout d'enregistrement était devenu instable. Une fois que nous avons réparé et réindexé les tables d'enregistrement / système internes pertinentes, AccountView a repris. C'était le premier tournant majeur.
La solution finale n'était pas une seule ligne magique, c'était un passage durcissant à travers toute la frontière entre AccountView, FoxPro, l'ancien spectateur et le nouveau spectateur.
Les changements les plus importants ont été:
Nous avons également durci un contrôle ActiveX connexe, le composant FileDropArea, pour la même raison. Un contrôle qui se comporte bien dans sa propre fenêtre peut toujours être dangereux à l'intérieur de AccountView. Les composants ActiveX hébergés doivent être extrêmement conservateurs: pas de dialogues modaux inattendus, pas de rappels COM non surveillés, pas d'hypothèses dangereuses de glisser/déposer, pas d'exceptions de redimensionnement et pas de surprises de cycle de vie.
Après les corrections finales, le système a été fortement testé sur Windows 11 Pro avec plusieurs Windows, des panneaux d'affichage PDF accostés et déconnectés, des défilements répétés à travers les documents, des documents manquants, des pistes PDF réelles, des actions de redimensionnement et des flux de travail TransportMaster normaux.
Le résultat: stable comme une pierre.
Pas de rotation. Pas d'explosion de fichier temporaire. Pas de spectateur caché se battant pour la couche supérieure. Pas d'échec de démarrage AccountView. Pas de comportement de corruption aléatoire après avoir parcouru les enregistrements. Le nouveau FoxDocViewer a montré les documents correctement et est resté stable à travers les tests de stress.
Après environ dix heures de débogage, de test, de rupture, de réparation, de rupture, de réindexation, de recompillage et parfois de remise en question de tous les choix de vie impliquant des commandes COM héritées, nous avons terminé avec une solution stable et des paquets de source propres.
La plus grande leçon est que le travail d'intégration traditionnelle ne consiste pas seulement à remplacer le composant visible. Dans un cadre comme AccountView, les commandes cachées, les anciennes identités COM, les crochets du cycle de vie du formulaire, les gestionnaires d'accostement, les temporisateurs et les tables templates FoxPro peuvent tous continuer à participer longtemps après que vous pensiez avoir remplacé quelque chose.
En d'autres termes: si un ancien composant est toujours enregistré, instantané et reçoit encore des appels de redimensionnement ou de navigation, il fait toujours partie du système, même si personne ne l'a invité à la réunion.
Nous avons également appris que les applications Visual FoxPro peuvent être impressionnantes et extrêmement impitoyables en même temps. Une hypothèse erronée à la frontière COM peut ressembler à un problème de base de données. Un spectateur caché peut faire apparaître un nouveau spectateur cassé. Un dialogue modal ou un callback non surveillé peut déstabiliser une intégration autrement correcte.
Les travaux ont maintenant été transformés en matériel technique approprié:
C'était une de ces séances où chaque réponse a créé deux nouvelles questions, et chaque this must be it a été suivi cinq minutes plus tard par no, wait, it's still spinning. Mais à la fin, le système a été stabilisé, les causes profondes ont été isolées, et les composants finaux sont maintenant beaucoup mieux adaptés à survivre à l'intérieur du cadre AccountView.
Pas mal pour une session de débogage du vendredi qui a commencé avec un lecteur PDF et s'est brièvement transformée en une expédition complète à travers l'héritage COM, Visual FoxPro, AccountView internes, et les limites émotionnelles du café.
À découvrir
Créer un lecteur de documents rapide pour des applications FoxPro existantes, sans devoir moderniser au préalable l’ensemble de l’application hôte.
Lire la suiteRose Development a un nouveau site. Plutôt qu’une annonce générale, nous expliquons les choix techniques qui le structurent, car le site illustre concrètement notre manière d’aborder chaque projet.
Lire la suiteTous les quelques années, un nouvel outil promet de rendre les programmeurs presque inutiles : 4GL, CASE, offshore, low-code puis génération de code par IA. Pourquoi cette vague n’est-elle pas fondamentalement différente ?
Lire la suite