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 | |
|
+12JL35 Oscaribout bignono Pedro pascal10000 silverman Jicehel papydall Minibug Marc Yannick Klaus 16 participants | |
Auteur | Message |
---|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 8:24 | |
| Bonjour Klaus ! Bravo, tout fonctionne correctement avec ton premier code ! Par contre avec le 2eme code, il y a un problème dans le déplacement du PICTURE ?! Certainement un problème de programmation, mais je n'ai pas regardé le code. Je n'ai pas beaucoup de temps je dois partir au boulot. Bonne journée ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 9:18 | |
| En sélection unique, ou fondue dans une sélection multiple, je ne constate pas d'anomalie sur le picture... J'ai acutualisé le code dans le post ci-desssus, à tout hasard. On verrra lorsque tu auras l'occasion de m'en dire plus. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 19:42 | |
| bonsoir Klaus ! Voila comment reproduire le bug : 1 - je lance le programme (le second dans ton message) avec la sélection d'un seul objet seul par defaut 2 - je déplace le PICTURE par l’icône flèche en haut à gauche et là le picture se déplace direct tout en haut à gauche en plus on voit une main (icône ?) apparaître ?! Sinon tout fonctionne a priori parfaitement avec le premier programme. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 19:54 | |
| Je ne comprends pas, parce que chez moi, ça marche très bien. J'ai peut-être cafouillé en mettant à jour mes sites et mon WebDav. A tout hasard, j'ai remis KGF.dll sur le WebDav et KGF.zip sur les deux sites. Peux-tu essayer à nouveau, après avoir rechargé la DLL ? Je suis à la version KGF.dll V08.32 10/01/2018 produite ce jour à 19h47 (eh oui, pour l'occasion, j'ai regénéré la DLL). | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 20:30 | |
| En regardant d'un peu plus près le problème se pose sur les 2 programmes ! Je le rencontre uniquement avec le PICTURE c'est bizarre. Dès que je déplace de quelques pixels la souris, le PICTURE se déplace directement en haut à gauche et la main apparaît. Cette main semble indiquer que le clic reste bloqué, comme si je maintenais la touche de la souris enfoncé !? Ensuite j'ai beaucoup de mal à déplacer le picture en maintenant appuyé la souris sur l’icône fléché. Pour y arriver je doit plutôt sélectionné le cadre à la souris. En plus les déplacements produisent des traînés de l'objet ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 20:43 | |
| Bonjour Klaus et Minibug,
Pour info, je confirme avoir le même dysfonctionnement que Minibug. DLL téléchargée et mise à jour à 20h00 ce soir.
Merci pour tout, Klaus, et bonne continuation. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 21:06 | |
| J'ai beau tester, je n'arrive pas à produire ce problème du picture qui "saute" en haut à gauche avec une main qui apparaît, que ce soit en tirant l'icône du ObjectMover ou en tirant le cadre jaune du Designer. J'ai généré le programme en EXE et placé sur mon WebDav, dossier DLLs: pb_designer.zip. Pourrais-tu essayer avec ça stp ?
En ce qui concerne les traces blanches, je ne les avais pas remarqué jusqu'alors, et elles n'apparaissent que si l'on déplace l'objet "rapidement". Et encore - chez moi, ça n'arrive que lors d'un déplacement par l'icône, pas par le cadre. Chez toi aussi ? Je vais en chercher la cause. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 21:39 | |
| Choses importante : le problème ne se pose qu'en tirant l'icône du ObjectMover
J'ai téléchargé sur le WebDav le fichier pb_designer.zip.
Après exécution du fichier, il n'y a plus de bug ! Juste quelques zones blanches comme déjà constatées, mais plus de bug à proprement parlé !
As tu une idée du pourquoi ?
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 21:42 | |
| Quelle est ta version de Panoramic ? | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 21:49 | |
| 832 correspond à KGF.dll V08.32 10/01/2018 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 21:55 | |
| Ca, c'est KGF.dll. Je voulais connaître la version de Panoramic_Editor. Chez moi, c'est: | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:00 | |
| Désolé Klaus. J'ai la tête en l'air... J'ai la même version que toi, la dernière. 0.9.28i12 du 8 juillet 2017. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:01 | |
| Nouvelle version: KGF.dll V8.33 du 11/01/2018
Nouveautés: - Designer: suppression des traces blanches en déplaçant rapidement un picture par l'ObjectMover
Modules modifiés: KGF.dll
La doc est inchangée. Les sources sont à jour. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:02 | |
| - Citation :
- Désolé Klaus. J'ai la tête en l'air...
J'ai la même version que toi, la dernière. 0.9.28i12 du 8 juillet 2017. Alors, je n'ai aucune idée, pour le moment. En attendant, j'ai corrigé le problème des traces blanches... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:08 | |
| Je viens de télécharger la dernière version... et miracle, tout fonctionne correctement !? Plus de traces et plus de déplacements incohérents. c'est super! Par contre, je n'y comprends rien... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:15 | |
| Eh bien, n'y touchons plus... Des fois, il n'y a rien à comprendre. Ca marche, tant mieux. Je respire... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 11 Jan 2018 - 22:21 | |
| | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: KGF_dll - nouvelles versions Mar 16 Jan 2018 - 10:11 | |
| Bonjour Klaus, Je crois qu'il y a un problème avec la fonction "TorturePicture" le picture est tronqué à l'affichage si je change les valeurs HG$ et HD$ Regarde si je change les valeurs de ton exemple dans kgf HD$="400,100" au lieu de "400,0" et HG$="0,100" au lieu de "100,0" le résultat donne qu'on ne voit pas le haut du picture et on a l'impression que la hauteur gauche et droite commence à 0 au lieu de 100. Et on constate bien que le picture 1 n'a plus la dimension de 600 de largeur par 400 de hauteur mais 600 par 300, alors que le message panoramic de la hauteur nous renvoie bien 400. Il suffit de comparer avec le picture 2 en gris à coté! Voici ton exemple où j'ai changé tes valeurs HG$ et HD$ et où j'ai rajouté un second picture pour comparaison: - Code:
-
dim res% , HD$, HG$, BG$, BD$ width 0,1216 picture 1 : height 1,400 : width 1,600 file_load 1,"c:\temp\Palette.bmp": ' ===> à adapter
picture 2:left 2,600:height 2,400:width 2,600: color 2,120,120,120
DLL_ON "C:\TEST\KGF830.dll": ' ===> à adapter
clipboard_copy 1 res% = dll_call0("LoadPicture") ' HD$ = "400,0" ' HG$ = "100,0" ' BG$ = "0,399" ' BD$ = "599,399"
HD$ = "400,100" HG$ = "0,100" BG$ = "0,399" BD$ = "599,399"
' tranformer l'image en losange
res% = dll_call4("TorturePicture",adr(HG$),adr(HD$),adr(BD$),adr(BG$)) res% = dll_call0("SavePicture") clipboard_paste 1 message "picture 1= "+str$(height(1))+chr$(9)+chr$(13)+"picture 2= "+str$(height(2))
A + | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 16 Jan 2018 - 11:42 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 16 Jan 2018 - 19:28 | |
| Nouvelle version: KGF.dll V8.34 du 16/01/2018Nouveautés: - documentation des fonctions: WBSetBrowserType, WB_SetBrowserType - nouvelles fonctions: WBExecuteJavaScript, WB_ExecuteJavaScriptModules modifiés: KGF.dll KGF.chmLa doc et les sources sont à jour. Les fonctions WBSetBrowserType et WB_SetBrowserType existaient depuis longtemps, mais pour une raison qui m'échappe, elles n'ont pas été documentées. Voilà qui est fait. Par contre, les fonctions WBExecuteJavaScript et WB_ExecuteJavaScript sont de vraies nouveautés. Elles permettent d'exécuter du code JavaScript à partir de Panoramic, dans le contexte d'un browser. Seul un browser de type Mozilla Firefox est utilisable pour cela. En effet, dans le browser Internet Explorer intégrable (WebBrowser), la gestion des JavaScript est définitivement désactivé par MicroSoft. Voici une démo d'exécution de JavaScript. On saisit le code JavaScript dans le mémo, puis on clique sur le bouton "Exécuter". Par défaut, le code JavaScript affiche une petite boite de dialogue avec un message. Mais on peut mettre n'importe quel JavaScript complet et valide: - Code:
-
' JavaScript_avec_WebBrowser.bas
label exec, close0
dim res%, WB%, jscript$, url$
on_close 0,close0
dll_on "KGF.dll" button 1 : caption 1,"Exécuter" : on_click 1,exec memo 2 : full_space 2 : height 2,height_client(0)-30 : top 2,30 text 2,"alert("+chr$(34)+"Hello"+chr$(34)+");"
end
close0: if WB%<>0 then res% = dll_call1("WB_Delete",WB%) return
exec: jscript$ = text$(2) if jscript$="" then return ' res% = dll_call1("WB_SetBrowserType",0) : ' iexplore res% = dll_call1("WB_SetBrowserType",1) : ' Mozilla if WB%=0 then WB% = dll_call1("WB_Create",handle(0)) res% = dll_call2("WB_ExecuteJavaScript",WB%,adr(jscript$)) return | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 28 Jan 2018 - 11:56 | |
| Nouvelle version: KGF.dll V8.35 du 28/01/2018Nouveautés: - nouvelle fonction: GetActiveMemoLine - nouveau système de gestion de fichiers (base de données): KBDD et ses fonctions de gestionModules modifiés: KGF.dll KGF.chmLa doc et les sources sont à jour. L'ensemble représente 23 nouvelles fonctions. C'était un gros morceau, et ceci explique mon silence depuis une bonne semaine. J'ai profite de cette nouvelle version pour comencer une restructuration de KGF.hlp, et je vais la poursuivre. Pour cette fois, j'ai réuni dans une seule rubrique "Gestion de fichiers" l'ensemble des outils qui s'y rapportent, y compris la nouvelle base de données KBDD. La fonction GetActiveMemoLine est documentée dans la section "Objets", rubrique "GRID, LIST et COMBO". Elle retourne le numéro de ligne dans laquelle se trouve le curseur dans un mémo. Ceci marche pour un mémo Panoramic, mais également pour un mémo d'un programme externe pourvu qu'on connaisse le handle. KGF.dll donne des fonctions permettant de connaître le handle de tout objet sous le curseur, par exemple... Cette fonction permet d'utiliser un MEMO comme un LIST, en récupérant la ligne sélectionnée lors d'un clic dans un MEMO. Mais le gros morceau est KBDD. Ce n'est pas vraiment une base de données, pour être honnête. C'est un fichier ISAM (Indexed Sequential Access Method) multi-clé à lecture bi-directionnelle, mais avec uen fonction de recherche permettant de constituer des collections d'enregistrements en fonction de critères de recherche façon "Query' - un ou plusieurs criitères du type "champ / opérateur / valeur", qui s'appliquent sur tous les enregsitrements. Du genre "trouver tous les clients du Loiret dont les commandes impayées dépassent 100 euros". Un seu appel à une fonction permet de trouver cela. Mieux, de conserver le résultat dans la base elle-même pour utilisation ultérieure. Le point le plus important, c'est que tout se fait entièrement en mémoire, ce qui conduit à de très binnes performances. Certes, ce n'est pas prévu pour des très grosses quantités de données, comme des bases de 3 Go etc. Encore que - cela dépend uniquement de la taille mémoire disponible et de la charge et de la puissance de l'unité centrale. Techniquement, il n'y a pas de limitations. On peut ouvrir plusieurs bases de ce type simultanément. Là encore, seule les capacités physiques de la machine vont fixer les limites. Techniquement, gérant simultanément 1, 2, 20 ou 100 bases - c'est pareil. Comme tout se déroule en mémoire, il y a une fonction spécifique pour sauvegarder une base sur disque, dans un fichier. Ce sera un simple fichier texte, dont la structure est décrite dans la documentation. Mais je déconseille vivement d'intervenir dans un tel fichier via un éditeur de texte - le moindre décalage le rendra inutilisable. Assez de baratin. Consultez la documentation que j'ai conçue assez précise. Voici une démo, avec l'éternel exemple d'un fichier des contacts. Cette base fonctionne avec 3 clés d'acces: "Nom/Prénom", "Code postal" et "Ville". Quelques précisions sur l'utilisation: - comme il s'agit d'une base "in memory", il faut toujours commencer par le bouton "Créer" qui crée une nouvelle base vide en mémoire. C'est le "brouillon" dans lequel on travaille. - ensuite, il faut "peupler" la base. Pour cela, renseigner les champs Nom, Prénom, Né(e) le, Adresse 1, Adresse 2, Code postal, Ville, Téléphone et Mail, puis cliquer sur "Ajouter". On verra le mémo "Statut" évoluer en fonction des ajouts. - après quelques ajouts, on peut commencer à exploiter la base, en effectuant des lecturs (recherches). - lecture en accès direct (numéro d'enregistrement): renseigner la combo "ID", puis cliquer sur "ReadID". Puis, utiliser les boutons "Read next" ou Read prev" pour parcourir la base dans le sens indiqué par le bouton. Le mémo "Status" est toujours actualisé, et le mémo "Résultat" donne le résultat de la lecture (ou l'erreur) - pour une recherche par clé d'accès, renseigner l'une ou l'autre des zones pour les indexes (Adresse 1 et Adresse 1, Code postal ou Ville) puis cliquer respectivement sur les boutons "Lire index 0", "Lire index 1" ou "Lire index 2". Là encore, les mémos "Status" et "Resultat" reflètent l'action. - les boutons "Prédédant" et "Suivant" permettent de reculer ou d'avancer dans la base, mais dans l'odre du dernier index utilisé. C'est comme si l'on travaillait sur un fichier trié selon ce critère. - il est temps de créer une version disque de la base et de la sauvegarder. Pour cela, cliquer sur le bouton "Sauver". Pas spectaculaire comme action, mais un fichier Test_de_KBDD.KBDD est créé dans le dossier par défaut. - modifier des données: lire un enregistrement par un moyen quelconque, changer le contenu de certaines zones (même celles qui sont des clés d'accès !), pujis cliquer sur "Maj". Le mémo "Statut" sera actualisé. - supprimer un enregistrement: lire un enregistrement par un moyen quelconque, puis cliquer sur le bouton "Supprimer". Le statut sera actualisé. On peut même le dé-supprimer: bouton "Restaurer" ! Ceci marche,, même après avoir fait une sauvegarde, arrêté le programme, relancé le programme (refaire "Créer" puis "Charger"), puis relire l'enregistrement supprimé par son ID (génère une erreur mais positionne sur cet enregistrement), puis bouton "Restaurer" ==> m'enregistrement est disponible à nouveau - compression des données: la suppression et la mise à jour génèrent des "trous" (enregistrements logiquement supprimés mais phiysiquement occupant de l'espace). Le bouton "Tasser" permet d'éliminer tous ces "cadavres", mais bien sûr, il n'est plus possible après cela de restaurer les enregistrements supprimés. - et finalement, le travail avec les collections: 1. rentrer un nom quelconque pour une collection 2. rentrer une ligne dans chacun des 3 mémos "Champs", "Opérateurs" et "Valeurs", puis cliquer sur "Query". Le résultat s'affiche à droite et le statut est actualisé. Exemple (dépendant des adresses que vous avez créées, bien sûr !): Dans le mémo champs, rentrez 2 lignes identiques avec "Codepostal" (sans les guillemets) Dans le mémo opérateurs, rentrez une ligne ">=" et une ligne "<=" (sans les guillemets) Dans le mémo valeurs, rentrez une ligne "45000" et une ligne "45999" (sans les guillemets) On obtient tous les enregistrements localisés dans le Loiret. On peut utiliser les noms des champs définis pour la pase dans le mémo "Champs" (on les voit dans le mémo "Statut"). - on peut créer plusieurs collections. Le statut va les refléter, et un mémo "Collections" en haut à droite va afficher les noms de toutes les collections présentes. On clic sur une ligne de ce mémo va afficher les détails de la collection dans les zones en pas concernées par la collection (c'est l'utilisation de la nouvelle fonction GetActiveMemoLine) Voici le code: - Code:
-
' test_KBDD.bas
' démo à l'aide d'un carnet d'adresses: ' Nom = 40 car. Clé 0 ' Prénom = 40 car. Clé 0 ' Date de naissance = 8 car. ' Adresse = 2 x 40 car. ' Code postal = 5 car. Clé 1 ' Ville = 40 car. Clé 2 ' Tél. = 10 car. ' Mail = 40 car. ' ' L'appel de GetInfoKBDD ne sert à rien fonctionnellement. ' C'est juste l'affichage de l'état interne de KBDD, pour information.
label creer, sauver, charger, squeeze, ajouter, lireID, lireNextID, lirePrevID label precedent, suivant, query, supprimercollection, SelectCollection label LireIndex0, LireIndex1, LireIndex2, maj, supprimer, restaurer
dim res%, KBDD%, NomKBDD$, no%, PathKBDD$, IndexKBDD$, RecordKBDD$,FieldKBDD$ dim blanc$, aRecord$ dim s1$, s2$, i%, j%, ok%, sQuery$ dim hmemoStatut%, hmemoResultat%, hmemoCollections% dim hmemoChamps%, hmemoOperateurs%, hmemoValeurs%, hmemoCollection% dim noChamps%, noOperateurs%, noValeurs%, noCollection%, noOperateursPossibles% dim noListeCollections% dim noNomCollection%, NomCollection$ dim noResult%, noID%, ID%, cle$
blanc$ = string$(255," ") aRecord$ = string$(40+40+8+80+5+40+10+40," ")
full_space 0
no% = 1 : button no% : caption no%,"Créer" : on_click no%,creer no% = no% + 1 : button no% : left no%,left(no%-1)+width(no%) : caption no%,"Sauver" : on_click no%,sauver no% = no% + 1 : button no% : left no%,left(no%-1)+width(no%) : caption no%,"Charger" : on_click no%,charger no% = no% + 1 : button no% : left no%,left(no%-1)+width(no%)+30 : caption no%,"Tasser" : on_click no%,squeeze
no% = no% + 1 : alpha no% : top no%,40 : left no%,10 : caption no%,"Nom:" edit 1001 : top 1001,40 : left 1001,100 : width 1001,300 no% = no% + 1 : alpha no% : top no%,65 : left no%,10 : caption no%,"Prénom:" edit 1002 : top 1002,65 : left 1002,100 : width 1002,300 no% = no% + 1 : alpha no% : top no%,90 : left no%,10 : caption no%,"Né(e) le:" edit 1003 : top 1003,90 : left 1003,100 : width 1003,100 no% = no% + 1 : alpha no% : top no%,90 : left no%,220 : caption no%,"( aaaammjj )" no% = no% + 1 : alpha no% : top no%,115 : left no%,10 : caption no%,"Adresse:" edit 1004 : top 1004,115 : left 1004,100 : width 1004,300 edit 1005 : top 1005,140 : left 1005,100 : width 1005,300 no% = no% + 1 : alpha no% : top no%,165 : left no%,10 : caption no%,"Code postal:" edit 1006 : top 1006,165 : left 1006,100 : width 1006,100 no% = no% + 1 : alpha no% : top no%,190 : left no%,10 : caption no%,"Ville:" edit 1007 : top 1007,190 : left 1007,100 : width 1007,300 no% = no% + 1 : alpha no% : top no%,215 : left no%,10 : caption no%,"Téléphone:" edit 1008 : top 1008,215 : left 1008,100 : width 1008,100 no% = no% + 1 : alpha no% : top no%,240 : left no%,10 : caption no%,"Mail:" edit 1009 : top 1009,240 : left 1009,100 : width 1009,300
no% = no% + 1 : alpha no% : top no%,40 : left no%,430 : caption no%,"Statut:" no% = no% + 1 : memo no% : top no%,40 : left no%,470 : width no%,300 : height no%,300 : bar_both no% hmemoStatut% = handle(no%) no% = no% + 1 : alpha no% : top no%,40 : left no%,800 : caption no%,"Résultat:" no% = no% + 1 : memo no% : top no%,40 : left no%,850 : width no%,200 : height no%,300 : bar_both no% hmemoResultat% = handle(no%) : noResult% = no% no% = no% + 1 : alpha no% : top no%,40 : left no%,1070 : caption no%,"Collections:" no% = no% + 1 : memo no% : top no%,40 : left no%,1130 : width no%,200 : height no%,300 : bar_both no% : on_click no%,SelectCollection hmemoCollections% = handle(no%) : noListeCollections% = no% no% = no% + 1 : button no% : top no%,280 : caption no%,"Ajouter" : on_click no%,ajouter no% = no% + 1 : button no% : top no%,280 : left no%,left(no%-1)+width(no%-1) : caption no%,"Lire index 0" : on_click no%,LireIndex0 no% = no% + 1 : button no% : top no%,280 : left no%,left(no%-1)+width(no%-1) : caption no%,"Lire index 1" : on_click no%,LireIndex1 no% = no% + 1 : button no% : top no%,280 : left no%,left(no%-1)+width(no%-1) : caption no%,"Lire index 2" : on_click no%,LireIndex2 no% = no% + 1 : button no% : top no%,280 : left no%,left(no%-1)+width(no%-1) : caption no%,"Maj" : on_click no%,maj no% = no% + 1 : button no% : top no%,280 : left no%,left(no%-1)+width(no%-1) : caption no%,"Supprimer" : on_click no%,supprimer no% = no% + 1 : button no% : top no%,305 : left no%,left(no%-1) : caption no%,"Restaurer" : on_click no%,restaurer
no% = no% + 1 : button no% : top no%,305 : left no%,110 : caption no%,"Précédent" : on_click no%,precedent no% = no% + 1 : button no% : top no%,305 : left no%,left(no%-1)+width(no%-1) : caption no%,"Suivant" : on_click no%,suivant
no% = no% + 1 : alpha no% : top no%,360 : caption no%,"ID:" no% = no% + 1 : spin no% : top no%,360 : left no%,20 : width no%,100 : min no%,0 : max no%,3000 : position no%,0 noID% = no% no% = no% + 1 : button no% : top no%,360 : left no%,left(no%-1)+width(no%)+25 : caption no%,"Read ID" : on_click no%,lireID no% = no% + 1 : button no% : top no%,360 : left no%,left(no%-1)+width(no%) : caption no%,"Read next" : on_click no%,lireNextID no% = no% + 1 : button no% : top no%,360 : left no%,left(no%-1)+width(no%) : caption no%,"Read prev" : on_click no%,lirePrevID
no% = no% + 1 : dlist no% : noOperateursPossibles% = no% no% = no% + 1 : alpha no% : top no%,400 : caption no%,"Création de collections: Nom:" no% = no% + 1 : edit no% : top no%,400 : left no%,160 : noNomCollection% = no% no% = no% + 1 : button no% : top no%,400 :left no%,left(no%-1)+width(no%) : caption no%,"Supprimer" : on_click no%,supprimercollection no% = no% + 1 : alpha no% : top no%,430 : caption no%,"Champs:" no% = no% + 1 : memo no% : top no%,450 : width no%,150 : height no%,200 hmemoChamps% = handle(no%) : noChamps% = no% no% = no% + 1 : alpha no% : top no%,430 : left no%,left(no%-1)+width(no%-1)+10 : caption no%,"Opérateurs:" no% = no% + 1 : memo no% : top no%,450 : left no%,left(no%-1) : width no%,60 : height no%,200 hmemoOperateurs% = handle(no%) : noOperateurs% = no% no% = no% + 1 : alpha no% : top no%,430 : left no%,left(no%-1)+width(no%-1)+10 : caption no%,"Valeurs:" no% = no% + 1 : memo no% : top no%,450 : left no%,left(no%-1) : width no%,200 : height no%,200 hmemoValeurs% = handle(no%) : noValeurs% = no% no% = no% + 1 : button no% : top no%,top(no%-1)+height(no%-1)/2-10 : left no%,left(no%-1)+width(no%-1)+10 : caption no%,"Query" : on_click no%,query no% = no% + 1 : alpha no% : top no%,430 : left no%,left(no%-1)+width(no%-1)+10 : caption no%,"Collection:" no% = no% + 1 : memo no% : top no%,450 : left no%,left(no%-1) : width no%,60 : height no%,200 hmemoCollection% = handle(no%) : noCollection% = no% item_add noOperateursPossibles%,"=" item_add noOperateursPossibles%,"<" item_add noOperateursPossibles%,">" item_add noOperateursPossibles%,"<>" item_add noOperateursPossibles%,"<=" item_add noOperateursPossibles%,">=" dll_on "KGF.dll"
NomKBDD$ = "Test_de_KBDD" PathKBDD$ = ".\" : ' ".\TestKBDD" if dir_exists(PathKBDD$)=0 then dir_make PathKBDD$ end
creer: KBDD% = dll_call1("CreateKBDD",adr(NomKBDD$)) IndexKBDD$ = "NomPrenom" res% = dll_call5("DefineIndexKBDD",KBDD%,adr(IndexKBDD$),2,1,80) IndexKBDD$ = "CodPost" res% = dll_call5("DefineIndexKBDD",KBDD%,adr(IndexKBDD$),1,169,5) IndexKBDD$ = "Ville" res% = dll_call5("DefineIndexKBDD",KBDD%,adr(IndexKBDD$),2,174,40)
FieldKBDD$ = "Nom" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,1,40) FieldKBDD$ = "Prénom" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,41,40) FieldKBDD$ = "Naissance" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),3,81,8) FieldKBDD$ = "Adresse 1" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,89,40) FieldKBDD$ = "Adresse 2" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,129,40) FieldKBDD$ = "Codepostal" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),1,169,5) FieldKBDD$ = "Ville" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,174,40) FieldKBDD$ = "Téléphone" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),1,214,10) FieldKBDD$ = "Mail" res% = dll_call5("AddFieldForKDDB",KBDD%,adr(FieldKBDD$),2,224,40) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) return sauver: res% = dll_calL2("SaveKBDD",KBDD%,adr(PathKBDD$)) return charger: res% = dll_calL2("LoadKBDD",KBDD%,adr(PathKBDD$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) return ajouter: RecordKBDD$ = "" RecordKBDD$ = RecordKBDD$ + left$(text$(1001)+blanc$,40) : ' nom RecordKBDD$ = RecordKBDD$ + left$(text$(1002)+blanc$,40) : ' prénom RecordKBDD$ = RecordKBDD$ + left$(text$(1003)+blanc$,8) : ' date de naissance RecordKBDD$ = RecordKBDD$ + left$(text$(1004)+blanc$,40) : ' adresse ligne 1 RecordKBDD$ = RecordKBDD$ + left$(text$(1005)+blanc$,40) : ' adresse ligne 2 RecordKBDD$ = RecordKBDD$ + left$(text$(1006)+blanc$,5) : ' code postal RecordKBDD$ = RecordKBDD$ + left$(text$(1007)+blanc$,40) : ' ville RecordKBDD$ = RecordKBDD$ + left$(text$(1008)+blanc$,10) : ' téléphone RecordKBDD$ = RecordKBDD$ + left$(text$(1009)+blanc$,40) : ' mail ID% = dll_call2("AddRecordKBDD",KBDD%,adr(RecordKBDD$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) position noID%,ID% return lireID: ID% = dll_call3("ReadByIdKBDD",KBDD%,position(noID%),adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur e lecture ID="+str$(position(noID%)) else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ AfficherRecord() end_if return lireNextID: position noID%,position(noID%)+1 gosub LireID return
lirePrevID: if position(noID%)=0 then return position noID%,position(noID%)-1 gosub LireID return LireIndex0: cle$ = left$(text$(1001)+blanc$,40) : ' nom cle$ = cle$ + left$(text$(1002)+blanc$,40) : ' prénom ID% = dll_call4("ReadByIndexKBDD",KBDD%,0,adr(cle$),adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur e lecture Index 0 ="+cle$ else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% AfficherRecord() end_if return LireIndex1: cle$ = left$(text$(1006)+blanc$,5) : ' code postal ID% = dll_call4("ReadByIndexKBDD",KBDD%,1,adr(cle$),adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur e lecture Index 1 ="+cle$ else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% AfficherRecord() end_if return
LireIndex2: cle$ = left$(text$(1007)+blanc$,40) : ' ville ID% = dll_call4("ReadByIndexKBDD",KBDD%,2,adr(cle$),adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur en lecture Index 2 ="+cle$ else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% AfficherRecord() end_if return precedent: ID% = dll_call2("ReadPreceedingIndexKBDD",KBDD%,adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur en lecture précédent ="+cle$ else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% AfficherRecord() end_if return suivant: ID% = dll_call2("ReadNextIndexKBDD",KBDD%,adr(aRecord$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur en lecture suivant ="+cle$ else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% AfficherRecord() end_if return
maj: RecordKBDD$ = "" RecordKBDD$ = RecordKBDD$ + left$(text$(1001)+blanc$,40) : ' nom RecordKBDD$ = RecordKBDD$ + left$(text$(1002)+blanc$,40) : ' prénom RecordKBDD$ = RecordKBDD$ + left$(text$(1003)+blanc$,8) : ' date de naissance RecordKBDD$ = RecordKBDD$ + left$(text$(1004)+blanc$,40) : ' adresse ligne 1 RecordKBDD$ = RecordKBDD$ + left$(text$(1005)+blanc$,40) : ' adresse ligne 2 RecordKBDD$ = RecordKBDD$ + left$(text$(1006)+blanc$,5) : ' code postal RecordKBDD$ = RecordKBDD$ + left$(text$(1007)+blanc$,40) : ' ville RecordKBDD$ = RecordKBDD$ + left$(text$(1008)+blanc$,10) : ' téléphone RecordKBDD$ = RecordKBDD$ + left$(text$(1009)+blanc$,40) : ' mail ID% = dll_call2("UpdateRecordKBDD",KBDD%,adr(RecordKBDD$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) position noID%,ID% return
supprimer: ID% = dll_call2("DeleteRecordByIdKBDD",KBDD%,ID%) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur en suppression" else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(ID%)+": "+s1$+", "+s2$ position noID%,ID% end_if return
restaurer: ID% = dll_call2("UndeleteRecordByIdKBDD",KBDD%,position(noID%)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) clear noResult% if ID%<0 item_add noResult%,"Erreur en restauration" else s1$ = trim$(left$(aRecord$,40)) s2$ = trim$(mid$(aRecord$,41,40)) item_add noResult%,"ID="+str$(position(noID%))+": relire l'enregistrement !" position noID%,ID% end_if return query: ' vérifier la cohérence des paramètres NomCollection$ = trim$(text$(NoNomCollection%)) if NomCollection$="" then return if count(noChamps%)=0 then return if count(noChamps%)<>count(noOperateurs%) then return if count(noChamps%)<>count(noValeurs%) then return for i%=1 to count(noOperateurs%) ok% = 0 for j%=1 to count(noOperateursPossibles%) if item_read$(noOperateurs%,i%)=item_read$(noOperateursPossibles%,j%) then ok% = 1 next j% if ok% = 0 then return next i%
' créer la collection res% = dll_call2("CreateCollectionForKBDD",KBDD%,adr(NomCollection$)) if res%<0 then message "Remplacement de la collection "+NomCollection$ ' effectuer la requête res% = dll_call6("QueryCollectionForKBDD",KBDD%,adr(NomCollection$),hmemoChamps%,hmemoOperateurs%,hmemoValeurs%,hmemoCollection%)
' afficher le résultat res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) return
supprimercollection: NomCollection$ = trim$(text$(NoNomCollection%)) res% = dll_call2("DeleteCollectionFromKDDB",KBDD%,adr(NomCollection$)) res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) return SelectCollection: i% = dll_call1("GetActiveMemoLine",hmemoCollections%) if i%>0 NomCollection$ = item_read$(noListeCollections%,i%) text noNomCollection%,NomCollection$ res% = dll_call3("GetCollectionKBDD",KBDD%,adr(NomCollection$),hmemoCollection%) sQuery$ = string$(500," ") j% = dll_call4("GetCollectionQueryKBDD",KBDD%,adr(NomCollection$),0,0) clear noChamps% clear noOperateurs% clear noValeurs% for i%=1 to j% res% = dll_call4("GetCollectionQueryKBDD",KBDD%,adr(NomCollection$),i%,adr(sQuery$)) AfficherQuery(sQuery$) next i% end_if return squeeze: res% = dll_call1("SqueezeKBDD",KBDD%) clear noResult% if res%<0 item_add noResult%,"Erreur en compression" else res% = dll_call2("GetInfoKBDD",KBDD%,hmemoStatut%) res% = dll_call2("GetCollectionsKBDD",KBDD%,hmemoCollections%) end_if return
sub AfficherRecord() ' Nom = 40 car. Clé 0 ' Prénom = 40 car. Clé 0 ' Date de naissance = 8 car. ' Adresse = 2 x 40 car. ' Code postal = 5 car. Clé 1 ' Ville = 40 car. Clé 2 ' Tél. = 10 car. ' Mail = 40 car. text 1001,trim$(left$(aRecord$,40)) text 1002,trim$(mid$(aRecord$,41,40)) text 1003,trim$(mid$(aRecord$,81,8)) text 1004,trim$(mid$(aRecord$,89,40)) text 1005,trim$(mid$(aRecord$,129,40)) text 1006,trim$(mid$(aRecord$,169,5)) text 1007,trim$(mid$(aRecord$,174,40)) text 1008,trim$(mid$(aRecord$,214,10)) text 1009,trim$(mid$(aRecord$,224,40)) end_sub
sub AfficherQuery(s$) dim_local p%, s1$ s1$ = s$ p% = instr(s1$,":") item_add noChamps%,left$(s1$,p%-1) s1$ = mid$(s1$,p%+1,len(s1$)) p% = instr(s1$,":") item_add noOperateurs%,left$(s1$,p%-1) s1$ = mid$(s1$,p%+1,len(s1$)) item_add noValeurs%,s1$ end_sub
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 28 Jan 2018 - 12:36 | |
| Salut Klaus ! Content de te retrouver sur le forum et félicitation pour ces nouvelles fonctions dans KGF ! Le principe d'une base de donnée en mémoire et astucieuse ! cela permet une mise en œuvre plus aisée. Avec moins de fichiers, de dossiers, etc. J'ai quelques idées dernière la tête... Il va falloir que je regarde ça ! Merci pour tout ce travail que tu fais Klaus. Je sais que c'est un plaisir pour toi, mais cela permet des avancés toujours nouvelles et surprenantes à Panoramic. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 28 Jan 2018 - 13:01 | |
| Merci, Minibug !
Moi aussi, j'ai des idées concernant l'écolution de cette base. En fait, cette base est pensée pour être le socle de quelque chose de plus vaste. La notion des collections est déjà une amorce. C'est encore trop restrictif, et il faudra encore travailler sur les critères des requêtes. Mais au-delà de cela, comme on peut avoir plusieurs bases simultanément, je travaille sur un moyen d'automatiser les liens entre les bases. Encore un gros travail de conception en cours.
Faut tout de même rappeler un point important. Contrairement à des bases de données commerciales, et en particulier celles qui sont dans le cloud, KBDD n'est en aucun cas multi-utilisateur ! Même pas pour deux programmes exécutant simultanément sur le même ordinateur. Ceci est exclu de par sa conception même - comme elle est entièrement gérée en mémoire, la mémoire ne peut pas être partagée entre plusieurs programmes.
A moins que - il y a toujours un moyen d'y arriver, néanmoins. La majeure partie des bases commerciales fonctionnent sur le principe d'une structure client/serveur. On peut bien sûr faire cela avec Panoramic/KGF.dll également. Il suffit d'avoir un programme Panoramic implémentant le serveur, et les programmes client communiquent avec le serveur au lioeu d'accéder la base directement. Techniquement, c'est parfaitement faisable et KGF.dll contient déjà les outils pour cela. Mais je pense que cela dépasse largement l'utilisation que la majorité des Panoramiciens pourrait faire de KBDD.
Pour ma part, je me concentrerai sur l'évolution vers des liens automatisés entre plusieurs bases, même en cascade à plusieurs niveaux. Un joli défi... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Dim 28 Jan 2018 - 13:26 | |
| Hummm, je vois que tu es sur un 'gros coup' et tu as de la suite dans les idées. C'est bien ! Je te souhaite bon courage pour la suite... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 28 Jan 2018 - 21:14 | |
| Merci !
Je suis en train de mettre au piont un système qui permet de relier une base KBDD à plusieurs autres, via leurs indexes. Et ainsi, une lecture dans une base peut entraîner de façon transparente plusieurs lectures dans d'autres bases et même éventuellement des créations d'enregistrements. Et les lectures dans les bases reliées pourront à leur tour provoquer des lectures dans des bases qui leur sont associées, etc. Le système n'est pas limité. Ainsi, en accédant un seul élément, on aura automatiquement en mémoire absolument tout ce qui est relié, même à plusieurs niveaux. Là, on s'approche un peu de ce que j'avais "rêvé" en peu, comme accès global à l'information. | |
| | | 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
| |
| |
| |