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 |
|
|
| Insertion d'un petit fichier quelconque dans un programme | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Insertion d'un petit fichier quelconque dans un programme Ven 18 Juin 2010 - 22:42 | |
| Le problème était d'intégrer un petit fichier quelconque, binaire, par exemple une petite image bmp ou icône, ou n'importe quoi d'autre, de façon à avoir un module qui contienne toutes les ressources. J'avais déjà abordé une solution: convertir le fichier en question en lignes de datas, sous forme hexadécimale, à incorporer dans le programme pour reconstituer le fichier au moment de l'exécution. L'inconvénient étant que ce n'est valable que pour de tous petits fichiers, quelques milliers d'octets (toutes petites images, par exemple des icônes), à cause du volume de datas généré: un octet d'image correspond à 2 octets en hexadécimal. Dans le cas des images, on peut toutefois réduire quasiment de moitié ce volume, pour atteindre en gros le volume du fichier d'origine, en compactant les octets répétitifs qui sont en général nombreux dans une image. Voici une première approche. Remarques: Les lignes de datas générées sont écrites dans un fichier pour pouvoir être intégrées n'importe où dans un programme par copier/coller depuis un éditeur quelconque. - comme d'habitude, les fichiers cités en tête sont des fichiers de manoeuvre, à adapter. - la première série de datas représente le résultat brut en hexa, non compacté, la deuxième série le résultat compacté (gain de 55%). - les lignes mises en commentaires après les datas représentent les différentes étapes, pour essais: 1) conversion du fichier en lignes de datas non compactées 2) conversion du même fichier en lignes de datas compactées 3) reconstitution du fichier à partir des datas non compactés Puis, actif, reconstitution du fichier à partir des datas compactés - Code:
-
' Ficdat.bas conversion fichier binaire en lignes de datas ERROR_FRENCH DIM f$, fo$, fr$, fb$, fz$, a$, b$, c$, cp$, nr, ns, sz, nbl, la, lb, rst, i%, k%, k1% DIM labdat$ LABEL Fic2dat, Dat2fic, Decfich, Compact, Decompac, rr LABEL Pzip, Punzip LABEL Posdat
fo$ = "C:\Graph\BMP\Pnoel.bmp": ' image d'origine fr$ = "Z:\Data.dat" fb$ = "Z:\image.bmp": ' image reconstituée
DATA "Et1:" DATA "424DCE0800000000000036040000280000001B0000002A000000010008000000" DATA "0000980400000000000000000000000100000001000000000000080000000008" DATA "0000000008000008080008101000081021000000290039189C001800A5003908" DATA "CE009CD6D6003100EF00F7FFF700FFFFF700EFF7FF00F7F7FF00FFF7FF0008FF" DATA "FF0010FFFF0018FFFF0031FFFF0039FFFF006BFFFF00C6FFFF00DEFFFF00EFFF" DATA "FF00F7FFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "0000000000000000000000000000000000000000000000000000000000000000" DATA "000000000000000000000000000000000000000000001D1D1D1D1D1D1D1D1D1D" DATA "1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D000000001D1D" DATA "1D000000001D1D1D1D1D1D1D1D001D1D1D1D1D1D1D001C1C1C1C001D001C1C1C" DATA "1C001D1D1D1D1D1D1D001D1D1D1D1D1D1D001C1C1C1C001D001C1C1C1C001D1D" DATA "1D1D1D1D1D001D1D1D1D1D1D1D1D001C1C1C001D001C1C1C001D1D1D1D1D1D1D" DATA "1D001D1D1D1D1D1D1D1D1D0000001D1D1D0000001D1D1D1D1D1D1D1D1D001D1D" DATA "1D1D1D1D1D1D1D1D00001D1D1D00001D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D" DATA "1D1D1D1D00001D1D1D00001D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D1D" DATA "000000000000001D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D0005001C1B" DATA "1B0505001D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D0000001A1B101C1C0F1B00" DATA "00001D1D1D1D1D1D1D001D1D1D1D1D1D1D00191B0F1B1C1C1C1C1B1A1A001D1D" DATA "1D1D1D1D1D001D1D1D1D1D1D1D001C1C1C0E1C1C1C1B1A1A0D001D1D1D1D1D1D" DATA "1D001D1D1D1D001D1D000E1C0E0E1C0E1B101B1B1B001D1D001D1D1D1D001D1D" DATA "1D001C001D001A1A0D1C0E1C1A1C10101C001D001C011D1D1D001D1D001C001D" DATA "1D001819191A0005021A1B101B001D1D001C011D1D001D1D001C001D1D051818" DATA "181818181818181818051D1D0010011D1D001D1D001C1C000017060606060606" DATA "06060606060B0503101C011D1D001D1D001C1C00001714141414141616141414" DATA "161705031C10021D1D001D1D1D00000003161212141314141314141214160503" DATA "03021D1D1D001D1D1D1D000003161414141414131416161414160503001D1D1D" DATA "1D001D1D1D1D1D1D0317141605051614140505141417051D1D1D1D1D1D001D1D" DATA "1D1D1D1D1D051716050514141405051416031D1D1D1D1D1D1D001D1D1D1D1D1D" DATA "0505171717141714161717161705031D1D1D1D1D1D001D1D1D1D1D02190F0303" DATA "051414171714050305031C031D1D1D1D1D001D1D1D1D1D031B1C1C1005050505" DATA "0503051C1C1B1B051D1D1D1D1D001D1D1D1D0310100E0E0D1A1A0D19190F101C" DATA "0E0D0D0D001D1D1D1D001D1D1D1D1D05101B0D1A0D0E0E10101C101C0D0E0D02" DATA "1D1D1D1D1D001D1D1D1D1D00000305101010101B0E100D0D050503051D1D1D1D" DATA "1D001D1D1D1D1D1D1D1D03070606060607060701051D1D1D1D1D1D1D1D001D1D" DATA "1D1D1D1D1D1D07090A0A0A0A0A0A0908071D1D1D1D1D1D1D1D001D1D1D1D1D1D" DATA "1D1D070A0A0A0A0C0C0C0A08071D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D030A" DATA "0A0C0A0C0C0C0A08071D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D070A0A0C0C" DATA "0C0C0A071D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D1D070A0C0C0C0A061D" DATA "1D1D1D1D1D1D1D1D1D001D1D1D1D02001D1D1D1D070A0C0C0C0A071D1D1D1D1D" DATA "1D1D1D1D1D001D1D1D020E1C031D1D1D070A0A0C0A071D1D1D1D1D1D1D1D1D1D" DATA "1D001D1D1D050F1C1C03070708090A0A08071D1D1D1D1D1D1D1D1D1D1D001D1D" DATA "1D001C10031D03080A0A0A08071D1D1D1D1D1D1D1D1D1D1D1D001D1D1D1D0005" DATA "1D1D1D07080A08031D1D1D1D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D1D" DATA "0707071D1D1D1D1D1D1D1D1D1D1D1D1D1D001D1D1D1D1D1D1D1D1D1D1D1D1D1D" DATA "1D1D1D1D1D1D1D1D1D1D1D1D1D00" DATA "F": ' butée de fin
DATA "Et2:" DATA "424DCE0800[5]360400002800[2]1B00[2]2A00[2]01000800[2]" DATA "0000980400[10]0100[2]0100[5]0800[3]08" DATA "00[3]0800000808000810100008102100[2]290039189C001800A5003908" DATA "CE009CD6D6003100EF00F7FFF700FFFFF700EFF7FF00F7F7FF00FFF7FF0008FF" DATA "FF0010FFFF0018FFFF0031FFFF0039FFFF006BFFFF00C6FFFF00DEFFFF00EFFF" DATA "FF00F7FFFF00FF[2]00FF[2]00[18]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[31]" DATA "00[21]1D[9]" DATA "1D[16]001D[7]00[3]1D1D" DATA "1D00[3]1D[7]001D[6]001C[3]001D001C[2]" DATA "1C001D[6]001D[6]001C[3]001D001C[3]001D1D" DATA "1D[4]001D[7]001C[2]001D001C[2]001D[6]" DATA "1D001D[8]00[2]1D[2]00[2]1D[8]001D1D" DATA "1D[7]00001D[2]00001D[9]001D[5]" DATA "1D[3]00001D[2]00001D[9]001D[9]" DATA "00[6]1D[9]001D[8]0005001C1B" DATA "1B0505001D[8]001D[6]00[2]1A1B101C1C0F1B00" DATA "00001D[6]001D[6]00191B0F1B1C[3]1B1A1A001D1D" DATA "1D[4]001D[6]001C[2]0E1C[2]1B1A1A0D001D[5]" DATA "1D001D[3]001D1D000E1C0E0E1C0E1B101B[2]001D1D001D[3]001D1D" DATA "1D001C001D001A1A0D1C0E1C1A1C10101C001D001C011D[2]001D1D001C001D" DATA "1D001819191A0005021A1B101B001D1D001C011D1D001D1D001C001D1D051818" DATA "18[8]051D1D0010011D1D001D1D001C1C00001706[5]" DATA "06[4]0B0503101C011D1D001D1D001C1C00001714[4]161614[2]" DATA "161705031C10021D1D001D[2]00[2]03161212141314141314141214160503" DATA "03021D[2]001D[3]0000031614[4]131416161414160503001D[2]" DATA "1D001D[5]0317141605051614140505141417051D[5]001D1D" DATA "1D[4]051716050514[2]05051416031D[6]001D[5]" DATA "050517[2]141714161717161705031D[5]001D[4]02190F0303" DATA "051414171714050305031C031D[4]001D[4]031B1C1C1005[3]" DATA "0503051C1C1B1B051D[4]001D[3]0310100E0E0D1A1A0D19190F101C" DATA "0E0D[2]001D[3]001D[4]05101B0D1A0D0E0E10101C101C0D0E0D02" DATA "1D[4]001D[4]0000030510[3]1B0E100D0D050503051D[3]" DATA "1D001D[7]030706[3]07060701051D[7]001D1D" DATA "1D[5]07090A[5]0908071D[7]001D[5]" DATA "1D1D070A[3]0C[2]0A08071D[7]001D[7]030A" DATA "0A0C0A0C[2]0A08071D[7]001D[8]070A0A0C0C" DATA "0C0C0A071D[8]001D[9]070A0C[2]0A061D" DATA "1D[8]001D[3]02001D[3]070A0C[2]0A071D[4]" DATA "1D[4]001D[2]020E1C031D[2]070A0A0C0A071D[9]" DATA "1D001D[2]050F1C1C03070708090A0A08071D[10]001D1D" DATA "1D001C10031D03080A[2]08071D[11]001D[3]0005" DATA "1D[2]07080A08031D[12]001D[9]" DATA "07[2]1D[13]001D[13]" DATA "1D[12]00" DATA "F"
' f$ = fo$: GOSUB Fic2dat: ' fichier image d'origine en ligne de datas dans fr$ ' **** ou bien ' f$ = fo$: GOSUB Compfich: ' idem en lignes de datas compactées dans fr$
' f$ = fb$: labdat$ = "Et1: GOSUB Posdat: GOSUB Dat2fic ' PICTURE 1: FILE_LOAD 1, fb$
' décompactage des datas compactés dans le fichier fr$ labdat$ = "Et2:": GOSUB Posdat f$ = fb$: GOSUB Decfich: ' décompactage des datas dans f$ PICTURE 2: FILE_LOAD 2, fb$: ' affichage de l'image reconstituée
END
Fic2dat: ' Conversion de f$ en lignes de datas dans le fichier texte fr$ FILEBIN_OPEN_READ 1, f$: FILE_OPEN_WRITE 2, fr$ sz = FILEBIN_SIZE(1): lb = 32 nbl = INT(sz/lb): rst = lb*FRAC(sz/lb) FOR i% = 1 TO nbl FILEBIN_HEXA_READ 1, lb, a$ FILE_WRITELN 2, "DATA " + CHR$(34) + a$ + CHR$(34) NEXT i% IF rst > 0 FILEBIN_HEXA_READ 1, rst, a$ FILE_WRITELN 2, "DATA " + CHR$(34) + a$ + CHR$(34) END_IF FILEBIN_CLOSE 1: FILE_CLOSE 2 RETURN
Dat2fic: ' Conversion de lignes de datas en f$ FILEBIN_OPEN_WRITE 1, f$ RESTORE READ a$ REPEAT FILEBIN_HEXA_WRITE 1, LEN(a$)/2, a$ READ a$ UNTIL a$ = "F" FILEBIN_CLOSE 1 RETURN
Compfich: ' compactage de f$ en lignes de datas compactées dans le fichier texte fr$ FILEBIN_OPEN_READ 1, f$: FILE_OPEN_WRITE 2, fr$ sz = FILEBIN_SIZE(1): lb = 32 nbl = INT(sz/lb): rst = lb*FRAC(sz/lb) FOR i% = 1 TO nbl FILEBIN_HEXA_READ 1, lb, a$ GOSUB Compact FILE_WRITELN 2, "DATA " + CHR$(34) + b$ + CHR$(34) NEXT i% IF rst > 0 FILEBIN_HEXA_READ 1, rst, a$ GOSUB Compact FILE_WRITELN 2, "DATA " + CHR$(34) + b$ + CHR$(34) END_IF FILEBIN_CLOSE 1: FILE_CLOSE 2 RETURN
Decfich: ' décompactage des lignes de datas compactées dans le fichier binaire f$ FILEBIN_OPEN_WRITE 1, f$ READ a$ REPEAT GOSUB Decompac FILEBIN_HEXA_WRITE 1, LEN(a$)/2, a$ READ a$ UNTIL a$ = "F" FILEBIN_CLOSE 1 RETURN
Compact: ' Compactage de a$ (chaîne hexa) dans b$ ' Compactage des octets répétitifs: le nombre entre crochets représentera ' le nombre de répétitions de l'octet qui précède (en plus de celui-ci) b$ = "": ' chaîne résultat cp$ = "": ns = 0 FOR i% = 1 TO LEN(a$) STEP 2 c$ = MID$(a$, i%, 2) IF c$ <> cp$ IF ns > 0 IF ns = 1 b$ = b$ + cp$ ELSE b$ = b$ + "[" + STR$(ns) + "]" END_IF END_IF b$ = b$ + c$ ns = 0 cp$ = c$ ELSE ns = ns + 1 END_IF NEXT i% IF ns > 0 IF ns > 1 b$ = b$ + "[" + STR$(ns) + "]" ELSE b$ = b$ + cp$ END_IF END_IF RETURN
Decompac: ' décompactage de a$ -> a$ rr: k% = INSTR(a$, "[") IF k% > 0 k1% = INSTR(a$, "]") nr = VAL(MID$(a$, k%+1, k1%-k%-1)) : ' nombre de répétitions du précédent c$ = MID$(a$, k%-2, 2): ' caractères hexa à répéter b$ = "": FOR i% = 1 TO nr: b$ = b$ + c$: NEXT i% IF k1% < LEN(a$) a$ = LEFT$(a$, k%-1) + b$ + MID$(a$, k1%+1, LEN(a$)-k1%) ELSE a$ = LEFT$(a$, k%-1) + b$ END_IF GOTO rr END_IF RETURN
Posdat: ' Positionnement de lecture datas sur le label labdat$ RESTORE REPEAT READ a$ UNTIL a$ = labdat$ RETURN | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Ven 18 Juin 2010 - 23:29 | |
| Belle technique. Mais explique-moi: pourquoi t ne crées pas un fichier exe par la fonction "application" de l'éditeur, ayant placé le source et tous les petits fichiers et images dans un même répertoire ? Tu obtiens un seul fichier .exe qui contient, de façon invisible, tous ces fichiers et tu peux les utiliser librement (en lecture) comme d'habitude, par file_load par exemple, pour charger une image. J'ai fait un petit bout de programme comme ceci: - Code:
-
picture 1 file_load 1,"image.bmp" end
Je place ce code dans un répertoire avec le fichier image.bmp et je génère "application". J'obtiens un fichier exe qui, exécuté de n'importe quel répertoire, charge l'image dans la picture. Ou alors, je n'ai peut-être pas bien compris l'utilisation que tu voulais faire ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Ven 18 Juin 2010 - 23:47 | |
| Si bien sûr tu as compris, j'avoue que je n'ai pas encore utilisé la technique de la compilation avec tous les fichiers annexes incorporés, et je ne vois pas très bien comment ça fonctionne. Si je linke par exemple mon programme avec une ou des images, ou autres fichiers annexes, que se passe-t-il au moment de l'exécution ? je pense que ces fichiers sont reconstitués quelque part sur le disque d'utilisation ? ou non ? et effacés, ou non, après exécution ?
L'optique était aussi de partager un source complet (dans le cas de petites icônes par exemple) plutôt qu'une série de fichiers. Mais bon, je reconnais bien volontiers que ça se discute. Disons que c'est aussi un peu un exercice de style, au moins pour le compactage/décompactage. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Sam 19 Juin 2010 - 0:27 | |
| D'après mon expérience, ces fichiers ne sont pas recopiés sur le disque. Ils restent cachés dans le exe construit en mode "application. Panoramic sait quels fichiers ont été inclus au moment de la génération de l'application, et à condition de les ouvrit SANS répertoire, juste avec le nom de fichier, Panoramic va les prendre dans le exe plutôt que sur disque.
Ceci est la façon idéale pour distribuer un seul module contenant toutes les ressources nécessaires. Ceci inclut tous les fichiers txt et les images. Bien sûr, cela ne peut être que des fichiers en lecture seule: dès qu'il faut pouvoir écrire dedans, il faut bien créer un fichier sur disque.
Pour arriver à produire un tel fichier, c'est simple. Il faut créer un répertoire spécifique pour le programme, dans lequel on place, pêle-mêle, le fichier source, tous les fichiers INCLUDE éventuels, tous les fichiers txt et toutes les images dans les formats acceptés. Panoramic va alors générer un fichier exe dans le même répertoire contenant l'ensemble de ces fichiers.
Pour le moment, Panoramic n'a pas de déclaration permettant de spécifier les fichiers à inclure. Il prend tout, et c'est pour cela qu'il faut placer tout cela dans un répertoire spécifique.
Pour mon EDI en Panoramic, par exemple, j'utilise un répertoire de configiration dans lequel on trouve tous les "modèles" des objets Panoramic et les images de mes icônes. Pour le moment, en version Beta, c'est encore comme ça, mais dès la première version normale, les icônes seront intégrées dans l'exe, mais pas les modèles, afin que l'on puisse éventuellement les modifier... | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Sam 19 Juin 2010 - 10:42 | |
| - Citation :
- Pour le moment, Panoramic n'a pas de déclaration permettant de spécifier les fichiers à inclure. Il prend tout, et c'est pour cela qu'il faut placer tout cela dans un répertoire spécifique.
La nouvelle instruction CHAIN F , ne serait-elle pas appropriée ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Sam 19 Juin 2010 - 11:08 | |
| Non, elle a un but tout à fait différent: terminer le programme actuel entièrement (comme par "terminate") et lancer dans la foulée l'exécution d'un autre programme Panoramic. Il n'y a aucun rapport avec des fichiers annexes comme des textes ou des images. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme Sam 19 Juin 2010 - 12:01 | |
| OK, j'ai mal interprèté l'utilisation inscrite sur le manuel de réfférence ou il est écrit - Citation :
- La commande CHAIN F est utilisée pour exécuter le fichier source F
Je suggére à Jack le texte suivant: - Citation :
- La commande CHAIN F est utilisée pour terminer le programme en cours et exécuter le fichier source F (elle remplace le TERMINATE)
Merci pour l'info, je n'ai pas encore utilisée cette nouvelle instruction... A+ | |
| | | Contenu sponsorisé
| Sujet: Re: Insertion d'un petit fichier quelconque dans un programme | |
| |
| | | | Insertion d'un petit fichier quelconque dans un programme | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |