Ar-S a écrit :Pour ma part je n'utilise jamais #Pb_Any.
Idem.
Je vois peu d'avantage aux PB_any.
Contrairement à Ar-S, je suis partisan de EnableExplicit, vraiment c'est peu de travail comparativement au temps passé à chercher une erreur et puis vous comme moi (

), on en fait à la pelle.
Donc je déclare tout et on s'y retrouve, en mettant en plus des commentaires au début des procédures, c'est peut-être long mais sur des codes longs ou on arrête de programmer et que l'on reprend, c'est tout sauf du luxe.
Un extrait d'une de mes procédure de conversion format ico vers icl/dll.
J'ajoute au début un compilerif avec une constante qui permet d'afficher le nom de la procédure.
Fait pour toutes les procédures, c'est une aide au debug simple et facile, permet de voir la chronologie d'appel des procédures.
Code : Tout sélectionner
Procedure.i PIM_Convert_icoStream_To_iclFile2(*Stream.Istream, DestinationFile$, Mode, ExtensionType)
CompilerIf #Nom_Procedure = #True
Debug #PB_Compiler_Procedure
CompilerEndIf
;///////////////////////////////////////////////////////////////////////////////////////////////////
;//
;// FONCTION: PIM_Convert_icoFile_To_iclFile2()
;//
;// BUT: à partir du fichier .ico, on va créer un fichier icl/dll 32 bits
;//
;// PARAMS: *StreamId - Identifiant du stream contenant le fichier au format ico
;// Mode - valant #PIM_One_Group : un seul groupe d'icônes est créé
;// valant #PIM_Multi_Group : chaque icône est un groupe
;// DestinationFile$- fichier destination icl/dll avec chemin complet
;// Si DestinationFile$ est une chaine vide, on utilise le même nom suivi de '.icl' ou '.dll'
;// ext$ - doit valoir #icl_Extension ou #dll_Extension en fonction du type de fichier voulu
;// si ext$ vaut #icl_Extension, les noms de groupes peuvent exister
;// si ext$ vaut #dll_Extension, les noms de groupes n'existent pas
;// si ext$ = #dll_Extension, Mode ne peut pas contenir la constante #PIM_No_GroupName
;//
;//
;// RETOURNE: #Return_No_Error (=#True) en cas de succès
;// Retourne #Return_Error (= 0) en cas d'erreur
;//
;// La fonction teste les valeurs de la structure IconDir qui débute le fichier, puis
;// le fichier est scruté pour créer le fichier icl
;//
;///////////////////////////////////////////////////////////////////////////////////////////////////
;// mémorise le handle du fichier icl/dll créé
Protected h_ICL_File
;// mémorise l'adresse du contenu du fichier à partir du début du fichier, modifié dans chaque boucle
Protected *Memory_Add_temp.IconDir_0
;// mémorise le pointeur des zones de données à écrire dans la ressource
Protected *iconGroup.MemIconDir_0
;// memorise la dernière adresse valide du fichier en mémoire pour vérifier le non dépassement
Protected *LastMemoryAdress
;// mémorise le nombre d'icônes de la structure IconDir_0
Protected Nb_icones
;// mémorise le handle de l'API BeginUpdateResource_()
Protected BeginUpdateResource
;// compteur de boucles
Protected i
;// mémorise le nom du groupe contenu dans le fichier icl/dll (= nom fichier sans extension)
Protected NomGroupe.string
;// mémorise la chaine complète des noms de groupes
Protected Chaine_Groupes.string
;//mémorise la longueur de la chaine créée à partir du nombre de groupe str()
Protected Nb_char_Nb_GroupeIcone
;// mémorise la longueur du nom de groupe
Protected Longueur_nom_groupe
;// mémorise l'extension du fichier
Protected ext$
;// long utilisé pour lire une donnée dans le stream
Protected Input.l
;// mémorise le nombre d'octets lus dans le stream
Protected pcbRead
;// mémorise l'offset de l'image courante
Protected dwImageOffset
;// mémorise le nombre d'octets de la ressource
Protected dwBytesInRes
;// mémorise la valeur courante du pointeur de stream
Protected Seek_pointer_Current_value.ULARGE_INTEGER
;// mémorise la taille de la dll compressée en RC_DATA
Protected Taille_Empy_dll
;// mémorise la date pour les fichiers
Protected Date
;// teste si le pointeur est nul
If *Stream = #Null
MAC_PIM_SetError_Code(#Sous_Error_2_Error_Code_Pointeur_Null|#Error_Code_Pointeur_Null)
ProcedureReturn #Return_Error
EndIf