EVENT: if bin_and(user_event_wparam,hex("FF000000"))=hex("05000000") if bin_and(user_event_wparam,hex("00FF0000"))=hex("010000") Active 0 end_if end_if return
Donc, enlève juste les 4 signes $.
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Jeu 17 Fév 2022 - 17:12
Super Klaus.
Cela fonctionne bien et l'enregistrement dans un fichier aussi. Je vais pouvoir avancer sur ma petite application. Merci Klaus.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Entretemps, la foc est corrigée - version CHM et doc en ligne.
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Jeu 17 Fév 2022 - 20:16
@Klaus,
Je viens de faire le tour de l'objet scanner et je m'aperçois qu'il manque un petit retour. Je m'explique, dans l'ordre :
on crée un objet scanner on recherche les sources twains on sélectionne une source on lance le scan on enregistre l'image, dans le presse papier ou dans un fichier
sauf que rien n' arrête le processus si le scanner est éteint
en fait si, c'est un retour windows qui affiche une erreur mais là on a bloqué l'appli. Je ne sais pas si c'est possible mais il serait bien que l'on est un retour sur l'état "allumé" ou "éteint" du scanner à la sélection pour ne pas lancer un scan fantôme qui va tout bloquer.
Bon, je sors...
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Nouveautés: - objet Scanner: nouvel USER_EVENT en cas d'erreur
Modules modifiés: KGF.dll
La doc suivra.
Lors de la survenue d'une erreur quelconque, un USER_EVENT sera généré pour le signaler, et l'action du scanner sera annulée. Ainsi, si le scanner n'est pas allumé avant le scan ou est coupé pendant le scan, le programme Panoramic sera averti et ne reste plus bloqué.
Documentation prélimiaire, en attendant la nouvelle version de la doc CHM:
Citation :
Cette fonction démarre l'acquisition d'une image à partir de la source d'images TWAIN sélectionnée. Cette action est asynchrone. Cela signifie que la fonction rend la main au programme Panoramic alors que l'opération de scan est encore en cours. Lorsque l'opération sera terminée, l'image scannée sera mémorisée dans l'objet Scanner, et un USER_EVENT sera généré pour signaler ce fait.
L'identification de l'évènement de fait par la valeur dans WPARAM. Cette variable système contient les informations suivantes, en hexadécimal: xMMRR0000 ou hex$("MMRRIIII") "x" signifie "notation hexadécimale" MM contient "05" ce qui signifie "objet Scanner est à l'origine du USER_EVENT" RR contient "01" ce qui signifie "opération de scan terminée" RR contient "02" ce qui signifie "opération en erreur, scan terminée" IIII index de la source de données choisie si RR=02 (en cas d'erreur)
Une information supplémentaire est fournie dans LPARAM: LPARAM = EEEEAAAA EEEEE = code erreur AAAA = information additionnelle EEEE valeurs possibles: TWRC_SUCCESS = 0; TWRC_FAILURE = 1; { Application may get TW_STATUS for info on failure } <===== erreur TWRC_CHECKSTATUS = 2; { "tried hard": ; get status } TWRC_CANCEL = 3; TWRC_DSEVENT = 4; TWRC_NOTDSEVENT = 5; TWRC_XFERDONE = 6; TWRC_ENDOFLIST = 7; { After MSG_GETNEXT if nothing left } TWRC_INFONOTSUPPORTED = 8; TWRC_DATANOTAVAILABLE = 9;
AAAA valeurs possibles si message d'erreur: TWCC_SUCCESS = 0; { It worked! } TWCC_BUMMER = 1; { Failure due to unknown causes } TWCC_LOWMEMORY = 2; { Not enough memory to perform operation } TWCC_NODS = 3; { No Data Source } <============== scanner non disponible TWCC_MAXCONNECTIONS = 4; { DS is connected to max possible applications } TWCC_OPERATIONERROR = 5; { DS or DSM reported error, application shouldn't } TWCC_BADCAP = 6; { Unknown capability } TWCC_BADPROTOCOL = 9; { Unrecognized MSG DG DAT combination } TWCC_BADVALUE = 10; { Data parameter out of range } TWCC_SEQERROR = 11; { DG DAT MSG out of expected sequence } TWCC_BADDEST = 12; { Unknown destination Application/Source in DSM_Entry } TWCC_CAPUNSUPPORTED = 13; { Capability not supported by source } TWCC_CAPBADOPERATION = 14; { Operation not supported by capability } TWCC_CAPSEQERROR = 15; { Capability has dependancy on other capability } TWCC_DENIED = 16; { File System operation is denied (file is protected) } TWCC_FILEEXISTS = 17; { Operation failed because file already exists. } TWCC_FILENOTFOUND = 18; { File not found } TWCC_NOTEMPTY = 19; { Operation failed because directory is not empty } TWCC_PAPERJAM = 20; { The feeder is jammed } TWCC_PAPERDOUBLEFEED = 21; { The feeder detected multiple pages } TWCC_FILEWRITEERROR = 22; { Error writing the file (meant for things like disk full conditions) } TWCC_CHECKDEVICEONLINE = 23; { The device went offline prior to or during this operation } <=== scanner pas connecté
Voici le code de gestion du USER_EVENT pour les fonctions StartSelectedScanner et StartScannerWithDialog:
Code:
label event dim TW%, ind%, error%, additionnal% on_user_event event ... res% = dll_call2("StartSelectedScanner",TW%,1) ... event: if bin_and(user_event_wparam,hex("FF000000")=hex("05000000")) : ' est-ce que c'est le scanner ? if bin_and(user_event_wparam,hex("00FF0000")=hex("010000")) : ' est-ce que c'est causé par la terminaison d'une acquisition ? ' ==> ici, on peut traiter l'image reçue ! end_if if bin_and(user_event_wparam,hex("00FF0000")=hex("020000")) : ' est-ce que c'est causé par une erreur ? ind% = bin_and(user_event_wparam,hex("FFFF")) : ' ceci est l'indice du scaner causant l'erreur error% = bin_and(user_event_lparam,hex("FFFF0000"))/65536 : ' ceci est le code d'erreur additional% = bin_and(user_event_lparam,hex("FFFF")): ' ceci est l'information détaillée ' ==> ici, le scanner est arrêtée et on peut traiter la réception de l'erreur end_if end_if return
Il y a donc un moyen précis de connaître qu'une erreur s'est produite ainsi que sa nature exacte.
Actuellement, je n'ai pas de scanner disponible. Pourrais-tu tester cela ?
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Sam 19 Fév 2022 - 11:23
Salut Klaus,
Je teste cela dès cette après-midi.
Heu...windows est plus rapide il renvoit une fin de non recevoir (message d'erreur) avant le retour de l'event quand le scanner est éteint.
Si je crée un big bang en éteignant le scanner pendant le scan, il me dit que l'expression : if bin_and(user_event_wparam,hex("00FF0000")=hex("020000")) : ' est-ce que c'est causé par une erreur ? n'est pas logique.
et j'ai aussi un message mais en fait je m'aperçois que ce n'est pas windows qui édite ces messages mais le scanner.
Je viens de trouver l'illogisme. la parenthèse de fermetur de bin_and() est trop loin
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Je suis en train de traiter le USER_EVENT en fin de scan dan slequel j'ai semé le boxon. Mais à part cela, j'ai créé une fonction spécifique IsSelectedScannerConnected qui fonctiionne bien. Je vais la publier au même moment que la réparation du scan.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
tester: caption 13, "Test en cours..." display res% = dll_call2("SelectScannerSource",TW%,sel%) inactive 1 : inactive 2 res% = dll_call2("IsSelectedScannerConnected",TW%,handle(12)) active 1 : active 2 if res%<0 caption 13, "Erreur en accès au scanner" else if res%=0 then caption 13, "Le scanner n'est pas connecté" if res%>0 then caption 13, "Le scanner est connecté" end_if return
scanner: caption 13, "Scan en cours..." clear 12 display inactive 1 : inactive 2 res% = dll_call2("StartSelectedScanner",TW%,0) active 1 : active 2 caption 13,"Scan terminé." return
event: if bin_and(user_event_wparam,hex("FF000000"))=hex("05000000") : ' est-ce que c'est le scanner ? if bin_and(user_event_wparam,hex("00FF0000"))=hex("010000") : ' est-ce que c'est causé par la terminaison d'une acquisition ? caption 13, "Scan reçu correctement" res% = dll_call1("CopyScannerImapeToClipBoard",TW%) clipboard_paste 14 end_if if bin_and(user_event_wparam,hex("00FF0000"))=hex("020000") : ' est-ce que c'est causé par une erreur ? ind% = bin_and(user_event_wparam,hex("FFFF")) : ' ceci est l'indice du scaner causant l'erreur error% = bin_and(user_event_lparam,hex("FFFF0000"))/65536 : ' ceci est le code d'erreur additional% = bin_and(user_event_lparam,hex("FFFF")): ' ceci est l'information détaillée caption 13, "Erreur pendant le scan" clear 12 item_add 12,"Numéro du scanner en erreur: "+str$(ind%+1) item_add 12,"Code erreur: "+str$(error%) item_add 12,"Additionnel: "+str$(additional%) end_if end_if return
Dernière édition par Klaus le Dim 20 Fév 2022 - 17:20, édité 1 fois
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Dim 20 Fév 2022 - 13:12
Salut Klaus.
J'ai testé et en fait si le scanner est éteint, Epson répond avant la fonction. J'ai droit au message d'erreur : Dans le programme test il y a deux mini erreurs : if res%=<0 then caption 13, "Le scanner n'est pas connecté" if res%>=0 then caption 13, "Le scanner est connecté"
Une fenêtre s'ouvre en plus pendant le scan :
cette fenêtre ne sert à rien si ce n'est de ... car elle empêche l' affichage et que je la ferme avec l'un ou l'autre des boutons l' image est affichée. La seule chose et qui est bizarre puisque l' image s'affiche correctement c'est la signalisation d'une erreur dans le memo lorsque l'on clique sur "OK" : scanner 1 erreur 1 détail 23 bref de quoi en perdre son lapin.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
J'ai le même comportement avec mon scanner. Cela dépend des paramètres de configuration du scanner et je suis en train de chercher une solution à ce problème de paramétrage.
En attendant, clique "Cancel" dans la fenêtre supplémentaire et tu auras la réponse appropriée dans le programme de démo que j'ai posté. Voici le résultat:
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
La doc du scanner est mise à jour (version CHM et en ligne).
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Dim 20 Fév 2022 - 16:26
@Klaus,
Dans les versions précédentes de KGF il n'y avait pas cette fenêtre "Select source" et les réglages étaient les même. Je crois que je t'ai poussé vers le mieux mais c'est vraiment l'ennemi du bien.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
tester: caption 13, "Test en cours..." display res% = dll_call2("SelectScannerSource",TW%,sel%) inactive 1 : inactive 2 res% = dll_call2("IsSelectedScannerConnected",TW%,handle(12)) active 1 : active 2 if res%<0 caption 13, "Erreur en accès au scanner" else if res%=0 then caption 13, "Le scanner n'est pas connecté" if res%>0 then caption 13, "Le scanner est connecté" end_if return
scanner: caption 13, "Scan en cours..." clear 12 display inactive 1 : inactive 2 res% = dll_call2("StartSelectedScanner",TW%,0) active 1 : active 2 caption 13,"Scan terminé." return
event: if bin_and(user_event_wparam,hex("FF000000"))=hex("05000000") : ' est-ce que c'est le scanner ? if bin_and(user_event_wparam,hex("00FF0000"))=hex("010000") : ' est-ce que c'est causé par la terminaison d'une acquisition ? caption 13, "Scan reçu correctement" res% = dll_call1("CopyScannerImapeToClipBoard",TW%) clipboard_paste 14 end_if if bin_and(user_event_wparam,hex("00FF0000"))=hex("020000") : ' est-ce que c'est causé par une erreur ? ind% = bin_and(user_event_wparam,hex("FFFF")) : ' ceci est l'indice du scaner causant l'erreur error% = bin_and(user_event_lparam,hex("FFFF0000"))/65536 : ' ceci est le code d'erreur additional% = bin_and(user_event_lparam,hex("FFFF")): ' ceci est l'information détaillée caption 13, "Erreur pendant le scan" clear 12 item_add 12,"Numéro du scanner en erreur: "+str$(ind%+1) item_add 12,"Code erreur: "+str$(error%) item_add 12,"Additionnel: "+str$(additional%) end_if end_if return
Chez moi, il n'y a plus cette fenêtre intempestive...
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Dim 20 Fév 2022 - 17:36
Super Klaus !
le temps du test est plus court le message de Epson a disparu la fenêtre "Select source" a disparu
par contre il faut changé les signes des lignes 37 et 38 de l'exemple qui provoquent une erreur d'affichage. L37 il faut < au lieu de = car la valeur de res% dans ce cas est -1 L38 il faut = au lieu de > car la valeur de res% dans ce cas est 0
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
tester: caption 13, "Test en cours..." display res% = dll_call2("SelectScannerSource",TW%,sel%) inactive 1 : inactive 2 res% = dll_call2("IsSelectedScannerConnected",TW%,handle(12)) active 1 : active 2 if res%<0 caption 13, "Erreur en accès au scanner" else if res%<0 then caption 13, "Le scanner n'est pas connecté" if res%=0 then caption 13, "Le scanner est connecté" end_if return
scanner: caption 13, "Scan en cours..." clear 12 display inactive 1 : inactive 2 res% = dll_call2("StartSelectedScanner",TW%,0) active 1 : active 2 caption 13,"Scan terminé." return
event: if bin_and(user_event_wparam,hex("FF000000"))=hex("05000000") : ' est-ce que c'est le scanner ? if bin_and(user_event_wparam,hex("00FF0000"))=hex("010000") : ' est-ce que c'est causé par la terminaison d'une acquisition ? caption 13, "Scan reçu correctement" res% = dll_call1("CopyScannerImapeToClipBoard",TW%) clipboard_paste 14 end_if if bin_and(user_event_wparam,hex("00FF0000"))=hex("020000") : ' est-ce que c'est causé par une erreur ? ind% = bin_and(user_event_wparam,hex("FFFF")) : ' ceci est l'indice du scaner causant l'erreur error% = bin_and(user_event_lparam,hex("FFFF0000"))/65536 : ' ceci est le code d'erreur additional% = bin_and(user_event_lparam,hex("FFFF")): ' ceci est l'information détaillée caption 13, "Erreur pendant le scan" clear 12 item_add 12,"Numéro du scanner en erreur: "+str$(ind%+1) item_add 12,"Code erreur: "+str$(error%) item_add 12,"Additionnel: "+str$(additional%) end_if end_if return
Yannick aime ce message
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Mer 23 Fév 2022 - 14:18
Snifff...
Fausse bonne nouvelle pour la fenêtre Epson. J'ai redémarré mon ordi et hop, voilà qu'elle est de retour.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Mer 2 Mar 2022 - 2:58
KGF.dll V9.69 du 02/03/2022
Nouveautés: - nouvel objet: TRecord et ses fonctions de gestion
Modules modifiés: KGF.dll
La doc suivra.
Cet objet implémente la gestion d'un fichier contenant des registrements de longeur fixe mais non limitée.
Chaque enregistrement est composé de champs de strings de longueur fixe quelconque, d'entiers et de flottants, dans n'importe quel ordre et dans n'importe quel nombre.
On peut définir librement son enregistrement en créant les champs de son choix. On peut même créer des champs "overlay" redéfinissant des parties d'enregistrement (ex.: un grand champ d'adresse découpé en 4 champs overlay de 2 lignes d'adresse, un code postal et une ligne pour la ville)
Il y a des fonctions de création d'un tel fichier, d'oueverture d'un fichier existant et de sa fermeture. Il y a des fonctions d'écriture séquentielle, à accès direct par numéro d'enregistrement et d'ajout en fin de fichier. Il y a des fonctions de lecture du premier ou du dernier enregistrement, de lire un enregistrement en accès direct par son numéro, ou de lire l'enregistrement suivant ou précédant. Il y a même une fonction de positionnement définissant la position de départ pour la prochaine action de lecture ou écriture.
Techniquement, l faut mettre à disposition un buffeur d'enregistrement sous forme d'un tableau uni-dimensionnel d'entiers, déclaré comme toute première variable dans les DIM. Exemple:
Code:
dim tableau%(500), ...
sachant que chaque cellule d'un tel tableau contient 4 caractères. Cet exemple est donc suffisant pour des enregistrements jusqu'à une longueur de 2000 caractères. l faut aussi un MEMO (invisible) qui contiendra les données décodées des champs, une ligne par champ.
Bref, c'est un outil puissant à utiliser dans un contexte de gestion. Un programme de démo est disponiblen mais ce programme est plus qu'une simple démo. C'est un véritable "data manager" de données permettant de créer ou de modifier une structure d'enregistrement, et d'effectuer toutes ces opérations sur un tel fichier.
Le programme de démo contient un fichier d'aide permettant de comprendre le fonctionnement du programme. Mais comme tout cela est trop gros pour être posté ici, j'ai déposé un fichier ZIP sur mon site contenant l'ensemble: code source, exécutable, fichier de données avec 3 enregistrements (avec des données bidon mais lisibles), fichier d'aide de d'apropos, fichier de configuration mémorisant me nom du dernier fichier de données utilisé et du dernier fichier de définition des champs utilisé. Attention: ce fichier contient le chemin complet d'accès à ces éléments et doit donc être adapté. Ceci dit, cela peut se faire dans le programme - les chemins sont affichés avec un bouton "..." à côté de chacun, permettant de sélectionner le fichier, et les chemins se mettent en place automatiquement. Ces informations sont sauvegardées automatiquement en sortie du programme.
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Mar 2022 - 1:10
Bonsoir Klaus :
C’est grandiose comme projet ! Merci du partage !
Malheureusement, je n’ai pas réussi à ouvrir un fichier .tr_config. Que ce soit avec le fichier de démo que tu as fourni ou un autre que j’ai créé, la fonction LoadTRecordParameters retourne systématiquement « -1 ».
Par contre, la fonction SaveTRecordParameters fonctionne bien : elle retourne la valeur « 0 » et le fichier .tr_config est bien enregistré sur le disque.
Autre remarque, pour les floats, le point décimal du pavé numérique ne fonctionne pas. Il faut saisir une virgule. C’est sans grande importance, il suffit de le savoir.
Bonne continuation.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Mar 2022 - 1:33
Ah bon ? As-tu effectué "New TRecord" avant de lancer "Load parametes" ? Voici ce que ça donne chez moi: La ligne d'état en bas indique le nombre de champs chargé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 3 Mar 2022 - 2:02
KGF.dll V9.70 du 03/03/2022
Nouveautés: - TRecord: nouveau type de données "binary"
Ce type de données peut être utile dans deux cas: - pour un champ overlay recouvrant partiellement ou en totalité 1 ou plusieurs champs integer ou float - pour un champ nomal (non overlay) our enregistrer du texte codé,, une petite image, etc
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Mar 2022 - 3:15
Klaus a écrit:
As-tu effectué "New TRecord" avant de lancer "Load parametes" ?
Ah bien non… Désolé, effectivement cela fonctionne bien. J’avais fait « New record » pour créer un nouveau fichier mais pas pour charger un fichier existant…
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Mar 2022 - 7:52
Oui, c'est nécessaire dans les deux cas.
Il faut d'abord créer un objet TRecord qui sert de support pour toutes les opérations suivantes. On lui charge ensuite la définition des champs, soit par création directe, soit en chargeant un fichier de sauvegarde des champs. Ensuite, on lui attache un fichier de données, soit par création soit en ouvrant un fichier existant. Puis, le fichier est accessible jusqu'à ce qu'on le ferme. Mais l'objet TRecord continue d'exister ! Sloit on lui attache un autre fichier, soit on supprime l'objet TRecord.
Je suis en train d'ajouter deux nouveaux types de champs: Date et Time...
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Mar 2022 - 12:41
KGF.dll V9.71 du 03/03/2022
Nouveautés: - TRecord: nouveaux types de données "Date" et "Time"