1 pièce(s) jointe(s)
Utilisation d'un TStringGrid dans une DLL
J'utilise Delphi 6 Personal Edition pour créer des DLLs avec des fonctions destinées à étendre les capacités d'un langage de programmation différent. A ce jour, j'ai réalisé plusieurs centaines de fonctions dans des domaines très divers. En ce moment, j'essaie de donner plus de souplesse au langage en question,, pour gérer des TStringGrid.
Il s'agit d'un TStringGrid créé dans le programme principal. Cet objet est ensuite passé en paramètre à des fonctions de la DLL pour effectuer certaines opérations qui ne sont pas actuellement accessibles dans ce langage. Beaucoup de choses marchent bien: passer en mode "saisie directe" dans une cellule, choisir des couleurs personnalisées pour des lignes, des colonnes et/ou des cellules, retourner les coordonnées du rectangle de cellules sélectionnées, retourner l'ensemble du contenu des cellules d'un rectangle de sélection, sous forme d'un string formaté, etc.
Mais je me heurte à un problème lorsque je veux modifier le contenu des cellules d'un rectangle de cellules donné. Cela marche bien au premier appel, quelque fois même au deuxième. Mais au plus tard au troisième appel de la fonction, j'ai une violation de mémoire, au moment où j'affecte une chaîne de caractères à une cellule du TStringGrid. Quelque soient ses coordonnées, son ancien ou nouveau contenu, etc.
J'ai fait un fichier ZIP contenant deux projets Delphi 6 Personal Edition:
KGF_GRID.dpr qui est le projet pour KGF_GRID.dll
test_KGF_GRID.dpr qui est le projet pour le programme de test qui utilise la DLL
KGF_GRID.dll contient une seule fonction: celle qui pose problème. Tout est concentré sur le problème, et test_KGF_GRIG ne contient que le strict nécessaire pour exécuter la démo: un objet TStringGrid, un bouton pour lancer le test, et une checkbox pour afficher ou non des messages de traçage.
Il suffit de cliquer deux ou 3 fois sur le bouton pour provoquer le crash. Il a lieu dans la ligne suivante:
Code:
TStringGrid(grid).Cells[x,y] := sa[i]; // remplacer les des données dans le TStringGrid
alors qu'au premier passage, ça passe bien et le résultat affiché est correct. Tout se passe comme si le fait de modifier les données changeait des pointeurs qui ne sont pas "repris" par l'objet dans le programme principal.
Qu'est-ce que j'ai raté ? Car j'ai forcément négligé un détail technique significatif.