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 | |
|
+8JL35 Marc papydall Jicehel Yannick pascal10000 Minibug Klaus 12 participants | |
Auteur | Message |
---|
Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Demande d'une nouvelle fonction de KGF. Lun 5 Déc 2016 - 15:16 | |
| Bonjour.
Un grand merci Klaus, c'est exactement ce que je recherchais. Et la fonction est ultra-rapide. | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Demande d'une nouvelle fonction de KGF. Mar 6 Déc 2016 - 8:57 | |
| Bonjour.
@Klaus.
Encore merci pour la nouvelle fonction de recherche de chaîne, dont la vitesse de traitement est vraiment phénoménale.
Mais, au lieu d'envoyer les résultats dans le presse-papiers, te serait-il possible de les envoyer dans un objet système (combo, memo, ...), dont on fournirait le handle.
Merci de 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 Mar 6 Déc 2016 - 10:43 | |
| Nouvelle version: KGF.dll V7.09 du 06/12/2016Nouveautés: - 2 nouveaux paramètres pour SearchStringInTextFileModules modifiés: KGF.dllLa doc est inchangée et reste à corriger. Les sources sont à jour. Ces deux nouveaux paramètres sont: OutType%: 0=clipboard 1=memo 2=combo 3=list Output%: ignoré si OutType%=0, ou handle de l'objet sinon Voici un programme de démo: - Code:
-
' test_SearchStringInTextFile.bas
label exec
dim res%, fic$, crit$
full_space 0 dll_on "KGF.dll" memo 1 : bar_both 1 : top 1,40 : width 1,300 : height 1,400 combo 2 : left 2,310 : top 2,40 : width 2,300 : height 2,400 list 3 : left 3,620 : top 3,40 : width 3,300 : height 3,400
option 10 : top 10,10 : left 10, 10 : caption 10,"Clipboard" option 11 : top 11,10 : left 11,110 : caption 11,"Memo" option 12 : top 12,10 : left 12,210 : caption 12,"Combo" option 13 : top 13,10 : left 13,310 : caption 13,"List"
alpha 20 : top 20,10 : left 20,510 : caption 20,"Critère:" edit 21 : top 21,10 : left 21,580 : width 21,100 button 22 : top 22,10 : left 22,690 : caption 22,"Exécuter" : on_click 22,exec mark_on 10
fic$ = "dico_français_espagnol.txt" text 21,"travail" end
exec: crit$ = text$(21) ' res% = dll_call4("SearchStringInTextFile",adr(fic$),adr(crit$),LineNumbers%, AtStartOnly%, OutType%, OutHandle%) ' LineNumbers: 0=pas de numéros de ligne <>0=numéros de ligne ' AtStartOnly: 0=dans toute la ligne <>0=au début de la ligne uniquement ' OutType%: 0=clipboard 1=memo 2=combo 3=list if checked(10)=1 clear 1 res% = dll_call6("SearchStringInTextFile",adr(fic$),adr(crit$),1,1,0,0) clipboard_paste 1 end_if if checked(11)=1 clear 1 res% = dll_call6("SearchStringInTextFile",adr(fic$),adr(crit$),1,1,1,handle(1)) end_if if checked(12)=1 clear 2 res% = dll_call6("SearchStringInTextFile",adr(fic$),adr(crit$),1,1,2,handle(2)) end_if if checked(13)=1 clear 3 res% = dll_call6("SearchStringInTextFile",adr(fic$),adr(crit$),1,1,3,handle(3)) end_if message str$(res%)+" lignes trouvées" return
end
| |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Demande d'une nouvelle fonction de KGF. Mar 6 Déc 2016 - 13:40 | |
| Bonjour.
Encore merci Klaus, ces deux nouveaux paramètres simplifient encore un peu plus mon code.
Tout simplement GENIAL ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 6 Déc 2016 - 19:15 | |
| Cette fonction va être une bénédiction pour les recherches... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Mar 6 Déc 2016 - 21:18 | |
| Bonsoir Klaus !
J'ai testé ton code et cette fonction est tout simplement géniale ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| | | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: souci d' affichage specialbutton Mer 7 Déc 2016 - 3:01 | |
| Klaus, j' ai un souci avec l' affichage des specialbutton au démarrage. J' ai créé une barre avec 8 specialbutton dont certains sont mis en inactif au départ (les séparateurs ). j' ai une librairie de 8 icones pour ne pas réutiliser un même indice pour ces boutons séparateurs. Au départ certains boutons (les séparateurs) ont une image qui n' est pas la leur. mais cela rentre dans l' ordre si je fais survoler la barre par le curseur. Et autre détails, mes séparateurs qui devraient être inactif, ne le sont pas. J' ai mis un zip sur mon webdav ( la création se fait de la ligne 329 à ....je ne sais plus, y en a déjà trop , si 350) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mer 7 Déc 2016 - 17:11 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mer 7 Déc 2016 - 19:04 | |
| Premiers résultats: 1. le fichier ILB n'est pas lisible par l'outil IcoLibrary. Il n'a donc pas été créé par cet outil. Ce n'est pas grave en soi, puisque des icônes sont bien visibles dans ton programme, mais cela m'empêche de contrôler l'organisation du fichier. Tant pis, on fera sans. 2. tu as apparemment réservé 3 icônes par bouton. Extrait de la doc: - Citation :
- On définit une ImageList pour la barre d'outils, et tous les boutons prennent leurs images dans cette ImageList, via un numéro d'image (1, 2, ...). Pour chaque bouton, il faut prévoir 3 images dont les numéros se suivent, et qui correspondent à 4 états différents. Les états possibles sont:
dim sbsNormal% : sbsNormal% = 0 dim sbsHover% : sbsHover% = 1 dim sbsHit% : sbsHit% = 2 dim sbsInactive% : sbsInactive% = 3
Je confesse: j'aurais dû écrire "4 images" au lieu de 3 images. Mais la suite du texte dut bien qu'il s'agit des images pour les 4 états possibles, et les 4 états sont indiqués. Et en conséquence, pour les boutons en état "inactive", ce sera la première icône du bouton suivant qui sera utilisée. Ce qui explique ton décalage au démarrage. Je corrige la faute de frappe dans la doc et mets à jour. 3. il y avait un bug dans la gestion du survol d'un bouton inactif. Ceci est corrigé et tu peux charger la nouvelle version de la DLL. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mer 7 Déc 2016 - 19:05 | |
| Nouvelle version: KGF.dll V7.10 du 07/12/2016
Nouveautés: - SpecialButton: correction d'un bug dans la gestion du survol d'un bouton inactif
Modules modifiés: KGF.dll
La doc est inchangée et reste à corriger. Les sources sont à jour. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 7 Déc 2016 - 21:20 | |
| J' ai rechargé la dll adapté mon programme ajouté des images dans l' imagelist ...et tout est rentré dans l' ordre ! Merci Klaus. J' ai aussi testé la dernière fonction de recherche, c' est phénoménal ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Mer 7 Déc 2016 - 23:48 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 8 Déc 2016 - 20:56 | |
| Nouvelle version: KGF.dll V7.11 du 08/12/2016Nouveautés: - nouvel objet: FastTextFile et ses fonctions de gestionModules modifiés: KGF.dll KGF.chmLa doc est inchangée et reste à corriger. Les sources sont à jour. Cet objet utilise le mode d'accès ultra-rapide de la fonction SearchStringInTextFile (dont la documentation a été faite dans le groupe des fonctions de chaînes de caractères !) pour réaliser des fonctions de lecture, écrituren recherche dans un fichier texte quelconque. C'est très, très rapide. Et, cerise sur le gâteau, on peut faire de l'accès direct par ligne, malgré le fait que les lignes dont de longeur variable ! En effet, on gère la notion de "position actuelle" qui est le prochain numéro de ligne à lire. Et cette position peut être manipulée en la modifiant, soit de façon relative par rapport la position actuelle, soit de façon absolue en imposant une nouvelle position actuelle. C'est une grande nouveauté. Voici un programme démo qui utilise un des dictionnaires de Pdreo Alvarez, à titre d'exemple. Ma version (déjà ancienne) contient plus de 43000 Lignes. Le programme de démo demande d'abord l'autorisation de faire une copie du fichier (sous un autre nom). Elle est réalisée par une boucle lecture séquentielle/écriture séquentielle. L'occasion de constater vraiment les performances. Puis, le programme lit les 1000 premières lignes dans un mémo, effectue quelques opérations de positionnement suivi de lectures et affiche les résultats dans des combos et lists, en affichage des libellés indiquant la nature des opérations. Etudiez bien le source - la manipulation est très aisée. La documentation est complète, dans ma section des "Objets": - Code:
-
' test_FastTextFile.bas
dim res%, fic$, s$, ActLig%, crit$
dll_on "KGF.dll"
dim ftfOtClipboard% : ftfOtClipboard% = 0 dim ftfOtMemo% : ftfOtMemo% = 1 dim ftfOtCombo% : ftfOtCombo% = 2 dim ftfOtList% : ftfOtList% = 3
memo 1 : full_space 1 : bar_both 1 : height 1,height(1) - 30 : top 1,top(1) + 30 combo 2 : width 2,width(1)
dim ligne$ : ligne$ = string$(500," ") : ' 500 ou plus - il faut mettre la longueur maximale attendue dim ncar% : ' nombre de caractères lus dim FTF% : ' identification du fichier ouvert en lecture dim FTF2% : ' identification du fichier en écriture dim fichier$ : ' nom du fichier à ouvrir dim fichier2$ : ' nom du fichier en sortie dim txt$ : ' texte récupére après la lecture dim i%
fichier$ = "dico_français_espagnol.txt" fichier2$ = "dico_français_espagnol_copie.txt"
if message_confirmation_yes_no("Dupliquer le fichier ?")=1 ' *** copie complète par read/write FTF% = dll_call4("OpenFastTextFileForRead",adr(fichier$),adr(ligne$),0,adr(ActLig%)) if FTF%=0 then message "Erreur en ouverture" if file_exists(fichier2$)=1 then file_delete fichier2$ FTF2% = dll_call3("OpenFastTextFileForWrite",adr(fichier2$),0,adr(ActLig%)) ncar% = 0 cursor_hourglass 0 cursor_hourglass 1 while ncar%>=0 ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement if ncar%>=0 then res% = dll_call2("WriteFastTextFileLine",FTF2%,adr(ligne$)) : ' écrire une ligne séquentiellement end_while res% = dll_call1("CloseFastTextFile",FTF%) res% = dll_call1("CloseFastTextFile",FTF2%) cursor_default 0 cursor_default 1 end_if
' *** lire les 1000 premières lignes dans le mémo FTF% = dll_call4("OpenFastTextFileForRead",adr(fichier$),adr(ligne$),0,adr(ActLig%)) hide 1 for i%=1 to 1000 ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement if ncar%<0 message "eof" exit_for end_if item_add 1,str$(ActLig%)+" "+ligne$ : ' la fonction place un #0 à la fin du texte lu next i% show 1
item_add 1," " item_add 1," Retour de 2 lignes en arrière:" res% = dll_call2("SkipFastTextFileLines",FTF%,0-2) ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement item_add 1,str$(ActLig%)+" "+ligne$ : ' la fonction place un #0 à la fin du texte lu ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement item_add 1,str$(ActLig%)+" "+ligne$ : ' la fonction place un #0 à la fin du texte lu item_add 1," " item_add 1," Positionner en ligne 3:" res% = dll_call2("PositionToFastTextLine",FTF%,3) ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement item_add 1,str$(ActLig%)+" "+ligne$ : ' la fonction place un #0 à la fin du texte lu ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement item_add 1,str$(ActLig%)+" "+ligne$ : ' la fonction place un #0 à la fin du texte lu res% = dll_call1("GetFastTextPosition",FTF%) : ' retourner ma position actuelle item_add 1," Position actuelle: "+str$(res%)+" = "+str$(ActLig%) item_add 1," " item_add 1," SearchString 'jardin' ==> Combo" crit$ = "jardin" res% = dll_call6("SearchStringInFastTextFile",FTF%,adr(crit$),1,1,ftfOtCombo%,handle(2))
item_add 1," " item_add 1," 3xFindNextStringInFastTextFile avec jardin" res% = dll_call3("FindNextStringInFastTextFile",FTF%,adr(crit$),1) item_add 1,str$(res%)+" "+ligne$ res% = dll_call3("FindNextStringInFastTextFile",FTF%,adr(crit$),1) item_add 1,str$(res%)+" "+ligne$ res% = dll_call3("FindNextStringInFastTextFile",FTF%,adr(crit$),1) item_add 1,str$(res%)+" "+ligne$
res% = dll_call1("CloseFastTextFile",FTF%)
end
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Jeu 8 Déc 2016 - 23:25 | |
| Bonsoir klaus ! Je me doutais bien que tu allais faire quelque chose comme ça ! Par contre, pour la mise en œuvre cela semble moins évident... Mais je vais prendre mon temps ce week-end pour regarder tout ça. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Jeu 8 Déc 2016 - 23:32 | |
| En allant à l'essentiel, c'est simple. Regarde le coeur de la boucle copiant le fichier: - Code:
-
FTF% = dll_call4("OpenFastTextFileForRead",adr(fichier$),adr(ligne$),0,adr(ActLig%)) FTF2% = dll_call3("OpenFastTextFileForWrite",adr(fichier2$),0,adr(ActLig%)) ncar% = 0 while ncar%>=0 ncar% = dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement if ncar%>=0 then res% = dll_call2("WriteFastTextFileLine",FTF2%,adr(ligne$)) : ' écrire une ligne séquentiellement end_while res% = dll_call1("CloseFastTextFile",FTF%) res% = dll_call1("CloseFastTextFile",FTF2%)
2 ouvertures 1 boucle sur un read suivi d'un write 2 fermetures | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: KGF.DLL Ven 9 Déc 2016 - 8:12 | |
| Bonjour. Klaus, j'ai étudié ton code avec grand intérêt. J'ai créé une routine afin de tester les différentes possibilités de lecture d'un grand fichier. Malheureusement, en exécutant le test 3, le programme ne s'arrête pas. Aurais-je omis quelque chose ? Merci de ton aide. - Code:
-
dll_on "kgf"
dim a$, ActLig%, b$, fichier$, FTF%, k%, l%, ligne$, ncar%, res%
dlist 1
b$=time$
fichier$="dico_français_anglais.txt"
test3()
message b$+" : "+time$
end
' 19 sec sub test1() file_load 1,fichier$
for k%=1 to count(1) a$=item_read$(1,k%) ' if len(a$)>l% then l%=len(a$) next k% end_sub
' 20 sec sub test2() file_open_read 1,fichier$
while file_eof(1)=0 file_readln 1,a$ end_while end_sub
' sec sub test3() ' Ajusté à la longueur de la plus grande ligne. ligne$=string$(1520," ") FTF%=dll_call4("OpenFastTextFileForRead",adr(fichier$),adr(ligne$),0,adr(ActLig%)) ncar%=0 while ncar%>=0 ncar%=dll_call2("ReadFastTextFileLine",FTF%,0) : ' lire une ligne séquentiellement end_while res%=dll_call1("CloseFastTextFile",FTF%) end_sub | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 8:51 | |
| Bonjour Klaus !
Dans ton exemple au dessus, à chaque fois que je cherche a dupliquer le fichier j'ai un message d'erreur Panoramic a cessé de fonctionner ! J'ai bien pris la dernière version de KGF mais rien n'y change... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 10:04 | |
| Tu as raison - il y avait unn bug dans la détection de fun de fichier. C'est corrigé. Tu peux recharger la DLL. | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: KGF.DLL Ven 9 Déc 2016 - 10:15 | |
| Bonjour.
Je viens de télécharger la dernière version de KGF.DLL.
Le test 3 indique une durée d'exécution de 36 sec, bien supérieure aux deux autres tests ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 10:35 | |
| Je vais regarder cela de près. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 13:40 | |
| Bon, j'ai fait des essais. Au premier regard, effectivement, c'est plus lent, et sensiblement plus lent. Donc, j'ai cherché. Et j'ai trouvé. En fait, c'est le passage de Panoramic à la DLL qui cause problème. L'exécution de la commande DLL_CALLx prend beaucoup de temps. J'ai mesuré avec DLL_CALL0, et ma mesure indique 0,16 ms par appel. Et avec mon fichier de 43000 lignes, on arrive à 7 secondes, rien que pour le DLL_CALL0, sans même faire le READ physique que j'ai éliminé de la fonction pour faire les tests. Avec le READ, on passe de 7 secondes à 8 secondes pour 43000 lignes.
Conclusion: Tant que je n'ai pas trouvé une astuce pour accélérer l'appel des fonctions DLL, ce composant FastTextFile ne sert à rien, malheureusement. Il reste très performant tant qu'on reste en Delphi pur (la preuve en est la fonction SearchStringInTextFile qui est époustouflante), les performances sont excellentes. Mais dès qu'on veut faire des accès individuels, l'interface Panoramic/DLL fait s'écrouler les performances.
Reste que la fonction de positionnement relatif ou absolu dans un fichier texte par numéro de ligne est une fonctionnalité intéressante et là, pour le coup, performante puisqu'elle s'effectue en Delphi pur.
A suivre. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 18:48 | |
| Bonsoir Klaus ! Y a t il un moyen de récupérer le numéro de l'objet Panoramic qui supporte la fenêtre SYNEDIT ? J'ai le HANDLE mais comment récupérer ensuite le numéro ? Il s'agit de récupérer la hauteur et la largeur de l'objet Panoramic ( WIDTH(n%) et HEIGHT(n%) ) j'ai récupéré des valeurs mais elle ne semble pas correctes ! Je suis perdu... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 19:25 | |
| Tu as le handle ? Alors, essaie ceci: - Code:
-
res% = DLL_call5("GetFormMetrics",hnd%,adr(gauche%),adr(haut%),adr(largeur%),adr(hauteur%)) | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: KGF_dll - nouvelles versions Ven 9 Déc 2016 - 19:40 | |
| Merci Klaus ! ça fonctionne parfaitement. Avec KGF on a plein de fonctions que l'on ne connaît pas... Même si ta documentation est bien faite, elle reste dans certains cas assez obscure. C'est dommage car il y a une tonne de chose dans cette DLL qui sont tout simplement de vrais bijoux. Peut être faudrait il y insérer des copies d'écrans ou peut être des d'explications plus détaillées. Perso, j'avoue ne pas toujours savoir ou comprendre comment les utiliser et c'est vraiment dommage. Heureusement tu es là pour nous guider dans cette bibliothèque géante... Encore merci Klaus. | |
| | | 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
| |
| |
| |