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 |
|
|
| Arrêt d'un programme dans l'éditeur | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Arrêt d'un programme dans l'éditeur Sam 23 Juil 2016 - 21:57 | |
| J'ai un problème que je ne m'explique pas dans le programme qui suit, dans l'éditeur Panoramic: - si je le ferme en cliquant sur le bouton en haut à droite du Form 0, aucun problème. - si je le ferme par appui sur la touche 'Quitter', qui renvoie au S/P Quit qui ne contient que TERMIN, je ne peux pas le relancer ensuite, l'appui sur la flèche rouge 'Éclair' de l'éditeur est inefficace. Je dois cliquer le menu 'Stop', puis recliquer sur l'éclair pour relancer. Et souvent je récupère ceci en cliquant sur Stop: (je clique 'Annuler' et ça repart). Quelque chose ne doit pas être libéré quand je fais TERMIN, ou quelque chose comme ça, mais je ne vois pas quoi... PS j'ai modifié quelques bricoles, et du coup je ne reproduis plus le défaut, ça se termine normalement... Tant pis, ou plutôt tant mieux, et si le programme peut intéresser quelqu'un, c'est cadeau. Le programme est destiné à regrouper des images (photos) dans un format A4 pour impression, en choisissant le nombre de colonnes d'images (le programme en déduit le nombre de rangées). Les ressources externes utilisées sont IrfanView (pour redimensionnement des images) et KGF.dll pour l'impression. Pour provoquer le phénomène, chez moi, depuis l'éditeur, il suffit de lancer le programme, de quitter par la touche 'Quitter', et de le relancer. Voici: - Code:
-
LABEL Quit,Chr,Calcul,Apercu,Qaper,Exec,Quitv,Imprimer DIM lst%,ori%,nc%,eh%,ev%,mg%,mh%,tit$,nf%,fr$,r$,i%,j%,a$,nbr%,wf%,hf%,wim%,him% DIM hti%,evp%,ehp%,rs,ww%,hh%,ht%,mht%,mgt%,evt%,eht%,x%,y%,c%,wbh%,wbb%,wA4%,hA4% DIM wp4%,hp4%,pmm
PICTURE 1: FULL_SPACE 1 wbb% = (WIDTH(0)-WIDTH(1))/2: ' bordures latérales des Forms (chacune) wbh% = HEIGHT(0)-HEIGHT(1)-wbb%: ' bordure haut des Forms (bas = latérale) DELETE 1 wA4% = 778: hA4% = 1100: ' pixels, feuille A4 grandeur nature à l'écran wp4% = 4962: hp4% = 7013: ' pixels, feuille A4 imprimante, pour 600 dpi pmm = INT(100*wp4%/210)/100: ' pixels par mm à l'impression
fr$ = "C:\TEMP\Resultat.bmp"
BORDER_SMALL 0: TOP 0,10: LEFT 0,10: WIDTH 0,320: FONT_NAME 0,"Arial": FONT_BOLD 0 COLOR 0,190,255,255: CAPTION 0," === IMAGES SUR FEUILLE A4 ==="
OPEN_DIALOG 8 MEMO 9: HIDE 9: WIDTH 9,600 LIST 10: HIDE 10: lst% = 10
ALPHA 21: TOP 21,2: CAPTION 21,"Répertoire des images (clic) :" EDIT 22: TOP 22,TOP(21)+16: LEFT 22,LEFT(21): WIDTH 22,WIDTH(0)-50 ON_CLICK 22,Chr ALPHA 23: TOP 23,TOP(22)+3: LEFT 23,LEFT(22)+WIDTH(22)+2: COLOR 23,255,255,0 CAPTION 23," "
CONTAINER_OPTION 35: TOP 35,TOP(22)+25: LEFT 35,20: WIDTH 35,WIDTH(0)-60 HEIGHT 35,30: CAPTION 35," ORIENTATION : ": COLOR 35,200,255,255 OPTION 36: PARENT 36,35: TOP 36,10: LEFT 36,100: CAPTION 36,"Portrait": MARK_ON 36 OPTION 37: PARENT 37,35: TOP 37,TOP(36): LEFT 37,LEFT(36)+80: CAPTION 37,"Paysage" ON_CLICK 36,Calcul: ON_CLICK 37,Calcul ALPHA 25: TOP 25,TOP(35)+HEIGHT(35)+10 CAPTION 25," Colonnes -> Rangées Total=" SPIN 26: TOP 26,TOP(25)-3: LEFT 26,65: WIDTH 26,45 EDIT 27: TOP 27,TOP(26): LEFT 27,LEFT(26)+110: WIDTH 27,WIDTH(26) EDIT 28: TOP 28,TOP(27): LEFT 28,LEFT(27)+90: WIDTH 28,WIDTH(27)-10 MIN 26,1: MAX 26,50: POSITION 26,3: ON_CHANGE 26,Calcul
ALPHA 30: TOP 30,TOP(25)+30 CAPTION 30," Marges G Marges H pixels." SPIN 31: TOP 31,TOP(30)-3: LEFT 31,LEFT(26): WIDTH 31,WIDTH(26) SPIN 32: TOP 32,TOP(31): LEFT 32,LEFT(27): WIDTH 32,WIDTH(31) MIN 31,75: MAX 31,1000: POSITION 31,75: ON_CHANGE 31,Calcul MIN 32,75: MAX 32,1000: POSITION 32,75: ON_CHANGE 32,Calcul ALPHA 40: TOP 40,TOP(30)+30 CAPTION 40," Écart H Écart V mm." SPIN 41: TOP 41,TOP(40)-3: LEFT 41,LEFT(26): WIDTH 41,WIDTH(26) SPIN 42: TOP 42,TOP(41): LEFT 42,LEFT(27): WIDTH 42,WIDTH(41) MIN 41,0: MAX 41,100.: POSITION 41,1: ON_CHANGE 41,Calcul MIN 42,0: MAX 42,100: POSITION 42,10: ON_CHANGE 42,Calcul CONTAINER_OPTION 50: TOP 50,TOP(40)+30: LEFT 50,20: WIDTH 50,WIDTH(0)-60 HEIGHT 50,30: CAPTION 50,"LÉGENDES : ": COLOR 50,200,255,255 OPTION 51: PARENT 51,50: TOP 51,10: LEFT 51,80: CAPTION 51,"Sans" OPTION 52: PARENT 52,50: TOP 52,TOP(51): LEFT 52,LEFT(51)+60: CAPTION 52,"Nom du fichier" MARK_ON 52 ALPHA 60: TOP 60,TOP(50)+HEIGHT(50)+5: CAPTION 60,"Titre général éventuel :" EDIT 61: TOP 61,TOP(60)+16: LEFT 61,LEFT(60): WIDTH 61,WIDTH(0)-20
ALPHA 65: TOP 65,TOP(61)+30: LEFT 65,15: COLOR 65,255,255,0
ALPHA 70: TOP 70,TOP(65)+30: CAPTION 70,"Fichier résultat :" EDIT 71: TOP 71,TOP(70)+16: LEFT 71,LEFT(70): WIDTH 71,WIDTH(61) TEXT 71,fr$
BUTTON 80: TOP 80,TOP(71)+30: LEFT 80,WIDTH(0)/2-130: CAPTION 80,"Structure" ON_CLICK 80,Apercu BUTTON 81: TOP 81,TOP(80): LEFT 81,LEFT(80)+85: CAPTION 81,"Créer" ON_CLICK 81,Exec BUTTON 82: TOP 82,TOP(80): LEFT 82,LEFT(81)+85: CAPTION 82,"Quitter" ON_CLICK 82,Quit
FORM 500: HIDE 500: BORDER_SMALL 500: TOP 500,0: LEFT 500,WIDTH(0) COLOR 500,128,128,128: FONT_BOLD 500: ON_CLOSE 500,Qaper CAPTION 500," Image A4 778 x 1100 ( image réelle = 4962 x 7013 )" PICTURE 501: PARENT 501,500: STRETCH_ON 501 BUTTON 502: PARENT 502,500: CAPTION 502,"Imprimer": ON_CLICK 502,Imprimer BUTTON 503: PARENT 503,500: CAPTION 503,"Quitter": ON_CLICK 503,Quitv BUTTON 504: PARENT 504,500: CAPTION 504,"OK": ON_CLICK 504,Qaper
GOSUB Calcul END ' ============================================================================== Quit: TERMINATE ' ============================================================================== Chr: ' Choix du répertoire des images a$ = FILE_NAME$(8): IF LEN(a$)<5 OR INSTR(a$,"")<0 THEN RETURN r$ = FILE_EXTRACT_PATH$(a$) TEXT 22,r$ EXECUTE_WAIT "cmd.exe /c DIR /B "+r$+"*.jpg | clip" CLEAR 9: CLIPBOARD_PASTE 9: CLEAR lst% FOR i% = 1 TO COUNT(9): ITEM_ADD lst%,r$+ITEM_READ$(9,i%): NEXT i% CAPTION 23,"="+STR$(COUNT(lst%))+" " RETURN ' ============================================================================== Calcul: ' Prise en compte des paramètres ori% = 0: wf% = wp4%: hf% = hp4% IF CHECKED(37) = 1 THEN ori% = 1: wf% = hp4%: hf% = wp4% nf% = 0: IF CHECKED(52) = 1 THEN nf% = 1 nc% = POSITION(26) mg% = POSITION(31): mh% = POSITION(32) eh% = POSITION(41): ev% = POSITION(42) ehp% = eh%*pmm: evp% = ev%*pmm: ' espacements mm -> en pixels wf% = wf%-mg%-75: ' dimension restant imprimable en largeur wim% = (wf%-(nc%-1)*ehp%)/nc%: ' largeur d'une image, en pixels him% = 3*wim%/4: ' hauteur d'une image (arbitrairement au format 4/3) hti% = 0: ' a priori tit$ = TEXT$(61): ' titre général éventuel IF tit$ <> "" THEN FONT_SIZE 501,80: hti% = TEXT_HEIGHT(tit$,501) hf% = hf%-mh%-75-hti%: ' hauteur maxi imprimable (marges et titre déduits) nbr% = INT(hf%/(him%+evp%)): ' nombre de rangées maxi IF nbr% = 0 THEN nbr% = 1 TEXT 27,STR$(nbr%): TEXT 28,STR$(nc%*nbr%) a$ = "-> images de: "+STR$(wim%)+" x "+STR$(him%)+" pixels ( = " a$=a$+STR$(INT(wim%/pmm))+" x "+STR$(INT(him%/pmm))+" mm ) " CAPTION 65,a$ RETURN ' ============================================================================== Apercu: ' Aperçu de la structure de l'image résultat TOP 504,1 IF ori% = 0 WIDTH 500,wA4%+2*wbb%: HEIGHT 500,hA4%+wbh%+wbb%+22 WIDTH 501,wA4%: HEIGHT 501,hA4% ELSE WIDTH 500,hA4%+2*wbb%: HEIGHT 500,wA4%+wbh%+wbb%+22 WIDTH 501,hA4%: HEIGHT 501,wA4% END_IF 2D_TARGET_IS 501: CLS: PRINT_TARGET_IS 501 HIDE 502: HIDE 503 TOP 504,HEIGHT(501): LEFT 504,WIDTH(501)/2-35: SHOW 504 GOSUB Calcul rs = hp4%/hA4%: ' rapport entre l'image réelle (4962x7012) et l'aperçu (778x1100) ww% = wim%/rs: hh% = him%/rs: ht% = hti%/rs mgt% = mg%/rs: mht% = mh%/rs: evt% = evp%/rs: eht% = ehp%/rs IF tit$ <> "" FONT_SIZE 501,13: i% = TEXT_WIDTH(tit$,501) x% = (WIDTH(501)-i%)/2: y% = mht%: PRINT_LOCATE x%,y%: PRINT tit$ END_IF FONT_SIZE 501,8 FOR j% = 0 TO nbr%-1 y% = mht%+ht%+j%*(hh%+evt%) FOR c% = 0 TO nc%-1 x% = mgt%+c%*(ww%+eht%) 2D_FILL_COLOR 196,196,196: 2D_RECTANGLE x%,y%,x%+ww%,y%+hh% IF nf% > 0: ' légende a$ = "Nom": i% = TEXT_WIDTH(a$,501) 2D_FILL_COLOR 255,255,255: PRINT_LOCATE x%+ww%-i%-2,y%+hh%: PRINT a$ END_IF NEXT c% NEXT j% SHOW 500: TO_FOREGROUND 500 RETURN ' ============================================================================== Qaper: HIDE 500 RETURN ' ============================================================================== Exec: ' Création du fichier-image (fr$) contenant les images élémentaires GOSUB Calcul fr$ = TEXT$(71) nf% = 0: IF CHECKED(52) = 1 THEN nf% = 1 PlancheA4(lst%,ori%,nc%,eh%,ev%,mg%,mh%,tit$,nf%,fr$) IF FILE_EXISTS(fr$) = 0 THEN MESSAGE "Fichier non créé !": RETURN ' Voir le résultat: TOP 502,1: TOP 503,1 IF ori% = 0 WIDTH 500,794: HEIGHT 500,1160: WIDTH 501,778: HEIGHT 501,1100 ELSE WIDTH 500,1116: HEIGHT 500,854: WIDTH 501,1100: HEIGHT 501,778 END_IF TOP 502,HEIGHT(501): LEFT 502,WIDTH(501)/2-80 TOP 503,TOP(502): LEFT 503,LEFT(502)+85 HIDE 504: SHOW 502: SHOW 503 FILE_LOAD 501,fr$: SHOW 500: TO_FOREGROUND 500 RETURN ' ============================================================================== Quitv: HIDE 500 RETURN ' ============================================================================== Imprimer: Pr_init(ori%,"") Pr_Image(fr$,0,0,Pr_lt%,Pr_ht%,0): ' toute la surface A4 Pr_Impr() RETURN ' ============================================================================== SUB PlancheA4(lst%,ori%,nc%,eh%,ev%,mg%,mh%,tit$,nf%,fr$) ' Dessin d'une planche A4 imprimable ' ori% = 0: portrait, ori% = 1: paysage ' nc% colonnes d'images ' espacement H = eh%, espacement V = ev% (millimètres), ' marges gauche (et droite) mg% et haut (et bas) mh% (pixels, minimum 75) ' titre d'en-tête tit$ (ou ""), nf%=1: légendes nom des images (sino nf%=0) ' résultat dans le fichier bmp fr$ ' La sub calcule le nombre maxi de rangées et la dimension des images (format 4/3) ' Liste des chemins des images dans le LIST lst% (path complet des images). DIM_LOCAL wp%,hp%,md%,mb%,wt%,ht%,w%,h%,wi%,hi%,nr%,c%,r%,n%,x%,y%,i%,j% DIM_LOCAL f$,iv$,fm$,s$,htit%,szt%,pmm iv$ = "C:\Progra~2\Irfanv~1\i_view32.exe" fm$ = "Z:\Image.bmp" IF mg%<75 THEN mg% = 75 IF mh%<75 THEN mh% = 75 md% = 75: mb% = 75: ' marges droite et bas minimales (pixels) wp% = 4962: hp% = 7013: ' surface totale A4 sur imprimante (600 dpi) pmm = INT(100*wp%/210)/100: ' pixels par mm à l'impression IF ori% = 1 THEN i% = wp%: wp% = hp%: hp% = i%: ' paysage wt% = wp%-mg%-md%: ' dimension imprimable en largeur eh% = eh%*pmm: ev% = ev%*pmm: ' espacements mm -> en pixels w% = (wt%-(nc%-1)*eh%)/nc%: ' largeur d'une image, en pixels h% = 3*w%/4: ' hauteur d'une image (arbitrairement au format 4/3) FORM 950: HIDE 950: WIDTH 950,wp%+16: HEIGHT 950,hp%+40 PICTURE 951: PARENT 951,950: WIDTH 951,wp%: HEIGHT 951,hp% PICTURE 952: PARENT 952,950 IMAGE 953 FORM 954: HIDE 954: BORDER_SMALL 954: TOP 954,SCREEN_Y/2-25: LEFT 954,SCREEN_X/2-200 WIDTH 954,500: HEIGHT 954,55: CAPTION 954," CRÉATION EN COURS . . ." PROGRESS_BAR 955: PARENT 955,954: WIDTH 955,WIDTH(954)-18 PRINT_TARGET_IS 951 htit% = 0: ' a priori IF tit$ <> "" szt% = 80: ' taille du titre, arbitraire FONT_SIZE 951,szt%: htit% = TEXT_HEIGHT(tit$,951) i% = TEXT_WIDTH(tit$,951) x% = (wp%-i%)/2: y% = mh%: PRINT_LOCATE x%,y%: PRINT tit$ END_IF ht% = hp%-mh%-mb%-htit%: ' hauteur maxi imprimable (marges et titre déduits) nr% = INT(ht%/(h%+ev%)): ' nombre de rangées maxi IF nr% < 1 THEN nr% = 1 FONT_SIZE 951,40: ' taille des légendes n% = 0 MIN 955,0: MAX 955,nc%*nr%-1: SHOW 954 FOR r% = 0 TO nr%-1 y% = mh%+htit%+r%*(h%+ev%) FOR c% = 0 TO nc%-1 x% = mg%+c%*(w%+eh%) 2D_TARGET_IS 951 n% = n%+1: POSITION 955,n%: IF n%>COUNT(lst%) THEN EXIT_FOR f$ = ITEM_READ$(lst%,n%) ' mise au format de l'image... ' puis transfert dans le picture en x%,y% s$=UPPER$(FILE_EXTRACT_EXTENSION$(f$)): IF s$<>".BMP" AND s$<>".JPG" THEN EXIT_FOR FILE_LOAD 952,f$: FILE_SAVE 952,fm$ FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE fm$ i% = w%: j% = h% IF wi%/hi% <> w%/h%: ' proportions différentes IF wi%/hi% > w%/h%: ' image allongée j% = w%*hi%/wi%: ' image allongée en largeur ELSE i% = h%*wi%/hi%: ' image en hauteur END_IF END_IF EXECUTE_WAIT iv$+" "+f$+" /resize=("+STR$(i%)+","+STR$(j%)+") /convert="+fm$ FILE_LOAD 953,fm$ IF j%<h% 2D_IMAGE_PASTE 953,x%,y%+h%-j% ELSE IF i%<w% 2D_IMAGE_PASTE 953,x%+w%-i%,y% ELSE 2D_IMAGE_PASTE 953,x%,y% END_IF END_IF IF nf% > 0 s$ = FILE_EXTRACT_NAME$(f$): i% = TEXT_WIDTH(s$,951) 2D_FILL_COLOR 255,255,255: PRINT_LOCATE x%+w%-i%-10,y%+h%: PRINT s$ END_IF NEXT c% IF n%>COUNT(lst%) THEN EXIT_FOR NEXT r% FILE_SAVE 951,fr$ HIDE 954 2D_TARGET_IS 0: PRINT_TARGET_IS 0: DELETE 950: DELETE 953: DELETE 954 END_SUB ' ============================================================================== SUB Pr_init(orient%,prn$) ' Initialisation imprimante ('début d'impression') ' orient% = 0 Portrait, = 1 Paysage ' prn$ = "": imprimante par défaut ' sinon nom de l'imprimante (pour essais) ' par exemple "Microsoft XPS Document Writer" impression virtuelle ' dans un fichier .XPS ' Dans les paramètres des fonctions, le positionnement initial doit être fait en ' valeurs absolues: distances par rapport aux bords gauche et haut de la feuille ' A4, sans tenir compte des marges non imprimables. ' Les couleurs sont à exprimer au format BGR (en non pas RGB): B*256*256+G*256+R DLL_ON "C:\PANORAMIC\KGF\KGF.dll" IF VARIABLE("phnd%") = 0 THEN DIM phnd% IF VARIABLE("chnd%") = 0 THEN DIM chnd% IF VARIABLE("inip%") = 0 THEN DIM inip% IF VARIABLE("Pr_res%") = 0 THEN DIM Pr_res% IF VARIABLE("Pr_px%") = 0 THEN DIM Pr_px%: ' pixels par mm (600 dpi) IF VARIABLE("Pr_lt%") = 0 THEN DIM Pr_lt%: ' largeur totale IF VARIABLE("Pr_ht%") = 0 THEN DIM Pr_ht%: ' hauteur totale IF VARIABLE("Pr_mg%") = 0 THEN DIM Pr_mg%: ' marge gauche IF VARIABLE("Pr_mh%") = 0 THEN DIM Pr_mh%: ' marge haut IF VARIABLE("Pr_lu%") = 0 THEN DIM Pr_lu%: ' largeur utile IF VARIABLE("Pr_hu%") = 0 THEN DIM Pr_hu%: ' hauteur utile IF prn$ <> "": ' pour essais sans impression réelle Pr_res%=DLL_CALL4("PrinterManager",10,ADR(phnd%),ADR(chnd%),ADR(prn$)) END_IF ' Orientation portrait (0) ou paysage (1) Pr_res% = DLL_CALL4("PrinterManager",4,ADR(phnd%),ADR(chnd%),orient%): ' orientation Pr_res% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),0): ' init ' Dimensions sans les marges, en pixels: ' ========== ' ATTENTION: Les dimensions sont actualisées en fonction de l'option orientation ! ' ========== Pr_lt% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),3,0,0): ' largeur totale Pr_ht% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),4,0,0): ' hauteur totale IF orient% = 0 Pr_px% = Pr_ht%/297: ' pixels par mm, à l'impression en 600 dpi ELSE Pr_px% = Pr_lt%/297: ' idem (paysage) END_IF ' Marges non imprimables: décalage en pixels à soustraire gauche et haut: Pr_mg% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),1,0,0): ' marge gauche Pr_mh% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),2,0,0): ' marge haut ' Dimensions utiles, en pixels: IF Pr_mg% = 0 OR Pr_mh%= 0: ' cas imprimante virtuelle (PDFCreator) Pr_mg% = 75: Pr_mh% = 75: ' forçage comme imprimante réelle Pr_lu% = Pr_lt% - 2*Pr_mg%: Pr_hu% = Pr_ht% - 2*Pr_mh% ELSE Pr_lu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),7,0,0): ' largeur utile Pr_hu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),8,0,0): ' hauteur utile END_IF ' Couleur trait noir, épaisseur = 1, arrière-plan transparent: inip% = -2 Pr_res% = DLL_CALL6("PrinterFunction",6,ADR(phnd%),ADR(chnd%),0,inip%,1) inip% = 1 END_SUB ' ============================================================================== SUB Pr_Image(f$,x%,y%,w%,h%,u%) ' Impression de l'image f$ en x%,y%, dimensions w% x h% (sera redimensionnée pour ' tenir dans le cadre donné). ' u% = 0: unités pixels, u% = 1, unités millimètres ' ******** NB: coordonnées d'impression absolues (pixels): de 0,0 à 4962,7013 ******** ' Attention aux marges non imprimables de 75 pixels haut/bas, gauche/droite IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init) IF u% = 1: ' unités en mm, conversion en pixels x% = x%*Pr_mmpix: y% = y%*Pr_mmpix: w% = w%*Pr_mmpix: h% = h%*Pr_mmpix END_IF ' Pour que les coordonnées soient en absolu (sinon on part de 75,75): x% = x%-Pr_mg%: y% = y%-Pr_mh%: ' marges non imprimables Pr_res% = DLL_call6("PrinterFunction",4,ADR(phnd%),ADR(chnd%),0,x%,y%): ' positionnement Pr_res% = DLL_call6("PrinterFunction",7,ADR(phnd%),ADR(chnd%),ADR(f$),w%,h%) END_SUB ' ============================================================================== SUB Pr_Impr() ' Lancement de l'impression réelle ('fin d'impression') IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init) Pr_res% = DLL_CALL4("PrinterManager",3,ADR(phnd%),ADR(chnd%),0) inip% = 0 END_SUB ' ============================================================================== Je ne mets pas en cause le Termin, j'ai essayé de le remplacer par - Code:
-
EXECUTE "cmd.exe /c Taskkill.exe /F /IM Panoramic.exe /T" ou par: - Code:
-
DLL_ON "user32" i% = DLL_CALL4("PostMessageA",Handle(0),16,0,0): ' 16 est la constante de fermeture c'est pareil que pour le Termin, ça s'arrête, mais ça ne veut pas redémarrer. C'est sans doute quelque chose d'anormal dans le programme lui-même, mais je sèche... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 11:18 | |
| EDIT : ajout d'une seconde sub pour les versions de panoramic 0927i2 et + Si tu utilises la dll 'user32' pour quitter, tu dois libérer les ressources mémoires avant d'invoquer la fermeture du programme: - Code:
-
' ' remplacement de 'terminate':
sub close_form(window) ' Consiste à libérer les ressources (DestroyWindow) occupées par les forms et leurs enfants, puis à indiquer ' au processus qu'il doit être arrêté (PostQuitMessage). Dès que le processus est prêt, il envoi la requête ' "WM_CLOSE" à l'application afin que celle ci s'arrête proprement. dll_on "user32" : dim_local null% null%=dll_call1("DestroyWindow",handle(window)) :' libere les resources memoires if window=0 null%=dll_call1("PostQuitMessage",0) :' indique au systeme que c'est la fin du programme end_if dll_off end_sub
' ou a partir de panoramic0927i2 et +, on peut utiliser cette autre sub:
sub close_form(window) ' Consiste à libérer les ressources (DestroyWindow) occupées par les forms et leurs enfants, puis à indiquer ' au processus qu'il doit être arrêté (PostQuitMessage). Dès que le processus est prêt, il envoi la requête ' "WM_CLOSE" à l'application afin que celle ci s'arrête proprement. dim_local n n=0 repeat n=n+1 until library$(n)="_" or lower$(library$(n))="user32" if lower$(library$(n))<>"user32" then library n,"user32" ' command "free_resources","DestroyWindow",n,"I","stdcall" :' libere les resources memoires command "quit_form","PostQuitMessage",n,"I","stdcall" :' indique au systeme que c'est la fin du programme ' free_resources handle(window) if window=0 then quit_form 0 :' 0=code de sortie end_sub Sinon, depuis la version 0927i8, j'ai aussi ce pb de fenetre d'arret windows qui apparait parfois, mais je n'arrive pas à le reproduire.
Dernière édition par silverman le Dim 24 Juil 2016 - 17:30, édité 2 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 13:04 | |
| Bonjour silverman, Évidemment je ne maîtrise pas du tout ces fonctions de user32.dll, je ne fais que copier bêtement ce que j'ai vu ici ou là. Je vois qu'on n'utilise pas la même fonction pour fermer, toi c'est null%=dll_call1("PostQuitMessage",0) et moi: i% = DLL_CALL4("PostMessageA",Handle(0),16,0,0): ' 16 code de fermeture alors est-ce que je dois moi aussi libérer d'abord les ressources mémoire ?
De toute façon je ne peux pas tester puisque le défaut a disparu, et je ne sais pas pourquoi...
La version 0927i8 était censée résoudre ce problème de TERMIN, alors c'est curieux... et je me demande ce que fait le 'Stop' du menu que ne fait pas le Termin.
| |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 17:19 | |
| La méthode que j'utilise est celle recommandé par Microsoft, elle n'est pas de moi. Je me suis juste contenté de la mettre sous la forme d'une sub. Cela consiste à libérer les ressources (DestroyWindow) occupées par les forms et leurs enfants, puis à indiquer au processus qu'il doit être arrêté (PostQuitMessage). Dès que le processus est prêt, il envoi la requête "WM_CLOSE" à l'application. C'est propre et net Pour l’avoir testé en long en large et en travers pour remplacer le ‘terminate’ bogué des versions précédentes, je te garantis que ça fonctionne au poil ! La méthode que tu utilises consiste à envoyer directement la requête "WM_CLOSE" à l'application, c'est "bourrin" et aucune ressource n'est libérée | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 19:43 | |
| Je ne demande qu'à te croire, comme j'ai dit j'avais recopié mon truc tel quel, pris quelque part sur le forum, et j'en ai fait une sub. Du coup, je vais remplacer ma sub par la tienne dans ma bibliothèque ! Merci à toi silverman !
PS en y regardant de plus près, j'avais déjà ta sub dans ma bibliothèque, déjà donnée par toi sans doute, et je me demande où j'ai bien pu aller chercher celle que j'ai cité plus haut ! ... elle est aussi dans la bibliothèque, il faut que je fasse un peu de ménage... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 21:45 | |
| @JL35 C'est la mienne | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 21:53 | |
| Je n'osais pas le dire pour ne pas heurter ta modestie naturelle, mais il me semblait bien qu'il y avait de l'ami papydall là-dessous ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 22:01 | |
| C’était à l’époque où j’étais apprenti panoramicien. Le suis-je toujours That’s the question ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 22:08 | |
| Mais non papydall, tu es un pro ! mais il arrive quand même que le pro s'tâte ... lamentable... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Arrêt d'un programme dans l'éditeur Dim 24 Juil 2016 - 22:19 | |
| Je tâte fréquemment ma prostate et elle se comporte heureusement toujours bien (jusqu’à maintenant). | |
| | | Contenu sponsorisé
| Sujet: Re: Arrêt d'un programme dans l'éditeur | |
| |
| | | | Arrêt d'un programme dans l'éditeur | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |