Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | 28 | 29 | 30 | | Calendrier |
|
|
| KGF_dll - nouvelles versions | |
|
+13The Gamer Nardo26 silverman Minibug Pedro mindstorm pascal10000 Jicehel papydall Jean Claude JL35 Yannick Klaus 17 participants | |
Auteur | Message |
---|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 17 Juin 2015 - 19:53 | |
| Bien docteur, je me mets à jour. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mer 17 Juin 2015 - 21:35 | |
| Petite info: l'aide de KGF.dll est maintenant disponible "en ligne", via un lien en bas à gauche de la page d'accueil de mon site, aussi bien pour le site habituel que pour le site miroir sur Olympe. Et pour un accès plus rapide, j'ai placé un raccourci sur le bureau, et un autre dans la barre personnelle de mon Firefox. Voici le lien direct vers l'aide en ligne de KGF.dll (sur le site miroir qui semble plus rapide): http://klauspanoramic.comxa.com/KGF.html?SommaireIndex.htmlCela ouvre un nouvel onglet. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: KGF_dll - nouvelles versions Mer 17 Juin 2015 - 23:08 | |
| Ce lien est bien pratique. Danke Klaus | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Mer 17 Juin 2015 - 23:23 | |
| Fonction 33 de synedit , TEST OK Je viens de l'ajouter dans GPP. Merci Klaus | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: KGF_dll - nouvelles versions Mer 17 Juin 2015 - 23:33 | |
| C'est clair, très pratique | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 19 Juin 2015 - 21:29 | |
| Question à cent sous... J' ai rencontré un souci avec mon éditeur il y a quelques temps. Lorsque je lançais un programme qui utilisait KGF.dll depuis mon éditeur, il y avait un souci. Dans le cas où je renommerai la dll par un autre nom style : KGF1.dll pour mon éditeur. Si je lance un programme qui lui utilise KGF.dll et utilise les mêmes fonctions, qu' elle sera la vérité : Cas 1 : ce sont deux dll differentes qui tournent en même temps et pas de souci Cas 2 : ce sont les mêmes fonctions, il y a un conflit. ( je suis entrain de me refaire un éditeur mais plus égoïste car il est fait pour ma façon de créer mes programmes et ne sera pas forcément très "populaire" ) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 19 Juin 2015 - 22:35 | |
| Le chargement des DLLs est une fonctionnalité de Windows et est indépendante de Panoramic. Voici ce que je puis en dire: - deux DLLs, physiquement identiques mais portant le même nom, sont des DLLs différentes pour le système. Il n'y a rien en commun entre elles - deux programmes chargeant la MEME dll, on chacun un espace de données PRIVATIF pour la DLL. Le code est partagé, mais les données sont séparées. Et la DLL est déchargée de la mémoire lorsque le dernier des programmes la libère, pas avant. Il ne peut pas y avoir de conflit. - un programme qui charge une DLL, ne peut pas savoir si un autre programme a déjà chargé cette DLL. Le chargement de la DLL, vu par un programme donné, se déroulera de la même manière, que la DLL soit déjà chargée par un autre programme ou non - le seul moyen de savoir si une DLL est actuellement chargée par un programme, c'est d'utiliser une série d'APIs de Windows, pour parcourir la liste des processus actif, et pour chaque processus, parcourir la liste des modules chargés et comparer avec le nom de la DLL cherchée. Et la liste des processus ainsi que celle des modules pour un processus donné change constamment...
Voilà pour l'essentiel. En résumé, un processus qui charge une DLL, a l'impression d'être virtuellement le seul à l'utiliser. Windows gère les alloocations de mémoire de sorte à ne charger le code exécutable de la DLL qu'une seule fois, en le partageant dans l'espace mémoire virtuel de chaque processus qui l'utilise. Mais Windows alloue une portion de mémoire spécifique pour les données de la DLL, propre à chaque processus.
Si, après un plantage d'un programme Panoramic, quelque chose reste en mémoire, c'est parce que le processus du programme Panoramic (Panoramic.exe si c'est lancé par l'éditeur...) est encore dans la liste des processus de Windows. Et quelques fois, il faut lancer le gestionnaire des tâches de Windows et cliquer sur l'onglet "Détail" pour le trouver. On peut alors supprimer ce processus devenu obsolète. Et la DLL est libérée automatiquement, à ce moment.
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 19 Juin 2015 - 22:41 | |
| Merci de ta réponse Klaus.
Le problème vient peut être alors du fait que les deux programmes utilisent l' interpréteur "Panoramic.exe" Il faudrait peut être que l' éditeur soit compilé. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 19 Juin 2015 - 22:49 | |
| Si tu lances simultanément deux programmes Panoramic par deux éditeurs Panoramic, ou par deux onglets dans le même éditeur (ça, je ne sais même pas si c'est possible...), il y aura des problèmes avec certitude. L'éditeur de Panoramic, pour chaque exécution, crée un exécutable exactement identique à ce qu'il ferait par la fonction "Exécutable", mais en le plaçant dans un dossier temporaire et en le nommant Panoramic.exe. Deux exécutions simultanées essaient de créer deux fichiers Panoramic.exe dans le même dossier. Et c'est la ratatouille assurée.
Il faut générer au moins un des deux en EXE par le menu Fichiers de l'éditeur, lancer cet exécutable et lancer l'autre par l'éditeur. Alors, plus de conflit. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 19 Juin 2015 - 22:56 | |
| Le truc Mon éditeur est un executable panoramic qui englobe donc un panoramic.exe et le programme créé avec cet executable est lui lancé par un panoramic.exe... ce qui fait que deux panoramic.exe tournent mais si les deux essais de créer dans le même temp... Heu..je ne sais pas si c' est très clair mais je vous assure que j' suis pas bourré... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 19 Juin 2015 - 23:23 | |
| En réalité, cela se présente ainsi: - Panoramic_Editor contient en interne, une copie de l'interpréteur Panoramic. Cette copie est utilisée pour créer un exécutable Windows avec l'extension EXE, en lui collant le code source de la fenêtre d'édition à la fin, crypté selon un certain algorithme. Et ceci peut être fait en 2 circonstances: soit par le menu Fichiers, fonction Exécutable, un fichier exécutable du nom donné par l'utilisateur est créé, dans le dossier de son choix. Ou alors, en cliquant sur la flèche ou par le menu Exécuter (F9), un fichier Panoramic.exe est créé avec exactement le même contenu, dans un dossier temporaire défini par Windows, mais propre à chaque utilisateur. - il y a aussi le programme d'exécution fourni par Jack, qui s'appelle malheureusement Panoramic.exe également, pour ajouter à la confusion, au lieu de s'appeler Panoramic_Excutor.exe ou Panoramic_Run.exe, par exemple. Mais techniquement, ce n'est pas un problème, car ce programme réside dans un autre dossier, et en général dans le dossier où est Panoramic_Editor.exe.
Or, pour Windows, ce qui compte, c'est le chemin complet vers l'exécutable. On peut donc très bien avoir Panoramic.exe de Jack, lancé en mode commande avec le nom d'un fichier BAS en paramètre, simultanément avec un programme lancé par l'éditeur par la touche F9. Dans le gestionnaire des tâches de Windows, leus deux apparaîtront comme Panoramic.exe car seul le nom du fichier est affiché, par le chemin complet. Mais il s'agit bien de programmes distincts, différents et indépendants.
Le problème est différent avec deux sources lancés toutes les deux par F9, simultanément. Les apparaîtront également sous le nom de Panoramic.exe. Les deux seront également des processus parfaitement distincts pour Windows. Le problème se situe au niveau de la gestion des fichiers dans le dossier de travail où les deux fichiers Panoramic.exe sont créés par Panoramic_Editor.exe. Et ce à plusieurs niveaux: - Panoramic_Editor garde une "trace" de l'exécutable qu'il a lancé par F9. Ne serait-ce que pour faire Stop. Or, le lancement du deuxième programme remplace la référence gardée vers le premier, et la synchronisation est foutue. - Que fait Panoramic_Editor.exe lorsqu'il écrit le fichier Panoramic.exe dans le dossier temporaire ? S'il existe déjà, on sait qu'il sera remplacé. Et qu'arrive-t-il au Panorami.exe créé par le premier lancement ? - si c'est le même source qui est lancé deux fois, et si ce programme crée ou utilise des fichiers en écriture, que se passe-t-il si les deux copies du même programme accèdent au même fichier ? A moins d'avoir prévu et géré cela dans le programme, c'est la cata...
Donc, conclusion: je JAMAIS produire une situation ou deux (ou plusieurs) programmes Panoramic sont actif simultanément, s'ils sont lancés par F9 à partir de l'éditeur. TOUJOURS générer des programmes exécutables avec des noms significatifs, et lancer ces exécutables par un moyen normal de Windows (double-clic dans l'explorateur des fichiers, clic sur un raccourci menant vers le fichier etc).
EDIT
C'est ainsi que j'ai fait la mise au point dfe Synedit_Editor: à chaque modification, (1) générer l'exécutable, (2) refaire le programme d'installation, (3) réinstaller dans mon dossier test, puis (4) cliquer sur l'icône de Synedit_Editor. Même si les phases 2 et 3 sont propres à des problèmes spécifiques de Synedit_Editor, les phases 1 et 4 sont indispensables dès le moment qu'il y a cohabitation avec d'autres programmes Panoramic. Penses-y - c'est très important !
Une petite remarque, encore: Jack pourrait facilement éviter ce problème en générant, non pas Panoramic.exe, mais Panoramic_hhmmss.exe, avec hhmmss étant l'heure de création. Mais en lisant ceci, il le fera peut-être... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 20 Juin 2015 - 0:17 | |
| Je pollue ton sujet et j' en suis désolé mais j' en reviens à ma marotte des modules Panoramic.exe devrait se limiter à la prévisualisation d' un programme avant sa compilation par un module de compilation. avec une seule et unique syntaxe. Ainsi, peu importe l' éditeur, on a deux modules distincts On peut même penser à une limitation par processus, 1 seul processus Panoramic.exe, si + => erreur et on doit fermer le programme en preview pour en prévisualiser un autre. Je le pense peut être à tort mais j' ai le sentiment que Jack est entrain de se perdre avec toutes ses versions. Le compilateur est d' ailleurs en retard sur les derniers objets. Une petite révolution est peut être nécessaire. Les anciens programmes peuvent très bien continuer de tourner avec l' interpreteur et on peut en faire des executables. Mais, pour avancer, peut être faut il passer sous la forme du compilateur pour nos progs. Là, si je ne prends pas les huées du public, c' est un miracle... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: KGF_dll - nouvelles versions Sam 20 Juin 2015 - 0:36 | |
| - ygeronimi a écrit:
- Là, si je ne prends pas les huées du public, c' est un miracle...
Personnellement, je ne te hue pas. Et je pense que le développement du compilateur doit avoir la priorité. Mais, le dernier mot reste au géniteur de Panoramic. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 20 Juin 2015 - 0:45 | |
| @ Papydall,
Le géniteur est entrain de nous faire des septuplés...lol ! Même sur le forum on commence à se faire des noeuds dans les sujets. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 20 Juin 2015 - 1:02 | |
| Personnellement, je ne suis pas très enthousiaste dans la perspective du compilateur. Je vais sûrement à contre-courant de l'attente fébrile de la nouveauté technique de certains, mais j'y vois de gros inconvénients.
1. Pour ma part, le gros de mon travail consiste à faire des extensions à Panoramic sous forme de DLL. Et ça, ce sera fini avec le compilateur. Plus de DLLs. Jack l'a annoncé. Du moins, dans la forme actuelle. Aucune autre approche du problème des DLLs n'a encore été annoncé, et cette ouverture au "système" a pour moi été un élément de décision capital pour le choix de Panoramic. Certes, j'aurais aimé une interface un peu plus souple, plus facile à utiliser, mais ça, ce sont des contraintes techniques avec lesquelles je sais composer. Mais perdre l'accès aux DLLs, ou changer d'interface - là, ça va me stopper net dans mon élan.
2. Les programmes compilés sont certes très intéressants pour un gain considérable de performances. Ceci est un argument important pour tout ce qui concerne des programmes intensifs en calcul (fractales, simulations, jeux 2D ou 3D etc). Mais pour moi, ce n'est pas l'usage principal de Panoramic. Pour moi, c'est à la fois l'accès facile aux fonctions système, et le développement aisé d'applications de gestion. Pour moi, plutôt de pousser vers un compilateur, j'aurais applaudi des deux mains pour une gestion de fichiers, d'enregistrements et de bases de données digne de ce nom. Mais c'est Jack qui choisit, et j'essaie de faire avec.
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 20 Juin 2015 - 1:17 | |
| On pourrait au moins se mettre d' accord pour un seul langage. peut être que si on parlait d' une seule voix, deux oreilles nous écouteraient. DOMOTICON PANGINE2D PANORAMIC ... Bon, j' arrête là la pollution. Croisé Corse et Breton, je suis plus têtu qu' un troupeau de mûles... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 20 Juin 2015 - 1:31 | |
| Si j'avais à choisir, j'opterais pour un seul langage interprété qui serait Panoramic. Toutes les fonctions y seraient accessibles, en déclarant de grands modules via des directives: #USE "2D" #USE "3D" #USE "DLL" #USE "DATABASE" (dans l'espoir d'une évolution dans ce sens...) etc
Ces "modules" seraient techniquement des DLLs que Panoramic_Editor charge s'il rencontre la directive correspondante. Et ces DLLs gèrent la syntaxe et l'exécution des commandes et fonctions qui en font partie. Ces DLLs seraient systématiquement distribuées avec Panoramic.
Un compilateur pourra être réalisé pour ce langage, en utilisant également ces mêmes DLLs, pour générer le code nécessaire, en y incluant le chargement des DLLs requises en début d'exécution du programme compilé.
Ainsi, Panoramic pourrait évoluer, dans la ou les directions voulues, simplement en faisant évoluer une DLL ou en ajoutant une DLL. C'est ainsi que Windows est construit, et c'est ainsi que fonctionnent la quasi-totalité des langages modernes. Mais c'est ma vue personnelle, et qui n'engage évidemment que moi. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 20 Juin 2015 - 1:58 | |
| En Python c' était "#Import xxx" il me semble. cela remonte à loin maintenant. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: KGF_dll - nouvelles versions Dim 21 Juin 2015 - 5:44 | |
| Du même avis que Klaus ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 21 Juin 2015 - 19:01 | |
| Salut Klaus Documentation KGF.DLL : Scripts avec Panoramic Fonction ExecuteVBSDans l’exemple donné, il manque une ligne (à la fin du code) : END_IF | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 21 Juin 2015 - 19:16 | |
| Merci, Papydall ! Cet oubli sera corrigé dans la prochaine version ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 2 Juil 2015 - 11:44 | |
| Nouvelle version: KGF.dll V4.82 du 02/07/2015Nouveautés: - nouvelle fonction ReadBinaryFileToPanoramicModules modifiés: KGF.dll KGF.chmLa doc et l'aide en lignesont à jour. Les sources seront à jour prochainement. La nouvelle fonction est documentée dans la rubrique "Gestion des fichiers binaires". Cette nouvelle fonction permet de lire une portion d'un fichier binaire dans un tableau d'entiers de Panoramic. Mais contrairement à la commande FILEBIN_BLOCK_READ de Panoramic, cette fonction remplit le tableau avec une image du contenu du fichier. Donc, chaque mot du tableau reçoit 4 octets du fichier. Et par conséquant, on lit toujours par multiples de 4 octets. Le mieux est de regarder le petit programme exemple qui lit le début de son propre source comme fichier binaire: - Code:
-
' test_ReadBinaryFileToPanoramic.bas
dim buffer%(1000) dim res%, f$, i%
dll_on "KGF.dll"
f$ = "test_ReadBinaryFileToPanoramic.bas" res% = dll_call4("ReadBinaryFileToPanoramic",adr(f$),0,20,adr(buffer%))
list 1 : full_space 1 item_add 1,"nombre="+str$(res%) for i%=0 to 20 item_add 1,str$(i%*4)+"("+hex$(i%*4)+"): "+hex$(buffer%(i%)) next i%
end
Enregistrez-le sous le nom de ReadBinaryFileToPanoramic.bas et lance-le: vous verrez un dump hexa du début du fichier, mot par mot. La taille maximale admise en lecture en une seule fois est 1024 mots, soit 4096 octets. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2015 - 1:15 | |
| Nouvelle version: KGF.dll V4.83 du 15/07/2015Nouveautés: - un nouveau module de gestion de fichiers ISAMModules modifiés: KGF.dll KGF.chmLa doc et l'aide en ligne sont à jour. Les sources sont à jour également. Ceci est un ajout majeur ! On peut maintenant gérer des fichiers multi-clés, avec des enregistrements organisés en champs, et des clés composés d'un ou plusieurs champs. Voici une petite démo sous forme d'un fichier de contacts (vous pouvez prendre, dans mon WebDav dossier Sources\KGF\, les fichiers TestISAM.DAT et TestISAM.IX et utiliser le bouton "Ouvrir", ou utiliser le bouton "Créer" pour créer un nouveau fichier vide. Le source Panoramic est ici: - Code:
-
' test_ISAM.bas
label close0 label crefic, opnfic, clsfic, copfic, envers, choix label addrec, delrec, chgnam, chgid, chgadr
dim res%, version$, no%, n%, err%, s$, sr$, sf$, inverser%, lg%, f$ dim data$, key$, nrec%, key1$, key2$
dim dll$ : dll$ = "KGF.dll" dim FName$ : FName$ = "TestISAM"
dim Isam$, IsamID%, RecLen%
dim aNRec%, aDefSiz%, aNKeys%, aNFields%, aRecLen%, Grid%, envers%, gridlig% dim eNom%, eID%, eAdresse%
full_space 0 : on_close 0,close0 no% = no% + 1 : button no% : top no%,40 : left no%, 20 : caption no%,"Créer fichier" : on_click no%,crefic no% = no% + 1 : button no% : top no%,40 : left no%,120 : caption no%,"Ouvrir fichier" : on_click no%,opnfic no% = no% + 1 : button no% : top no%,40 : left no%,220 : caption no%,"Fermer fichier" : on_click no%,clsfic no% = no% + 1 : button no% : top no%,70 : left no%, 20 : caption no%,"Copier fichier" : on_click no%,copfic
no% = no% + 1 : alpha no% : top no%, 40 : left no%,400 : caption no%,"Enregistrements:" no% = no% + 1 : alpha no% : top no%, 10 : left no%,600 : caption no%,"Taille descripteur:" no% = no% + 1 : alpha no% : top no%, 40 : left no%,600 : caption no%,"Nombre de clés:" no% = no% + 1 : alpha no% : top no%, 70 : left no%,600 : caption no%,"Nombre de champs:" no% = no% + 1 : alpha no% : top no%,100 : left no%,600 : caption no%,"Longueur enregistrement:"
no% = no% + 1 : alpha no% : top no%, 35 : left no%,500 : caption no%,"0" font_bold no% : font_size no%,12 aNRec% = no% no% = no% + 1 : alpha no% : top no%, 5 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aDefSiz% = no% no% = no% + 1 : alpha no% : top no%, 35 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNKeys% = no% no% = no% + 1 : alpha no% : top no%, 65 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNFields% = no% no% = no% + 1 : alpha no% : top no%, 95 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aRecLen% = no%
no% = no% + 1 : check no% : top no%,120 : left no%, 20 : caption no%,"Ordre inverse" envers% = no% : on_click no%,envers no% = no% + 1 : grid no% : top no%,150 : left no%, 20 : width no%,776 : height no%,255 grid% = no% : on_click no%,choix grid_row no%,500 : grid_column no%,3 : grid_column_fixed grid%,0.01 grid_one_column_width no%,1,200 grid_one_column_width no%,2,50 grid_one_column_width no%,3,500 grid_write no%,1,1,"Nom" : grid_write no%,1,2,"ID" : grid_write no%,1,3,"Adresse"
no% = no% + 1 : alpha no% : top no%,430 : left no%, 20 : caption no%,"Nom:" no% = no% + 1 : alpha no% : top no%,430 : left no%,230 : caption no%,"ID:" no% = no% + 1 : alpha no% : top no%,430 : left no%,280 : caption no%,"Adresse:" no% = no% + 1 : edit no% : top no%,460 : left no%, 20 : width no%,200 eNom% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,230 : width no%,40 eID% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,280 : width no%,500 eAdresse% = no%
no% = no% + 1 : button no% : top no%,490 : left no%,20 : caption no%,"Ajouter" : on_click no%,addrec no% = no% + 1 : button no% : top no%,490 : left no%,120 : caption no%,"Supprimer" : on_click no%,delrec no% = no% + 1 : button no% : top no%,490 : left no%,280 : width no%,120 : caption no%,"Changer nom" : on_click no%,chgnam no% = no% + 1 : button no% : top no%,490 : left no%,410 : width no%,120 : caption no%,"Changer ID" : on_click no%,chgid no% = no% + 1 : button no% : top no%,490 : left no%,540 : width no%,120 : caption no%,"Changer adresse" : on_click no%,chgadr
dll_on dll$
version$ = string$(25," ") res% = dll_call1("GetIsamVersion",adr(version$)) caption 0,"Test ISAM (B-Tree) - "+version$ n% = dll_call0("GetIsamIdentifierSize") caption aDefSiz%,str$(n%)
res% = dll_call0("InitIsam")
end
close0: if IsamID%<>0 then res% = dll_call1("CloseIsamFile",IsamID%) res% = dll_call0("FreeIsam") return
crefic: res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if res% = dll_call1("IsamFileExists",adr(FName$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+" existe déjà. Remplacer ?")<>1 then return end_if CreateIdentifier() InitContext() res% = dll_call0("GetIsamOk") if res%<0 then return
res% = dll_call2("CreateIsamFile",IsamID%,adr(FName$)) if res%<0 err% = dll_call0("GetIsamError") if res%=-1 then message "Erreur en création de base: "+str$(err%) if res%=-2 then message "Erreur en réouverture de base: "+str$(err%) return end_if AfficherEtat() gridlig% = 0 return opnfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if CreateIdentifier() res% = dll_call2("OpenIsamFile",IsamID%,adr(FName$)) if res%<0 res% = dll_call0("GetIsamError") message "Erreur en ouverture: "+str$(res%) return end_if AfficherEtat() AfficherTableau() gridlig% = 0 return
clsfic: res% = dll_call1("CloseIsamFile",IsamID%) caption aRecLen%,"0" caption aNFields%,"0" caption aNKeys%,"0" caption aNRec%,"0" EffacerTableau() gridlig% = 0 return
copfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if f$ = FName$ + "_copy" res% = dll_call1("IsamFileExists",adr(f$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+"_copy existe déjà. Remplacer ?")<>1 then return file_delete FName$+"_copy.DAT" file_delete FName$+"_copy.IX" end_if CreateIdentifier() res% = dll_call2("CopyIsamFile",IsamID%,adr(FName$)) res% = dll_call1("CloseIsamFile",IsamID%) message "Le fichier est recopié sous "+FName$+"_copy.DAT et "+FName$+"_copy.IX" return envers: inverser% = checked(envers%) AfficherTableau() return choix: lg% = grid_y_to_row(grid%,mouse_y_left_down(grid%)) if trim$(grid_read$(grid%,lg%,1))="" then return gridlig% = lg% text eNom%,grid_read$(grid%,lg%,1) text eID%,grid_read$(grid%,lg%,2) text eAdresse%,grid_read$(grid%,lg%,3) return addrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if sr$ = string$(RecLen%,"*") : ' construire la chaîne de caractères représentant l'enregistrement
s$ = trim$(text$(eNom%)) if s$="" message "Le nom manque" return end_if sf$ = " " res% = dll_call6("FillIsamField",IsamID%,1,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 1
s$ = trim$(text$(eID%)) if s$="" message "L'identifiant manque" return end_if sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(sr$),adr(s$),adr(sf$)) : ' champ 2
s$ = trim$(text$(eAdresse%)) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 3
res% = dll_call2("AddIsamRecord",IsamID%,adr(sr$)) : ' ajout dans le fichier ISAM if res%<0 err% = dll_call0("GetIsamError") message "Erreur en création "+str$(res%)+": "+str$(err%) return end_if res% = dll_call0("GetIsamRecordCount") res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) AfficherTableau() return delrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),2,adr(key$)) if message_confirmation_yes_no("Vraiment supprimer "+trim$(grid_read$(grid%,gridlig%,1))+" ?")<>1 then return res% = dll_call3("DeleteIsamRecord",IsamID%,adr(data$),nrec%) AfficherTableau() res% = dll_call0("GetIsamRecordCount") res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) gridlig% = 0 end_if return chgnam: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 key1$ = string$(20," ") res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),1,adr(key1$)) s$ = Trim$(text$(eNom%)) key2$ = Left$(s$+String$(20," "),20) res% = dll_call5("ReplaceIsamKey",IsamID%,1,nrec%,adr(key1$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "" res% = dll_call6("FillIsamField",IsamID%,1,0,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,1,trim$(key2$) AfficherTableau() else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if return
chgid: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Trim$(text$(eID%)) key2$ = Right$(String$(8,"²")+s$,8) res% = dll_call5("ReplaceIsamKey",IsamID%,2,nrec%,adr(key$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,2,trim$(text$(eID%)) else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if
return
chgadr: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Left$(Trim$(text$(eAdresse%))+string$(40," "),40) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(data$),adr(s$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) res% = dll_call0("GetIsamOk") if res%=0 grid_write grid%,gridlig%,3,trim$(s$) else res% = dll_call0("GetIsamError") message "Erreur en écriture: "+str$(res%) end_if else res% = dll_call0("GetIsamError") message "Erreur en lecture: "+str$(res%) end_if return sub CreateIdentifier() dim_local n%, i%, def$ n% = dll_call0("GetIsamIdentifierSize") Isam$ = string$(n%," ") IsamID% = dll_call1("CreateIsamIdentifier",adr(Isam$)) exit_sub for i%=0 to 3 poke adr(IsamID%)+i%,peek(adr(Isam$+i%)) next i% for i%=0 to n%-1 poke IsamID%+i%,0 next i% end_sub
sub InitContext() dim_local def$ def$ = "3,20,8,40" res% = dll_call2("SetIsamFields",IsamID%,adr(def$)) : ' définir les champs res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition des champs: "+str$(err%) end_if def$ = "1,0,1" : ' clé 1: champ 1 res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' autoriser doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition de clé 1: "+str$(err%) end_if def$ = "2,1,2" : ' clé 2: champ 2 res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' interdire doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition d clé 2: "+str$(err%) end_if end_sub
sub AfficherEtat() res% = dll_call0("GetIsamRecordLength") caption aRecLen%,str$(res%) RecLen% = res% res% = dll_call0("GetIsamFieldCount") caption aNFields%,str$(res%) res% = dll_call0("GetIsamKeyCount") caption aNKeys%,str$(res%) res% = dll_call0("GetIsamRecordCount") res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) end_sub
sub EffacerTableau() dim_local l%, c% l% = 1 while l%<500 l% = l% + 1 if trim$(grid_read$(grid%,l%,1))="" then exit_while grid_write grid%,l%,1,"" grid_write grid%,l%,2,"" grid_write grid%,l%,3,"" end_while text eNom%,"" text eID%,"" text eAdresse%,"" end_sub
sub AfficherTableau() dim_local r%, ref%, key$, data$, field$, fill$ EffacerTableau() r% = 2 ref% = 0 if inverser%=1 key$ = string$(20,chr$(255)) else key$ = string$(20," ") end_if data$ = string$(RecLen%," ") if inverser%=1 res% = dll_call3("ResetIsamKey",IsamID%,1,1) else res% = dll_call3("ResetIsamKey",IsamID%,1,0) end_if while dll_call0("GetIsamOk")=0 if inverser%=1 res% = dll_call4("ReadPreviousIsamRecord",IsamID%,adr(data$),1,adr(key$)) else res% = dll_call4("ReadNextIsamRecord",IsamID%,adr(data$),1,adr(key$)) end_if res% = dll_call0("GetIsamOk") if res%=0 if Left$(Key$,1)="²" else field$ = String$(20," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,1,adr(data$),adr(field$),adr(fill$)) key$ = field$ grid_write grid%,r%,1,trim$(field$)
field$ = String$(8," ") fill$ = "²" res% = dll_call5("ExtractIsamField",IsamID%,2,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,2,trim$(field$)
field$ = String$(40," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,3,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,3,trim$(field$)
r% = r% + 1 if r%>500 then exit_while end_if else res% = dll_call0("GetIsamError") if (res%<>10250) and (res%<>10260) then message "IsamError="+s$tr(res%) exit_while end_if end_while end_sub
Une fois le tableau chargé, vous verrez qu'un clic sur la case cocher "Ordre inverse" affiche le tableau dans le sens inverse, en parcourant la clé d'accès au fichier (le nom du contact) à l'envers. Ce n'est pas un tri ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2015 - 9:47 | |
| Super Klaus ! Je vais tacher de regarder ça dans le WE. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 18 Juil 2015 - 14:46 | |
| Nouvelle version: KGF.dll V4.84 du 18/07/2015
Nouveautés: - correction d'un bug dans OpenIsamFile - ajout d'une information dans la documentation générale du module ISAM
Modules modifiés: KGF.dll KGF.chm
La doc et l'aide en ligne sont à jour. Les sources sont à jour également. | |
| | | Contenu sponsorisé
| Sujet: Re: KGF_dll - nouvelles versions | |
| |
| | | | KGF_dll - nouvelles versions | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |