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 |
|
|
| un petit lecteur navigateur PDF | |
| | Auteur | Message |
---|
Invité Invité
| Sujet: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 1:14 | |
| Ce programme a été fait pour l'un de mes fils pour ses études, pour ne pas imprimer des pages pdf. Je l'ai fait selon sa volonté de ne pas avoir trop de bouton. Le but est de mettre dans une liste tous les pdf et images (car ça marche aussi) d'un dossier, et d'en choisir 3 parmi la liste, et naviguer entre ses 3 fichiers à la fois, car évidemment on peut changer ensuite. Ce programme je le mets ici, car je voudrai montrer un problème, ou même amener à une réflexion, sinon je ne pense pas qu'il aura beaucoup d'intérêt pour vous. Pour ce programme, j'ai préféré utiliser un lecteur pdf "Sumatra" qui n'est pas une usine à gaz. - ici:
- Code:
-
' programme pour lire des fichiers pdf sélectionnés. label clic , nom dim clic% ,dos$ ,f1$,f2$,f3$ , f$ , item$ , pdf$ pdf$ = "C:\PROGRA~2\SUMATR~1\SUMATR~1.EXE "
full_space 0 :width 0,320 open_dialog 1 : save_dialog 2 main_menu 60 sub_menu 61:parent 61,60 : caption 61,"choisir_dossier" :on_click 61,clic sub_menu 62:parent 62,60 : caption 62," Aide" :on_click 62,clic
list 10:height 10,screen_y-200:width 10,300:font_size 10,10 :top 10,75 :hint 10,"cliquer sur une ligne pour choisir un fichier" color 10,255,255,140 : on_click 10, nom button 11 :left 11,10:width 11,270:height 11,20 :on_click 11,clic :hint 11,"lecture du fichier " + caption$(11) button 12 :left 12,280:width 12,20 :height 12,20 :on_click 12,clic :hint 12,"informer le bouton de gauche du fichier choisi"
button 21 : left 21,10: top 21,25:width 21,270:height 21,20 :on_click 21,clic :hint 21,"lecture du fichier " + caption$(21) button 22 : left 22,280: top 22,25:width 22,20:height 22,20 :on_click 22,clic :hint 22,"informer le bouton de gauche du fichier choisi"
button 31 :left 31,10 : top 31,50:width 31,270:height 31,20 :on_click 31,clic :hint 31,"lecture du fichier " + caption$(31) button 32 :left 32,280: top 32,50:width 32,20 : height 32,20 :on_click 32,clic :hint 32,"informer le bouton de gauche du fichier choisi"
end ' ====================================== clic: clic% = number_click if clic% = 61 filter 1,"choisir une image document|*.pdf" f$ = file_name$(1) if f$ <> "_" dos$ = file_extract_path$(f$) : caption 0,dos$ dir_dialog 1,dos$ item_add 10,file_extract_name$(f$) dir() end_if end_if ' .......................... if clic% = 62 then aide() ' .............. if count(10) > 0 if item_index(10) = 0 then return
if clic% = 11 if f1$ <> "" then lancer_lecture(11,f1$) end_if ' ............ if clic% = 12 if item$ <> "" then f1$ = item$ :caption 11,item$ end_if ' ................................................. if clic% = 21 if f2$ <> "" then lancer_lecture(21,f2$) end_if ' ............ if clic% = 22 if item$ <> "" then f2$ = item$ :caption 21,item$ end_if ' .................................................. if clic% = 31 if f3$ <> "" then lancer_lecture(31,f3$) end_if ' ............. if clic% = 32 if item$ <> "" then f3$ = item$ :caption 31,item$ end_if end_if ' .................... return ' ======================= sub aide() dim_local t$ :t$ = chr$(13) + chr$(10) form 70 : width 70,800 : top 70,100 : left 70,500 : height 70,360 memo 71 : parent 71,70 :full_space 71 : font_size 71,12 : color 71,236,181,40 repeat : until scancode = 0 item_add 71,"- Choisir un dossier, puis cliquer sur n'importe quel fichier pour valider le choix du dossier" +t$ item_add 71,"- Choisir un fichier dans la liste proposée jaune." +t$ item_add 71,"- En cliquant sur l'un des trois boutons de droite, on permet au bouton de gauche, de lancer la lecture de ce fichier" +t$ item_add 71,"- En cliquant sur le bouton de gauche, on lance la lecture du fichier correspondant" +t$ item_add 71,"- Il faut fermer le lecteur pdf avant de changer. On peut quitter le lecteur avec <esc>, si celui-ci a été mis à 'TRUE' dans le fichier de configuration." + chr$(0) repeat : pause 1000 : until scancode > 0 delete 70 end_sub
sub lancer_lecture(n%,f$) inactive 11 : inactive 21 : inactive 31 : inactive 10 if f1$ <> "" dim_local h% , a% execute pdf$ + dos$+f$ if 1 = 1 repeat wait 500 h% = handle_form(caption$( n%) + " - [" + left$(f$,len(f$)-4) + "] - SumatraPDF") a%=a%+1 caption 0,h% until a% = 10 if h% > 0 repeat pause 1000 until handle_form(caption$( n%) + " - [" + left$(f$,len(f$)-4) + "] - SumatraPDF") = 0 caption 0,handle_form(caption$( n%) + " - [" + left$(f$,len(f$)-4) + "] - SumatraPDF") end_if end_if end_if active 11 : active 21 : active 31 : active 10 end_sub
nom: item$ = item_index$(10) return
sub dir() dim_local fiche$ clear 10 fiche$ = file_find_first$ if right$(upper$(fiche$),4)=".PDF" or right$(upper$(fiche$),4) = ".BMP" or right$(upper$(fiche$),4) = ".JPG" then item_add 10,fiche$ fiche$ = file_find_next$ while fiche$<>"_" fiche$=file_find_next$ if fiche$ <> "_" if right$(upper$(fiche$),4)=".PDF" or right$(upper$(fiche$),4) = ".BMP" or right$(upper$(fiche$),4) = ".JPG" item_add 10,fiche$ end_if end_if end_while file_find_close end_sub
Parlons de mes remarques: J'ai une SUB lancer_lecture(n%,f$), et dans celle-ci j'essaye de choper le handle d'une form, et de boucler en attente que cette forme soit fermée. Pourquoi? car si on ne ferme pas la fenêtre du PDF, à chaque clic pour ouvrir un fichier, on accumule le nombre de fenêtre ouverte. Çà marche, ou ça ne marche pas. C'est selon les fichiers. Il y a des fichier qui se recopie sans l'extension entre accolades dans le titre, et d'autres qui trouve une extension dans le nom, se qui fait que pour certains fichiers, on ne peut connaitre le handle de la fenêtre pdf. Vous allez dire en voyant le programme, il y a une partie qui est: if 1 = 1....end_if. On peut faire autrement! Et pourquoi je ne choisi pas cette solution? A vous de voir! |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 1:35 | |
| Dans KGF.dll, tu peux utiliser:
' trouver le handle d'un process à partir du nom de l'EXECUTABLE res% = DLL_call1("GetProcessWindowHandle",adr(exe$)) ' trouver le handle d'un process à partir du nom de l'EXECUTABLE ou d'une DLL hnd% = dll_call1("GetWindowModuleHandle",adr(nom$)) ' trouver le handle d'un process à partir d'une PARTIE du titre de la fenêtre (avec mode%=1) res% = dll_call2("GetWindowByTitle",mode%,adr(titre$))
Cela pourra certainement t'aider pour trouver le handle dans tous les cas !
| |
| | | Invité Invité
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 1:59 | |
| Il me semblait bien que tu avais fait une dll là dessus. Mais je voudrais soulever une nouvelle fois un problème, car celui-ci a déjà été soulevé par moi, au moins deux fois, sans aucune réaction.
Plutôt que de se servir comme je l'ai fait d'un handle de fenêtre, il y a execute_wait ! Pourquoi je ne l'utilise jamais? Car execute-wait est une usine à gaz. Je le mets en gros, car cette fois-ci j'aurai peut-être une réaction.
Si vous essayez le programme tel-qu’il est avec votre editeur pdf, et vous ouvrez le gestionnaire de tâche pour voir les performances, après stabilisation de la courbe, et relevé les niveaux, et ensuite, vous mettez: if 1=2 à la place de if 1 = 1, et transformé execute en execute_wait, vous refaites les mêmes testes, et constaté la différence. Sur mon vieux XP et EEEPC, je tourne à 100%, et avec W7, 100%, puis ça arrive à descendre vers les 50%. Pour moi, ce n'est pas normal, qu'une simple instruction puisse faire celà.
Je voulais éviter de mettre une dll, car il y a un bon moment que je ne me suis pas mis à jour, et ce n'est pas mon ordi. Il faut que je retranspose celà. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 9:50 | |
| Je comprends que tu veuilles le faire sans DLL. Il y a effectivement un problème avec EXECUTE_WAIT, au niveau de la charge CPU.
C'est pour cela que j'utilise une fonction de KGF.dll qui correspond à EXECUTE (c'est dans "fonctions diverses" de la doc):
' lancer un programme et récupérer son handle res% = DLL_call3("ExecuteProgram",adr(path$),adr(param$),adr(folder$)) Comme ça, j'ai le handle immédiatement, et je peux utiliser un timer pour détecter la fin du programme. Plus de problème de CPU... | |
| | | Invité Invité
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 10:04 | |
| Ah j'ai changé mon message en se croisant. J'avais un autre programme de teste pour montrer le problème, en espérant des réactions. Il faut faire un exécutable du programme avec if 1 = 1 sous "demo_performance.exe", puis remettre if 1 = 2, et lancer le programme, faire les deux testes. Le programme est fait, donc de cette façon tout le monde peut tester. - Code:
-
' programme en 2 parties ' partie 1 avec if 1 = 1, et faire un exécutable sous "demo_performance.exe", puis mettre if 1 = 2 dim caption% if 1 = 1 caption 0,"demo_performance" memo 1:full_space 1:item_add 1,"voir les performances du gestionnaire de tâche avant de fermer" item_add 1,"attendre le temps que la courbe se stabilise" ' faire un execuble avec ce programme avec if 1 = 1, avec le nom : demo_performance.exe else left 0,600 if message_warning_yes_no("YES pour boucle execute - ou - NO pour execute_wait") = 1 ' on fait le teste avec WAIT seul , sinon c'est avec execute_wait caption 0,"on attend l'ouverture de la fenêtre sinon <ESC>" execute "demo_performance.exe" repeat : pause 100 : until scancode = 0
repeat : pause 500 caption% = handle_form("demo_performance") until caption% > 0 or scancode = 27
repeat : pause 500 :caption 0,handle_form("demo_performance") until handle_form("demo_performance") <> caption% or scancode = 27 else execute_wait "demo_performance.exe" end_if terminate end_if
|
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 10:31 | |
| Chez moi, sous XP-PRO SP3, EXECUTE_WAIT mange 50% de CPU, alors que la boucle avec EXECUTE ne mange que 1 à 2 %. Le problème est flagrant. A l'évidence, la détection de la fin du processus lancé par EXECUTE_WAIT n'est pas faite comme il faut. | |
| | | Invité Invité
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 15:26 | |
| Bien, j'ai refais le programme avec kgf - programme:
- Code:
-
' programme pour lire des fichiers pdf sélectionnés. label clic , nom ,quit , ferme_aide dim clic% ,dos$ ,f1$,f2$,f3$ , f$ , item$ , pdf$ ,dll$ , titre$ , active% pdf$ = "C:\PROGRA~2\SUMATR~1\SUMATR~1.EXE " dll$ = dir_current$+"\kgf.dll" :caption 0,dll$ dll_on dll$ full_space 0 :width 0,320 open_dialog 1 : save_dialog 2 main_menu 60 sub_menu 63:parent 63,60 : caption 63,"&Quitter " sub_menu 61:parent 61,60 : caption 61," choisir_dossier"
sub_menu 62:parent 62,60 : caption 62," Aide"
list 10:height 10,screen_y-200:width 10,300:font_size 10,10 :top 10,75 :hint 10,"cliquer sur une ligne pour choisir un fichier" color 10,255,255,140 button 11 :left 11,10:width 11,270:height 11,20 :hint 11,"lecture du fichier " + caption$(11) button 12 :left 12,280:width 12,20 :height 12,20 :hint 12,"informer le bouton de gauche du fichier choisi"
button 21 : left 21,10: top 21,25:width 21,270:height 21,20 :hint 21,"lecture du fichier " + caption$(21) button 22 : left 22,280: top 22,25:width 22,20:height 22,20 :hint 22,"informer le bouton de gauche du fichier choisi"
button 31 :left 31,10 : top 31,50:width 31,270:height 31,20 :hint 31,"lecture du fichier " + caption$(31) button 32 :left 32,280: top 32,50:width 32,20 : height 32,20 :hint 32,"informer le bouton de gauche du fichier choisi"
on_close 0,quit active_clic() end
' ====================================== sub active_clic() active 0 on_click 63,quit on_click 61,clic on_click 62,clic on_click 10, nom on_click 11,clic on_click 12,clic on_click 21,clic on_click 22,clic on_click 31,clic on_click 32,clic active% = 1 end_sub
sub inactive_clic() inactive 0 off_click 63 off_click 61 off_click 62 off_click 10 off_click 11 off_click 12 off_click 21 off_click 22 off_click 31 off_click 32 active% = 0 end_sub
' ====================================== clic: clic% = number_click if clic% = 61 and active% = 1 filter 1,"choisir une image document|*.pdf" f$ = file_name$(1) if f$ <> "_" dos$ = file_extract_path$(f$) : caption 0,dos$ dir_dialog 1,dos$ item_add 10,file_extract_name$(f$) dir() end_if end_if ' .......................... if clic% = 62 and active% = 1 then aide() ' .............. if count(10) > 0 if item_index(10) = 0 then return
if clic% = 11 if f1$ <> "" then lancer_lecture(11,f1$) end_if ' ............ if clic% = 12 if item$ <> "" then f1$ = item$ :caption 11,item$ end_if ' ................................................. if clic% = 21 if f2$ <> "" then lancer_lecture(21,f2$) end_if ' ............ if clic% = 22 if item$ <> "" then f2$ = item$ :caption 21,item$ end_if ' .................................................. if clic% = 31 if f3$ <> "" then lancer_lecture(31,f3$) end_if ' ............. if clic% = 32 if item$ <> "" then f3$ = item$ :caption 31,item$ end_if end_if ' .................... return
' ======================= sub aide() inactive 0 : inactive_clic() :' il y en a peut-être inutile, mais bon! dim_local t$ :t$ = chr$(13) + chr$(10) form 70 : width 70,800 : top 70,100 : left 70,500 : height 70,360 : on_close 70,ferme_aide : border_small 70 memo 71 : parent 71,70 :full_space 71 : font_size 71,12 : color 71,236,181,40
item_add 71,"- Choisir un dossier, puis cliquer sur n'importe quel fichier pour valider le choix du dossier" +t$ item_add 71,"- Choisir un fichier dans la liste proposée jaune." +t$ item_add 71,"- En cliquant sur l'un des trois boutons de droite, on permet au bouton de gauche, de lancer la lecture de ce fichier" +t$ item_add 71,"- En cliquant sur le bouton de gauche, on lance la lecture du fichier correspondant" +t$ item_add 71,"- Il faut fermer le lecteur pdf avant de changer. On peut quitter le lecteur avec <esc>, si celui-ci a été mis à 'TRUE' dans le fichier de configuration." + chr$(0) end_sub
ferme_aide: delete 70 active 0 active_clic() to_foreground 0 return
sub lancer_lecture(n%,f$) inactive_clic() if f1$ <> "" dim_local h% , a%
titre$ = caption$(n%) execute pdf$ + dos$+f$ if 1 = 1 repeat wait 500 h% = dll_call2("GetWindowByTitle",1,adr(titre$)) a%=a%+1 caption 0,h% until a% = 10
if h% > 0 repeat pause 500 until dll_call2("GetWindowByTitle",1,adr(titre$)) <> h% end_if end_if end_if active_clic() :to_foreground 0 end_sub
nom: item$ = item_index$(10) return
sub dir() dim_local fiche$ clear 10 fiche$ = file_find_first$ if right$(upper$(fiche$),4)=".PDF" or right$(upper$(fiche$),4) = ".BMP" or right$(upper$(fiche$),4) = ".JPG" then item_add 10,fiche$ fiche$ = file_find_next$ while fiche$<>"_" fiche$=file_find_next$ if fiche$ <> "_" if right$(upper$(fiche$),4)=".PDF" or right$(upper$(fiche$),4) = ".BMP" or right$(upper$(fiche$),4) = ".JPG" item_add 10,fiche$ end_if end_if end_while file_find_close end_sub
quit: dll_off terminate
Je rajouterai kgf sur la clé Là pas de problème, ça marche. Merci Klaus. J'ai apporté des modifications, car si cela fonctionnait bien avec les clics d'une souris, j'avais des problèmes avec un touche-pad.
Dernière édition par cosmos70 le Sam 26 Oct 2013 - 0:34, édité 1 fois |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: un petit lecteur navigateur PDF Ven 25 Oct 2013 - 15:41 | |
| Ca à l'air sympa, je testerai ça dimanche aussi | |
| | | Contenu sponsorisé
| Sujet: Re: un petit lecteur navigateur PDF | |
| |
| | | | un petit lecteur navigateur PDF | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |