Affichage de documents dans FoxPro
Créer une visionneuse de documents très rapide pour les anciennes applications FoxPro, sans exiger de moderniser d’abord l’application hôte.
Actualités
Parfois, la maintenance logicielle est claire et prévisible. Et parfois, ce sont dix heures face à Visual FoxPro, des contrôles ActiveX anciens, des fichiers DBF temporaires, du code compilé brouillé, des visionneuses cachées, des composants PDF qui plantent et un système de gestion du transport obstiné qui refuse de livrer ses secrets.

Parfois, la maintenance logicielle est claire et prévisible. Et parfois, elle consiste à passer dix heures face à Visual FoxPro, des contrôles ActiveX anciens, des fichiers DBF temporaires, du code compilé brouillé, des visionneuses cachées, des composants PDF qui plantent et un système de gestion du transport particulièrement obstiné, qui refuse de livrer ses secrets.
Hier, c’était le second cas.
Nous avons consacré presque une journée entière à un grave problème de stabilité de TransportMaster TMS fonctionnant dans AccountView. Les symptômes étaient flagrants. Après quelques dizaines de PDF consultés, AccountView se mettait à tourner en boucle. Les fichiers FoxPro temporaires s’accumulaient et l’état interne semblait se dégrader. Dans les pires moments, AccountView ne démarrait plus correctement et signalait des objets internes manquants et des définitions de classes corrompues. En pratique, l’environnement devenait inutilisable.
Le premier contournement était d’une simplicité désarmante : vider le dossier temporaire de l’utilisateur et réessayer. AccountView redémarrait, mais ce n’était évidemment pas une solution. C’était l’équivalent numérique de couper puis rétablir l’électricité de tout un bâtiment parce qu’un interrupteur semble hanté. Utile en urgence, beaucoup moins comme procédure d’assistance officielle.
Le problème provenait de l’ancien mécanisme d’affichage PDF dans AccountView. L’application contenait toujours sa visionneuse d’origine, masquée, reposant sur des composants anciens tels que PDFVIEW.OCX et HiQPdf.rda. Ils fonctionnaient dans un hôte Visual FoxPro, où les relations entre fenêtres, rappels COM, minuteries, fichiers temporaires, panneaux ancrables et cycles de vie ActiveX sont déterminants.
Remplacer uniquement la visionneuse visible ne suffisait pas. L’ancienne était toujours créée en arrière-plan, recevait des chemins, était redimensionnée, participait au cycle de vie des formulaires et pouvait encore déstabiliser AccountView. C’était la découverte essentielle : la nouvelle visionneuse ne remplaçait pas l’ancienne ; c’était un module supplémentaire placé dans le formulaire. La visionneuse PDF d’origine était cachée, mais toujours active.
Cela expliquait les comportements étranges : la nouvelle visionneuse pouvait être stable alors que l’ancienne corrompait encore la session en arrière-plan. C’était réparer la porte d’entrée en laissant celle de derrière grande ouverte.
La session a commencé par une erreur dans le traitement de conversion PDF vers TIFF d’AccountView :
PROCEDURE PDF_MANAGER.WRITE_PDF_AS_TIFF Error number: 1429 Cannot set the operation command. Cannot write. Error 0xE8.Nous avons d’abord soupçonné une implémentation incomplète de notre composant de substitution HiQPdf. Nous avons ajouté des journaux pour voir si AccountView appelait des fonctions ou commandes que ce composant ne gérait pas encore. La visionneuse PDF a ensuite été remplacée et testée. Pendant un moment, tout semblait stable. Puis, après suffisamment de documents parcourus, AccountView s’est remis à tourner en boucle.
Nous avons alors examiné les dossiers temporaires FoxPro, la pile des procédures chargées, le code des extensions AccountView et l’intégration de FoxDocViewer. Plus nous avancions, plus il devenait évident qu’il ne s’agissait pas d’un bug isolé, mais d’une réaction en chaîne :
À plusieurs reprises, nous avons cru le système stable. À plusieurs reprises, AccountView nous a aussitôt prouvé le contraire. L’application paraissait « réparée », puis repartait en boucle quelques instants plus tard. À un autre moment, elle ne démarrait plus et affichait :
Object TMS_LIC is not found.Ce n’est pas exactement le message encourageant que l’on espère après des heures de débogage. Mais il nous orientait vers le vrai problème : l’état de démarrage et d’enregistrement des extensions d’AccountView était devenu instable. Après réparation et réindexation des tables internes d’enregistrement et du système concernées, AccountView a redémarré. C’était le premier tournant décisif.
La solution finale ne tenait pas en une ligne magique. Il fallait renforcer toute l’interface entre AccountView, FoxPro, l’ancienne visionneuse et la nouvelle.
Les principales modifications ont été les suivantes :
Nous avons également renforcé FileDropArea, un contrôle ActiveX associé, pour la même raison. Un contrôle qui se comporte bien dans sa propre fenêtre peut rester dangereux dans AccountView. Les composants ActiveX hébergés doivent être très prudents : aucune boîte de dialogue modale inattendue, aucun rappel COM non protégé, aucune hypothèse risquée sur le glisser-déposer, aucune exception de redimensionnement ni surprise de cycle de vie.
Après les dernières corrections, nous avons testé intensivement le système sous Windows 11 Pro : plusieurs fenêtres, panneaux PDF ancrés et détachés, parcours répétés de documents, fichiers manquants, véritables chemins PDF, redimensionnements et opérations habituelles de TransportMaster.
Le résultat : une stabilité à toute épreuve.
Plus de boucles incontrôlées, d’explosion des fichiers temporaires, de visionneuse cachée cherchant à passer au premier plan, d’échec de démarrage ou de comportements aléatoires évoquant une corruption après navigation dans les enregistrements. FoxDocViewer affichait correctement les documents et restait stable pendant les tests de résistance.
Après environ dix heures de débogage, de tests, de pannes, de corrections, de nouvelles pannes, de réindexations, de recompilations et de remises en question occasionnelles de nos choix de vie impliquant COM, nous avons obtenu une solution stable et des sources propres, prêtes à transmettre.
La leçon principale est que l’intégration à un ancien système dépasse le remplacement du composant visible. Dans un environnement comme AccountView, des contrôles masqués, identités COM historiques, points d’entrée du cycle des formulaires, gestionnaires d’ancrage, minuteries et tables temporaires FoxPro peuvent continuer à agir longtemps après un remplacement supposé.
Autrement dit, si un composant reste enregistré, instancié et destinataire d’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 aussi constaté que les applications Visual FoxPro peuvent être à la fois étonnamment résistantes et impitoyables. Une mauvaise hypothèse à la frontière COM peut ressembler à un problème de base de données. Une visionneuse cachée peut faire paraître la nouvelle défectueuse. Une boîte modale ou un rappel non protégé peut déstabiliser une intégration par ailleurs correcte.
Le travail a été organisé en livrables techniques propres pour la reprise :
C’était une de ces sessions où chaque réponse soulève deux nouvelles questions et où chaque « cette fois, c’est bon » est suivi cinq minutes plus tard de « non, attendez, ça tourne encore ». Mais le système a finalement été stabilisé, les causes isolées et les composants sont désormais bien mieux préparés à fonctionner dans AccountView.
Pas mal pour un débogage du vendredi qui commençait par une visionneuse PDF et s’est transformé en expédition à travers COM, Visual FoxPro, les mécanismes internes d’AccountView et les limites du réconfort apporté par le café.
À découvrir
Créer une visionneuse de documents très rapide pour les anciennes applications FoxPro, sans exiger de moderniser d’abord l’application hôte.
Rose 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.
Tous les quelques années, le secteur du logiciel découvre un outil censé réduire le besoin de programmeurs. Dans les années 1980, c’étaient les langages de quatrième génération et les outils CASE ; dans les années 1990, la programmation visuelle ; dans les années 2000, le développement délocalisé ; dans les années 2010, le low-code et le no-code. Dans les années 2020, c’est le code généré par l’IA.