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 Dim 1 Mar 2015 - 20:35 | |
| Cela devient contagieux, la todolistomania... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 1 Mar 2015 - 21:10 | |
| Nouvelle version: KGF.dll V4.37 du 01/03/2015
Nouveautés: -TabObject: nouveau code 9 dans TabObjectFunction: supprimer l'onglet ntab% indiqué
Modules modifiés: KGF.dll KGF.chm
La doc et les sources sont à jour.
A tester en grandeur nature... chez moi, ça a l'air de marcher. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 1 Mar 2015 - 22:52 | |
| Celui là, je le testerai un peu plus tard dans la nuit... Je me bagarre avec PPE_Vs2 pour le rendre re-dimensionnable. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Lun 2 Mar 2015 - 13:15 | |
| Nouvelle version: KGF.dll V4.38 du 02/03/2015Nouveautés: - nouvelle fonction AddNewResourceEXModules modifiés: KGF.dll KGF.chmLa doc et les sources sont à jour. Cette fonction est identique à la fonction AddNewResource déjà existante, sauf qu'elle ne fait aucun ajout dans l'indexe des ressources gérée par AddNewResource. Ainsi, elle peut être utilisée pour un ajout banal d'un fichier quelconque dans les ressources. Exemple d'un outil qui utilise cela: - Code:
-
' InsertResourceToExe.bas
label SelExe, SelRsc, insert
dim exe$, res$, res%, typ$, nam$
open_dialog 1
alpha 10 : top 10,10 : left 10,10 : caption 10,"Fichier EXE:" edit 11 : top 11,10 : left 11,80 : width 11,300 button 12 : top 12,10 : left 12,380 : width 12,30 : caption 12,"..." on_click 12,SelExe
alpha 20 : top 20,40 : left 20,10 : caption 20,"Ressource:" edit 21 : top 21,40 : left 21,80 : width 21,300 button 22 : top 22,40 : left 22,380 : width 22,30 : caption 22,"..." on_click 22,SelRsc
button 32 : top 32,80 : left 32,80 : caption 32,"Insérer" on_click 32,insert
dll_on "KGF.dll"
end
SelExe: filter 1,"Exécutables, DLLs|*.exe;*.dll" exe$ = file_name$(1) if exe$="_" then return text 11,exe$ return SelRsc: filter 1,"Ressource|*.*" res$ = file_name$(1) if res$="_" then return text 21,res$ return
insert: exe$ = trim$(text$(11)) if file_exists(exe$)=0 message "Le fichier exécutable n'existe pas" return end_if res$ = trim$(text$(21)) if file_exists(res$)=0 message "Le fichier ressource n'existe pas" return end_if typ$ = "DATAFILE" nam$ = file_extract_name$(res$) res% = dll_call3("FindExistingResource",adr(exe$),adr(typ$),adr(nam$)) if res%<>0 if message_confirmation_yes_no("La ressource "+nam$+" existe déjà. Remplacer ?")<>1 then return res% = dll_call3("DeleteExistingResource",adr(exe$),adr(typ$),adr(nam$)) end_if res% = dll_call4("AddNewResourceEX",adr(exe$),adr(res$),adr(typ$),adr(nam$)) if res%<0 message "Oups... erreur en mise à jour" else message "Le programme a été mis à jour" end_if return
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: KGF_dll - nouvelles versions Lun 2 Mar 2015 - 21:54 | |
| Une question plus générale Klaus, et qui me chiffonne: je viens de télécharger le dernier KGF.dll, qui fait environ 1 M octets, et qui remplace une version de décembre qui faisait 3,3 M octets, alors que tu rajoutes plein de fonctions... ? | |
| | | 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 Lun 2 Mar 2015 - 22:23 | |
| - Klaus a écrit:
- INFO INFO INFO INFO
A partir de maintenant, je compresse KGF.dll par l'utilitaire UPX. Gain: 66 % de place. De plus de 3 Mo, je passe à 1 Mo, sans perte de fonctionnalité ni performance.
Donc, n'ayez pas peur de la taille réduite de la DLL - c'est normal !
@JL35 Tu ne lis pas TOUT | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: KGF_dll - nouvelles versions Lun 2 Mar 2015 - 22:31 | |
| Ohhhh ! je suis couvert de honte ! je lis tout mais je ne retiens pas tout, hélas ! et des fois je pense à autre chose qu'à Panoramic... Merci quand même papydall ! Tout de même, diviser la taille par plus de 3, ça c'est intéressant ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: KGF_dll - nouvelles versions Lun 2 Mar 2015 - 23:57 | |
| - JL35 a écrit:
- et des fois je pense à autre chose qu'à Panoramic...
Honte à toi ... Blasfème .... Outrage | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mar 3 Mar 2015 - 15:46 | |
| Nouvelle version: KGF.dll V4.39 du 03/03/2015
Nouveautés: - StringList: gérer le mode de tri dans les DLIST pour toutes les fonctions - StringList: nouvelle fonction AddFileToStringList
Modules modifiés: KGF.dll KGF.chm
La doc et 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 Mer 4 Mar 2015 - 19:18 | |
| Nouvelle version: KGF.dll V4.40 du 04/03/2015Nouveautés: - StringList: nouvelle fonction ReadStringListValueModules modifiés: KGF.dll KGF.chmLa doc et les sources sont à jour. Cette fonction permet de considérer une Stringlist (triée ou non) comme un fichier ini contenant les lignes de type clé=valeur Cette fonction peut alors retourner la valeur d'une clé spécifiée en paramètre. Voici une démo: - Code:
-
' demo de fichier INI ' Cette démo utilise KGF.dll pour les fonctions de StringList
' Un fichier INI est composé de lignes de type cle=valeur
dim res%, valeur$
dlist 1 : ' pour contenir le fichier INI
item_add 1,"Dossier=C:\MonDossier" item_add 1,"Programme=essai.exe" item_add 1,"DernierUtilisateur=klaus" item_add 1,"DernierFichier=test.bas" item_add 1,"ActionEnCours="
dll_on "KGF.dll"
' res% = dll_call2("SortStringList",object_internal(1),2)
LireValeur("Dossier") Message "Dossier = "+valeur$ if valeur$="" then message "Dossier pas défini"
LireValeur("Programme") Message "Programme = "+valeur$ if valeur$="" then message "Programme pas défini"
LireValeur("DernierUtilisateur") Message "Dernier Utilisateur = "+valeur$ if valeur$="" then message "Dernier Utilisateur pas défini"
LireValeur("DernierFichier") Message "Dernier Fichier = "+valeur$ if valeur$="" then message "Dernier Fichier pas défini"
LireValeur("ActionEnCours") Message "Action En Cours = "+valeur$ if valeur$="" then message "Action En Cours pas définie"
end
sub LireValeur(cle$) valeur$ = string$(100," ") res% = dll_call3("ReadStringListValue",object_internal(1),adr(cle$),adr(valeur$)) valeur$ = trim$(valeur$) end_sub
Dernière édition par Klaus le Jeu 5 Mar 2015 - 3:20, édité 1 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 4 Mar 2015 - 23:58 | |
| Il y a un souci avec la fonction 9 du TabObject. 1 onglet, le bandeau est supprimé avec l' onglet. Plus de 1 onglet, tous les "panels-onglets" sont supprimés. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 5 Mar 2015 - 2:25 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 5 Mar 2015 - 3:21 | |
| Nouvelle version: KGF.dll V4.41 du 05/03/2015
Nouveautés: Correction d'un bug dans TabObjectFunction code 9
Modules modifiés: KGF.dll
Les sources sont à jour. La doc est inchangée. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 5 Mar 2015 - 3:33 | |
| Je confirme, le problème est résolu !
Bravo Klaus ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 6 Mar 2015 - 2:50 | |
| Pas de souci rassures toi !.. Je voudrais juste apporter ma pierre à l' édifice. Il serait souhaitable de préciser certaines choses dans la doc de TabObject. Lorsque l' on supprime un onglet, si on supprime l' onglet 1 l' onglet 2 devient l' onglet 1 et ainsi de suite jusqu' au dernier. ce qui signifie que les numéros d' onglet ne sont pas fixes. Il convient donc de mettre en place un système de repérage autre que le numéro d' onglet. Je tiens à le dire car je viens de passer la journée à me casser les dents là dessus... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 6 Mar 2015 - 3:06 | |
| Je comprends ton soucis, mais au niveau de la DLL, je ne vois pas bien ce que je pourrais y faire. Les onglets sont repérés par rapport à leur position, et je n'ai pas le moyen de leur attribuer une "identification" ou un "nom". Il revient en effet au programmeur de garder la trace des onglets qu'il a créé. Ceci peut être fait par exemple dans une DLIST dans laquelle un ajoute une ligne pour chaque onglet créé, puis on supprime la ligne du même indice que l'onglet supprimé. Ainsi, le numéro d'onglet retourné pourra toujours être utilisé comme indice d'un enregistrement dans la DLIST qui contient le numéro d'origine.
Tout à fait autre chose: je prépare un gros morceau, et ça fonctionne déjà. Je suis en train de rédiger la doc. A quel sujet ? Un nouvel objet nommé XML... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 6 Mar 2015 - 3:38 | |
| Je me doute que tu n' y puisse rien. Je voulais juste que tu le signales dans la doc pour que les futurs victimes , ne passent pas autant de temps à chercher où elles ont fait une bourde alors que c' est tout simplement les onglets qui prennent le numéro de leur position. D' ailleurs, c' est très bien comme cela à mon avis. j' ai trouvé une astuce pour mon usage, j' ai un tableau de variable syn_file$(99) qui contient le nom de fichier du synedit associé au syn%(n%). le numero 0 est réservé pour l' éditeur de procédures. et j' ai un autre tableau pour récupérer les numéros des objet synedit créés et supprimés de manière à pouvoir récupérer le numéro d' un objet synedit supprimer. Bref, c' est devenu une usine à gaz mon truc... Edit: Pour xml, je ne maitrise pas bien le sujet ( pas du tout ) , j' attendrai de voir la doc. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 6 Mar 2015 - 23:28 | |
| Nouvelle version: KGF.dll V4.43 du 07/03/2015Nouveautés: nouvel objet: XMLModules modifiés: KGF.dll KGF.chmLes sources et la doc sont à jour. Cet objet permet de charger un document XML valide et de l'explorer. Un premier jeu de fonctions permet d'explorer l'arbre des éléments XML et de lire les noms et/ou les données, ainsi que les attributs. A ce titre, je renvoie à l'xcellent tuto XML ici. On peut charger un document XML à partir d'un fichier, un objet Panoramic (MEMO, LIST ou DLIST) ou à partir d'une chaîne de caractères. Le programme suivant permet de montrer ces fonctions, à partir d'un exemple pris sur le site mentionné ci-dessus: - Code:
-
' test_XML.bas
label load, home, previous, xparent, child, xnext, rname, rdata
dim res%, XML%, s$
width 0,700 : height 0,500
memo 1 : top 1,10 : left 1,10 : width 1,200 : height 1,400 : bar_both 1 memo 2 : top 2,10 : left 2,410 : width 2,200 : height 2,400 : bar_both 2
button 11 : top 11,10 : left 11,220 :caption 11,"Load" on_click 11,load button 12 : top 12,10 : left 12,320 :caption 12,"Home" on_click 12,home button 13 : top 13,40 : left 13,270 :caption 13,"Previous" on_click 13,previous button 14 : top 14,70 : left 14,220 :caption 14,"Parent" on_click 14,xparent button 15 : top 15,70 : left 15,320 :caption 15,"1st child" on_click 15,child button 16 : top 16,110 : left 16,270 :caption 16,"Next" on_click 16,xnext button 17 : top 17,140 : left 17,220 :caption 17,"Read Name" on_click 17,rname button 18 : top 18,140 : left 18,320 :caption 18,"Read Data" on_click 18,rdata
item_add 1,"<?xml version="+chr$(34)+"1.0"+chr$(34)+" encoding="+chr$(34)+"UTF-8"+chr$(34)+"?>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+">" item_add 1," <to> Tove</to>" item_add 1," <from>Jani</from>" item_add 1," <heading>Reminder</heading>" item_add 1," <body>Don't forget me this weekend!</body>" item_add 1,"</note>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+" class="+chr$(34)+"new"+chr$(34)+">" item_add 1," <to> Marc</to>" item_add 1," <from>John</from>" item_add 1," <heading>News</heading>" item_add 1," <body>Cet article a été publié !</body>" item_add 1,"</note>"
dll_on "KGF.dll"
end
load: XML% = dll_call1("LoadXmlFromObject",object_internal(1)) if XML%=-1 message "Error" else message "Ok" end_if return
home: res% = dll_call1("GetXmlTop",XML%) select res% case -1: message "Fatal error" case 0: message "Empty" case 1: message "Ok" end_select return
previous: res% = dll_call1("GetPreviousXmlSister",XML%) select res% case -1: message "Fatal error" case 0: message "Empty" case 1: message "Ok" end_select return
xparent: res% = dll_call1("GetXmlParent",XML%) select res% case -1: message "Fatal error" case 0: message "Empty" case 1: message "Ok" end_select return
child: res% = dll_call1("GetFirstXmlChild",XML%) select res% case -1: message "Fatal error" case 0: message "Empty" case 1: message "Ok" end_select return
xnext: res% = dll_call1("GetNextXmlSister",XML%) select res% case -1: message "Fatal error" case 0: message "Empty" case 1: message "Ok" end_select return
rname: s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) select res% case -1: message "Fatal error" case 0: message "Ok: "+trim$(s$) end_select return
rdata: s$ = string$(255," ") res% = dll_call2("GetXmlData",XML%,adr(s$)) select res% case -1: message "Fatal error" case 0: message "Ok: "+trim$(s$) end_select return
Les fichiers XML ont une très grande utilité. D'abord, ils peuvent être affichés simplement, par la plupart des eplorateurs internet. Ensuite, on peut leur associer des fichiers CSS et les afficher comme n'importe quelle page HTML. Mais ils sont important également, parce que ces fichiers peuvent servir de fichiers de configuration sophistiqués, et malgré la difficulté de les exploiter directement, avec l'objet XML, cela devient simple. Et surtout, ils peuvent servir de base de données simple, avec les éléments jouant le rôle de champs simples ou complexes (composés d'autres champs). Cherchez un peu l'emploi des fichiers XML sur le net, et vous verrez l'avantage qu'on peut en tirer !
Dernière édition par Klaus le Sam 7 Mar 2015 - 14:00, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Sam 7 Mar 2015 - 14:00 | |
| Nouvelle version: KGF.dll V4.43 du 07/03/2015Nouveautés: XML: 3 nouvelles fonctionsModules modifiés: KGF.dll KGF.chmLes sources et la doc sont à jour. Deux nouvelles fonctions permettent de remplacer les données d'un élément XML ou de changer son nom. ne troisième fonction permet de chercher un élément XML par un chemin d'accès éventuellement partiel, soit à partir du début du document, soit à partir d'une position spécifique (la dernière recherche réussie, par exemple). Voici le programme de démo étendu à ces fonctions, avec une nette amélioration de la lisibilité des résultats qui s'affichent maintenant, avec des informations complémentaires, dans une barre d'état: - Code:
-
' test_XML.bas
label load, home, previous, xparent, child, xnext, rname, rdata label sdata, fpath, npath
dim res%, XML%, s$, sold$, sep$, loc%
width 0,700 : height 0,500
memo 1 : top 1,10 : left 1,10 : width 1,200 : height 1,400 : bar_both 1 memo 2 : top 2,10 : left 2,410 : width 2,200 : height 2,400 : bar_both 2
button 11 : top 11,10 : left 11,220 :caption 11,"Load" on_click 11,load button 12 : top 12,10 : left 12,320 :caption 12,"Home" on_click 12,home button 13 : top 13,40 : left 13,270 :caption 13,"Previous" on_click 13,previous button 14 : top 14,70 : left 14,220 :caption 14,"Parent" on_click 14,xparent button 15 : top 15,70 : left 15,320 :caption 15,"1st child" on_click 15,child button 16 : top 16,110 : left 16,270 :caption 16,"Next" on_click 16,xnext button 17 : top 17,140 : left 17,220 :caption 17,"Read Name" on_click 17,rname button 18 : top 18,140 : left 18,320 :caption 18,"Read Data" on_click 18,rdata alpha 19 : top 19,170 : left 19,220 : caption 19,"New data:" edit 20 : top 20,190 : left 20,220 : width 20,180 button 21 : top 21,220 : left 21,270 : caption 21,"Set data" on_click 21,sdata alpha 22 : top 22,250 : left 22,220 : caption 22,"Path:" edit 23 : top 23,270 : left 23,220 : width 23,180 button 24 : top 24,300 : left 24,220 : caption 24,"Find path" on_click 24,fpath button 25 : top 25,300 : left 25,320 : caption 25,"Next path" on_click 25,npath edit 99 : top 99,430 : left 99,10 : width 99,600
item_add 1,"<?xml version="+chr$(34)+"1.0"+chr$(34)+" encoding="+chr$(34)+"UTF-8"+chr$(34)+"?>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+">" item_add 1," <to> Tove</to>" item_add 1," <from>Jani</from>" item_add 1," <heading>Reminder</heading>" item_add 1," <body>Don't forget me this weekend!</body>" item_add 1,"</note>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+" class="+chr$(34)+"new"+chr$(34)+">" item_add 1," <to> Marc</to>" item_add 1," <from>John</from>" item_add 1," <heading>News</heading>" item_add 1," <body>Cet article a été publié !</body>" item_add 1,"</note>"
dll_on "KGF.dll"
end
load: XML% = dll_call1("LoadXmlFromObject",object_internal(1)) if XML%=-1 text 99, "Error" else text 99, "Ok" end_if return
home: res% = dll_call1("GetXmlTop",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
previous: res% = dll_call1("GetPreviousXmlSister",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
xparent: res% = dll_call1("GetXmlParent",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
child: res% = dll_call1("GetFirstXmlChild",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
xnext: res% = dll_call1("GetNextXmlSister",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
rname: s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: name="+trim$(s$) end_select return
rdata: s$ = string$(255," ") res% = dll_call2("GetXmlData",XML%,adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: data="+trim$(s$) end_select return
sdata: sold$ = string$(255," ") s$ = text$(20) res% = dll_call3("SetXmlData",XML%,adr(sold$),adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: old data="+trim$(sold$) end_select return fpath: s$ = text$(23) sep$ = "\" res% = dll_call4("SelectXmlElementByPath",XML%,0,adr(s$),adr(sep$)) loc% = 0 select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok - not foundé" end_select if res%>0 loc% = res% res% = dll_call1("GetFirstXmlChild",XML%) s$ = string$(255," ") if res%>0 res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) res% = dll_call1("GetXmlParent",XML%) end_if text 99, "Ok - found at "+str$(loc%)+": ["+trim$(s$)+"]" end_if return
npath: s$ = text$(23) sep$ = "\" res% = dll_call4("SelectXmlElementByPath",XML%,loc%+1,adr(s$),adr(sep$)) loc% = 0 select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok - non trouvé" end_select if res%>0 loc% = res% res% = dll_call1("GetFirstXmlChild",XML%) s$ = string$(255," ") if res%>0 res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) res% = dll_call1("GetXmlParent",XML%) end_if text 99, "Ok - found at "+str$(loc%)+": ["+trim$(s$)+"]" end_if return
Mettez, par exemple: - Citation :
- Root\note\to
dans la zone "Path", et cliquez sur "FindPath". Vous trouverez le destinataire de la première note. Cliquez ensuite sur "Next path", et vous trouverez le destinataire de la seconde note. Un autre clic sur "Next path" vous informera qu'il n'y a plus de notes. Elémentaire, non ? | |
| | | 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 7 Mar 2015 - 14:41 | |
| Salut Klaus Ligne 169 - Code:
-
case 0: text 99, "Ok - not foundé" Good use of the past participle of to find (foundé) Après cette plaisanterie, merci pour tout : c’est OK. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Dim 8 Mar 2015 - 22:59 | |
| Nouvelle version: KGF.dll V4.44 du 08/03/2015Nouveautés: XML: 5 nouvelles fonctionsModules modifiés: KGF.dll KGF.chmLes sources et la doc sont à jour. Avec ces 5 nouvelles fonctions, l'objet XML forme un ensemble cohérent et exploitable. Je posterai prochainement un exemple d'utilisation pour une application concrète. Les 5 nouvelles fonctions portent sur la sauvegarde d'un objet XML, soit dans un fichier, soit dans un mémo Panoramic, soit dans une variable chaîne de caractères Panoramic, ainsi que la création de nouveaux éléments selon différents modes (soeur en fin de liste des soeurs, soeur insérée devant l'élément actif, nouvel enfant), et la suppression d'un élément, y compris tous les éléments enfant qui en dépendent, quelque soit la profondeur de l'hiérarchie. Ceci, combiné aux fonctions de lecture, recherche et gestion des données d'un élément forment un ensemble cohérent, permettant de charger un XML existant en mémoire, de l'exploiter, éventuellement modifier, puis de l'enregister, et même de le créer ex nihilo, par programme. Voici le programme de démo, incluant les nouvelles fonctions: - Code:
-
' test_XML.bas
label load, home, previous, xparent, child, xnext, rname, rdata label sdata, fpath, npath, fsave, msave, ssave label asister, isister, achild, delet
dim res%, XML%, s$, sold$, sep$, loc%
width 0,840 : height 0,700
memo 1 : top 1,10 : left 1,10 : width 1,300 : height 1,600 : bar_both 1 memo 2 : top 2,10 : left 2,510 : width 2,300 : height 2,600 : bar_both 2
button 11 : top 11,10 : left 11,320 :caption 11,"Load" on_click 11,load button 12 : top 12,10 : left 12,420 :caption 12,"Home" on_click 12,home button 13 : top 13,40 : left 13,370 :caption 13,"Previous" on_click 13,previous button 14 : top 14,70 : left 14,320 :caption 14,"Parent" on_click 14,xparent button 15 : top 15,70 : left 15,420 :caption 15,"1st child" on_click 15,child button 16 : top 16,100 : left 16,370 :caption 16,"Next" on_click 16,xnext button 17 : top 17,140 : left 17,320 :caption 17,"Read Name" on_click 17,rname button 18 : top 18,140 : left 18,420 :caption 18,"Read Data" on_click 18,rdata alpha 19 : top 19,170 : left 19,320 : caption 19,"New data:" edit 20 : top 20,190 : left 20,320 : width 20,180 button 21 : top 21,220 : left 21,370 : caption 21,"Set data" on_click 21,sdata alpha 22 : top 22,250 : left 22,320 : caption 22,"Path:" edit 23 : top 23,270 : left 23,320 : width 23,180 button 24 : top 24,300 : left 24,320 : caption 24,"Find path" on_click 24,fpath button 25 : top 25,300 : left 25,420 : caption 25,"Next path" on_click 25,npath button 26 : top 26,330 : left 26,320 :caption 26,"Save file" on_click 26,fsave button 27 : top 27,330 : left 27,420 :caption 27,"Save memo" on_click 27,msave button 28 : top 28,360 : left 28,370 :caption 28,"Save string" on_click 28,ssave alpha 29 : top 29,390 : left 29,320 : caption 29,"New element name:" edit 30 : top 30,410 : left 30,320 : width 30,180 button 31 : top 31,440 : left 31,320 :caption 31,"Append sister" on_click 31,asister button 32 : top 32,440 : left 32,420 :caption 32,"Insert sister" on_click 32,isister button 33 : top 33,470 : left 33,370 :caption 33,"Add child" on_click 33,achild button 34 : top 34,520 : left 34,370 :caption 34,"Delete element" on_click 34,delet
edit 99 : top 99,630 : left 99,10 : width 99,800
item_add 1,"<?xml version="+chr$(34)+"1.0"+chr$(34)+" encoding="+chr$(34)+"UTF-8"+chr$(34)+"?>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+">" item_add 1," <to> Tove</to>" item_add 1," <from>Jani</from>" item_add 1," <heading>Reminder</heading>" item_add 1," <body>Don't forget me this weekend!</body>" item_add 1,"</note>" item_add 1,"<note type="+chr$(34)+"friend"+chr$(34)+" class="+chr$(34)+"new"+chr$(34)+">" item_add 1," <to> Marc</to>" item_add 1," <from>John</from>" item_add 1," <heading>News</heading>" item_add 1," <body>Cet article a été publié !</body>" item_add 1,"</note>"
text 99,"Nothing loaded"
dll_on "KGF.dll"
end
load: XML% = dll_call1("LoadXmlFromObject",object_internal(1)) if XML%=-1 text 99, "Error" else text 99, "Ok" end_if return
home: res% = dll_call1("GetXmlTop",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
previous: res% = dll_call1("GetPreviousXmlSister",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
xparent: res% = dll_call1("GetXmlParent",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
child: res% = dll_call1("GetFirstXmlChild",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
xnext: res% = dll_call1("GetNextXmlSister",XML%) select res% case -1: text 99, "Fatal error" case 0: text 99, "Empty" case 1: ' ok s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) text 99, "Ok"+": ["+trim$(s$)+"]" end_select return
rname: s$ = string$(255," ") res% = dll_call2("GetXmlName",XML%,adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: name="+trim$(s$) end_select return
rdata: s$ = string$(255," ") res% = dll_call2("GetXmlData",XML%,adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: data="+trim$(s$) end_select return
sdata: sold$ = string$(255," ") s$ = text$(20) res% = dll_call3("SetXmlData",XML%,adr(sold$),adr(s$)) select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok: old data="+trim$(sold$) end_select return fpath: s$ = text$(23) sep$ = "\" res% = dll_call4("SelectXmlElementByPath",XML%,0,adr(s$),adr(sep$)) loc% = 0 select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok - not found" end_select if res%>0 loc% = res% res% = dll_call1("GetFirstXmlChild",XML%) s$ = string$(255," ") if res%>0 res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) res% = dll_call1("GetXmlParent",XML%) end_if text 99, "Ok - found at "+str$(loc%)+": ["+trim$(s$)+"]" end_if return
npath: s$ = text$(23) sep$ = "\" res% = dll_call4("SelectXmlElementByPath",XML%,loc%+1,adr(s$),adr(sep$)) loc% = 0 select res% case -1: text 99, "Fatal error" case 0: text 99, "Ok - non trouvé" end_select if res%>0 loc% = res% res% = dll_call1("GetFirstXmlChild",XML%) s$ = string$(255," ") if res%>0 res% = dll_call2("GetXmlName",XML%,adr(s$)) if res%<0 then res% = dll_call2("GetXmlData",XML%,adr(s$)) res% = dll_call1("GetXmlParent",XML%) end_if text 99, "Ok - found at "+str$(loc%)+": ["+trim$(s$)+"]" end_if return
fsave: s$ = "test.xml" res% = dll_call2("SaveXmlToFile",XML%,adr(s$)) select res% case -1: text 99,"Fatal error" case 0: text 99,"0k - saved to test.xml" end_select return
msave: res% = dll_call2("SaveXmlToMemo",XML%,handle(2)) select res% case -1: text 99,"Fatal error" case 0: text 99,"0k - saved to memo 2" end_select return
ssave: s$ = string$(10000," ") res% = dll_call2("SaveXmlToString",XML%,adr(s$)) select res% case -1: text 99,"Fatal error" case 0: text 99,"0k - saved to string" end_select s$ = trim$(s$) message s$ s$ = "" return
asister: s$ = text$(30) res% = dll_call3("AddXmlElement",XML%,1,adr(s$)) select res% case -1: text 99,"Fatal error" case 0: text 99,"Error - invalid operation" case 1: text 99,"Ok" end_select return
isister: s$ = text$(30) res% = dll_call3("AddXmlElement",XML%,2,adr(s$)) select res% case -1: text 99,"Fatal error" case 0: text 99,"Error - invalid operation" case 1: text 99,"Ok" end_select return
achild: s$ = text$(30) res% = dll_call3("AddXmlElement",XML%,3,adr(s$)) select res% case -1: text 99,"Fatal error" case 0: text 99,"Error - invalid operation" case 1: text 99,"Ok" end_select return
delet: res% = dll_call1("DeleteXmlElement",XML%) select res% case -1: text 99,"Fatal error" case 0: text 99,"Error - invalid operation" case 1: text 99,"Ok" end_select return
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: KGF_dll - nouvelles versions Dim 8 Mar 2015 - 23:23 | |
| Excuses moi Klaus, je n'ai pas réagi à tes précédentes publications sur le XML par ce que je n'ai pas vraiment le temps de me mettre sur ce sujet, mais c'est en effet un format très intéressant et ton programme de mise en pratique risque en effet de bien nous éclairer sur ce sujet. Personnellement je pourrais être amené à l'utiliser entre autre au travail pour des fichiers XML de configuration, vu qu'à ce jour je ne me suis jamais plongé dans ce format. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Lun 9 Mar 2015 - 0:26 | |
| Voilà à quoi ça pourrait ressembler. J'ai choisi le célèbre exemple d'un fichier de contacts, avec un historique des actions: - Code:
-
' Contacts_avec_XML.bas
' Ce petit programme implémente un carnet d'adresses à l'aide de l'objet XML. ' ' 1. Pour chaque "contact", on va créer une "fiche" qui est représentée par ' un "noeud" dans le fichier XML. ' 2. Chacun de ces noeuds "contact" contient plusieurs noeuds "fille" qui ' représentent chacun un ensemble logique de données. ' 3. Chacun de ces noeuds "fille" est potentiellement composé d'autres noeuds ' "fille" contenant des informations détaillées de plus bas niveau, etc. ' 4. Un "historique" sera réalisé sous forme d'un noeud "fille" au "contact", ' avec, à son tour, un noeud "fille" par mois, contenant des noeuds "fille" ' pour chaque évènement, qui à leur tour sont décomposés en noeuds "fille" ' décrivant chacun une information de détail pour l'évènement. ' 5. les informations spécifiques sont introduites par un $ pour les éléments ' et les attributs, et un # pour les données. Ceci est géré utomatiquement. ' ' Ceci conduit à la structure suivante: ' Root // noeud virtuel de "racine" créé automatiquement ' $entête // noeud technique contenant l'entête du fichier XML ' contact1 // le nom de ce noeud est l'identification du contact ' $attributs // divers attributs en nombre variable ' $type=client ' ... ' $... ' etatcivil ' civilite ' #mme ' patronyme ' #dupond ' naissance ' #devergne ' prenoms ' #marie hélène ' datenaissance ' #1953/07/23 ' lieunaissance ' ville ' #bourges ' departement ' #18 ' contact ' telephone ' #0123456789 ' mail ' #mh.dupond@ttest.fr ' ... ' historique ' 2015 ' 12 ' achat ' date ' #2015/12/17 ' objet ' #cartouches ' achat ' date ' #2015/12/03 ' objet ' #recharges ' 09 ' commande ' date ' #2015/09/23 ' objet ' #recharges ' 02 ' retour ' date ' #2015/02/19 ' objet ' #perceuse ' 2014 ' 10 ' achat ' date ' #2014/10/04 ' objet ' #perceuse ' 08 ' achat ' date ' #2014/08/25 ' objet ' #huile de chaîne ' 2013 ' 11 ' commande ' date ' #2013/11/14 ' objet ' #poste soudure ' ... ' contactx // le nom de ce noeud est l'identification du contact ' ... ' ' Ceci conduit au fichier XML suivant: ' <?xml version="1.0" encoding="UTF-8"?> ' <contact $type="client" ...$xxx="yyy"> ' <id>#1</id> ' <etatcivil> ' <civilite>#mme</civilite> ' <patronyme>#dupond</patronyme> ' <naissance>#devergne</naissance> ' <prenoms>#marie hélène</prenoms> ' <datenaissance>#1953/07/23</datenaissance> ' <lieunaissance> ' <ville>#bourges</ville> ' <departement>#18</departement> ' </lieunaissance> ' </etatcivil> ' <contact> ' <telephone>#0123456789</telephone> ' <mail>#mh.dupond@ttest.fr</mail> ' </contact> ' ... ' <historique> ' <2015> ' <12> ' <achat> ' <date>#2015/12/17</date> ' <obje>#cartouches</objet> ' </achat> ' <achat> ' <date>#2015/12/03</date> ' <objet>#recharges</objet> ' </achat> ' </12> ' <09> ' <commande> ' <date>#2015/09/23</date> ' <objet>#recharges</objet> ' </commande> ' </09> ' <02> ' <retour> ' <date>#2015/02/19</date> ' <objet>#perceuse</objet> ' </retour> ' </02> ' </2015> ' <2014> ' <10> ' <achat> ' <date>#2014/10/04</date> ' <objet>#perceuse</objet> ' </achat> ' </10> ' <08> ' <achat> ' <date>#2014/08/25/date> ' <objet>#huile de chaîne</objet> ' <achat> ' </08> ' </2014> ' <2013> ' <11> ' <commande> ' <date>#2013/11/14</date> ' <objet>#poste soudure</objet> ' </comande> ' </11> ' </2013> ' </historique> ' </contact> ' ... ' <contact $type="fournisseur"> ' ...
dll_on "KGF.dll"
end
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 9 Mar 2015 - 8:26 | |
| Un bon exemple vaut toujours mieux qu' un long discours... Je mets à jour régulièrement KGF.dll mais je suis trop pris par PPE pour me lancer dans l' étude du xml tout de suite. Je reste concentré sur un sujet, j' évite de me disperser, je pourrai me perdre en route. Vu la popularité de ce format, je pense que son emploi avec Panoramic peut ouvrir des perspectives. En tout cas, encore Bravo. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: KGF_dll - nouvelles versions Lun 9 Mar 2015 - 13:10 | |
| C'est un peu tot mais dans quelques semaines, ça pourra être pratique pour étudier les objets exportés en XML depuis ServiceNow. Je testerais peut être dans quelques temps quand j'aurais matière à l'utiliser. | |
| | | 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
| |
| |
| |