silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: antibug create_hide Mar 27 Sep 2016 - 17:54 | |
| Bonjour à tous! Vous le savez, à cause d'un bug, les forms ne sont pas positionnés correctement lorsqu'on les crés caché avec la commande 'CREATE_HIDE'. Pour corriger ce défaut, je vous pésente une sub très simple à utiliser, puisqu'il suffit de la placer n'importe où entre 'CREATE_HIDE' et 'CREATE_SHOW' (pourvu que le form ait été créé), c'est tout! Ensuite, le form peut être positionné avec les commandes habituelles, ça REmarche Sa syntaxe : ANTIBUG_CREATE_HIDE(frm_nb%)" - Code:
-
' ' ' Fixe le bug de la commande CREATE_HIDE ' '
dim frm_nb% , maxi% maxi%=3
' les prochains objets système créés ne seront pas visibles CREATE_HIDE
' cré des forms invisibles for frm_nb%=1 to maxi% form frm_nb% :' un form ANTIBUG_CREATE_HIDE(frm_nb%) left frm_nb%,50+(20*frm_nb%) : top frm_nb%,100+(20*frm_nb%) :' placé ou je l'ai décidé! next frm_nb%
' les prochains objets système créés seront visibles CREATE_SHOW
' maintenant que les forms sont créés, on y insère ce que l'on veut picture 300 : parent 300,1 : full_space 300
' affiche les forms caption 0,"Une petite pause pour faire durer le suspense..." PAUSE 1500 for frm_nb%=1 to maxi% show frm_nb% next frm_nb% caption 0,"et voila!"
END ' ' ' SUB ANTIBUG_CREATE_HIDE(v_form%) if object_exists(v_form%)=0 if message_error_ok("l'objet numéro "+str$(v_form%)+" n'existe pas")=1 then terminate terminate end_if ' variables pour la structure dim_local WINDOWPLACEMENT$ dim_local WINDOWPLACEMENT_ptr% , long%,adr_source% , adr_destination% , buffer_position% ' variables pour les données de la structure dim_local tmpv_left% , tmpv_top% , v_left% , v_top% , v_width% , v_height%
' variables pour la recherche d'une 'library' disponible dim_local my_library$ , my_dll$ dim_local i% , k% , found% if variable("antibug_create_hide_LIBRARY_KEYWORD_CREATION%")=0 dim antibug_create_hide_LIBRARY_KEYWORD_CREATION% end_if ' recherche si 'user32' est déjà utilisé : ' ' i%=0 k%=0 found%=0 my_dll$="user32" ' repeat k%=k%+1 until library$(k%)="_"
repeat i%=i%+1 my_library$=lower$(library$(i%)) ' if my_library$=my_dll$ found%=1 exit_repeat end_if until i%=k%
' on ne peut pas savoir si les commandes utilisateur ont déjà été créé, il faut ruser if antibug_create_hide_LIBRARY_KEYWORD_CREATION%=0 antibug_create_hide_LIBRARY_KEYWORD_CREATION%=1 if found%=0 LIBRARY i%,my_dll$ end_if command "antibug_create_hide_GET_PLACEMENT","GetWindowPlacement",i%,"II","stdcall" command "antibug_create_hide_SET_PLACEMENT","SetWindowPlacement",i%,"II","stdcall" end_if
' préparation de la structure : ' ' créer une structure pour 11 integers WINDOWPLACEMENT$=string$(44,chr$(0)) ' GET_STRUCTURE_PTR(adr(WINDOWPLACEMENT_ptr%),adr(WINDOWPLACEMENT$)) :' récupère l'adresse de la structure et écrit là dans la variable 'WINDOWPLACEMENT_ptr%' adr_source%=adr(WINDOWPLACEMENT$) adr_destination%=adr(WINDOWPLACEMENT_ptr%) poke adr_destination%,peek(adr_source%) poke adr_destination%+1,peek(adr_source%+1) poke adr_destination%+2,peek(adr_source%+2) poke adr_destination%+3,peek(adr_source%+3)
' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,0,44) :' écrit sa taille(imposé par par 'user32' pour utiliser 'GetWindowPlacement') long%=44 buffer_position%=0 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3)
' récupère la position courante du form qu'elle ne soit altéré v_left% = left(v_form%) : v_top% = top(v_form%) :' récupère la position courante du form avant qu'elle ne soit altéré
' remplir la structure : ' ' null%=dll_call2("GetWindowPlacement",handle(v_form%),WINDOWPLACEMENT_ptr%) :' lit l'état du form antibug_create_hide_GET_PLACEMENT handle(v_form%),WINDOWPLACEMENT_ptr%
' lecture de données : ' ' READ_STRUCTURE_LONG(adr(v_left%),WINDOWPLACEMENT_ptr%,28) :' positionnement horizontal <---- c'est cette valeur qui cause le bug adr_destination%=adr(tmpv_left%) buffer_position%=28 poke adr_destination%,peek(WINDOWPLACEMENT_ptr%+buffer_position%) poke adr_destination%+1,peek(WINDOWPLACEMENT_ptr%+1+buffer_position%) poke adr_destination%+2,peek(WINDOWPLACEMENT_ptr%+2+buffer_position%) poke adr_destination%+3,peek(WINDOWPLACEMENT_ptr%+3+buffer_position%)
' READ_STRUCTURE_LONG(adr(v_left%),WINDOWPLACEMENT_ptr%,36) :' positionnement horizontal + largeur adr_destination%=adr(v_width%) buffer_position%=36 poke adr_destination%,peek(WINDOWPLACEMENT_ptr%+buffer_position%) poke adr_destination%+1,peek(WINDOWPLACEMENT_ptr%+1+buffer_position%) poke adr_destination%+2,peek(WINDOWPLACEMENT_ptr%+2+buffer_position%) poke adr_destination%+3,peek(WINDOWPLACEMENT_ptr%+3+buffer_position%) v_width%=v_width%-tmpv_left% :' largeur du form ' READ_STRUCTURE_LONG(adr(v_left%),WINDOWPLACEMENT_ptr%,32) :' positionnement vertical <---- c'est aussi cette valeur qui cause le bug adr_destination%=adr(tmpv_top%) buffer_position%=32 poke adr_destination%,peek(WINDOWPLACEMENT_ptr%+buffer_position%) poke adr_destination%+1,peek(WINDOWPLACEMENT_ptr%+1+buffer_position%) poke adr_destination%+2,peek(WINDOWPLACEMENT_ptr%+2+buffer_position%) poke adr_destination%+3,peek(WINDOWPLACEMENT_ptr%+3+buffer_position%)
' READ_STRUCTURE_LONG(adr(v_left%),WINDOWPLACEMENT_ptr%,40) :' positionnement vertical + hauteur adr_destination%=adr(v_height%) buffer_position%=40 poke adr_destination%,peek(WINDOWPLACEMENT_ptr%+buffer_position%) poke adr_destination%+1,peek(WINDOWPLACEMENT_ptr%+1+buffer_position%) poke adr_destination%+2,peek(WINDOWPLACEMENT_ptr%+2+buffer_position%) poke adr_destination%+3,peek(WINDOWPLACEMENT_ptr%+3+buffer_position%) v_height%=v_height%-tmpv_top% :' hauteur du form
' écriture de donnees : ' ' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,8,0) :' le laisser tel quel(visible/non visible) long%=show(frm_nb%) buffer_position%=8 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3)
' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,28,v_left%) :' écrit la nouvelle position horizontale long%=v_left% buffer_position%=28 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3)
' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,32,v_top%) :' écrit la nouvelle position verticale long%=v_top% buffer_position%=32 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3)
' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,36,v_width%+v_left%) :' écrit la largeur long%=v_width%+v_left% buffer_position%=36 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3)
' WRITE_STRUCTURE_LONG(WINDOWPLACEMENT_ptr%,40,v_height%+v_top%) :' écrit la hauteur long%=v_height%+v_top% buffer_position%=40 poke WINDOWPLACEMENT_ptr%+buffer_position%,peek(adr(long%)) poke WINDOWPLACEMENT_ptr%+1+buffer_position%,peek(adr(long%)+1) poke WINDOWPLACEMENT_ptr%+2+buffer_position%,peek(adr(long%)+2) poke WINDOWPLACEMENT_ptr%+3+buffer_position%,peek(adr(long%)+3) ' écrit le nouvel état du form : ' ' null%=dll_call2("SetWindowPlacement",handle(v_form%),WINDOWPLACEMENT_ptr%) :' écrit le nouvel état du form antibug_create_hide_SET_PLACEMENT handle(v_form%),WINDOWPLACEMENT_ptr%
END_SUB Il y a également une fonction équivalente dans la dll de Klaus. | |
|