Accueil > FAQ FAQ
Bienvenue dans la FAQ Dans cet espace, vous trouverez les réponses aux questions fréquemment posées, ainsi que les réponses à 'Comment je fais' et les questions 'Le saviez-vous'. Merci de nous faire part de vos commentaires sur ces Q&R.
Concernant vos proposition de Q&R, nous vous invitons à nous les soumettre par les formulaires de contact en spécifiant la question et la réponse à publier.

Merci de ne pas confondre FAQ et Forum. La première étant un extrait du second. Préférez alors les forums pour poser les questions sans réponses.

 Liste des catégories
Voici la liste des principales catégories et de leurs sous-catégories. Choisissez une catégorie pour voir les Q&R.
Catégorie Q&R Dernières Q&R publiées
 WinDev API
Q/R relatives à l'utilisation des API Windows avec WinDev.
22 Savez vous comment programmer une fonction Wake On Lan avec windev ?
 WinDev Codes
Q/R relatives au wLanguage et à la codification WinDev.
39 Comment récupérer la liste des sous répertoires en une seule ligne
 WinDev Codes HF
Q/R relatives aux ordres HyperFile du wLangage.
7 Comment affecter, modifier et supprimer le contenu d'un champ mémo bimair...
 WinDev Etats
Q/R relatives aux états WinDev et à WDEtat Utilisateurs
3 Appliquer les modifications iParametre() pour changer de bac
 WinDev Fenêtres
Q/R relatives aux fenêtres WinDev, à leur gestion et à leur contenus.
12 Dans un superchamp, mes sous-champs ne sont pas disponible en saisie alors qu&#...
 WinDev Projets
Q/R relatives aux projets WinDev.
3 Connaitre le répertoire des données en installation réseau
 WinDev Divers
Q/R sur les autres sujets WinDev.
10 Comment Renseigner la propriété RecordSelectionFormula de crystal report XI a...
 WinDev Gabarits/Design
Q/R relatives au design et aux gabarits WinDev
1 Magenta des bmp et boutons
 Le saviez-vous ?
Memoires sur les fonctions et utilisations de WinDev
12 Comment contrôler ou non la structure à l'ouverture d'un fichier Hy...

 Dernières Q&R publiées
Ici, la liste des dernières Q&R publiées.
Demandé et répondu par R&B le 27-Sep-2004 12:14 (11229 Lectures)
Trouver le pilote ODBC Hyperfile
Pour trouver le driver ODBC sur les fichier HF

Version 7 :
http://www.pcsoft.fr/st/telec/windev7/index.html
et sélectionner la page de la dernière version

dans cette page aller en bas dans le paragraphe téléchargement :
"ODBC sur HF (optionnel)" et prendre le fichier

Version 5.5 :
contacter les services commerciaux PCSoft : pcsoft@pcsoft.fr

Précision : Les drivers ODBC HF sont en lecture seule !


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2814 Lectures)
WinDev devient fou
Si votre WinDev devient fou (comportements bizarre de l'environnement...) :

1. Fermez WD,
2. Ouvrez Regedit
3. Supprimez HKEY_CURRENT_USER/Software/PC SOFT/WinDev8.0 !

Il sera recréé tout propre au prochain redémarrage de WD, moyennant les quelques questions du nouveau produit.
(extrait du NG officiel)


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (4707 Lectures)
Comment faire disparaitre l'alerte d'Outlook "Un programme tente d'accéder..."
Tout d'abord il faut télécharger un programme ici :
http://www.express-soft.com/mailmate/clickyes.html
comme il est dit sur le site, Outlook Express ne fait pas apparaître cette fenêtre si on change cela dans les options.

Ce code permet de lancer le logiciel qui va faire disparaître la fenêtre d'alerte, le temps que vous fassiez vos traitements.

Récupérer juste l'exécutable : ClickYes.exe
Que vous allez mettre dans votre répertoire du logiciel

----------------------------------------------------------------------
Ensuite dans l'initialisation de la fenêtre :
-----------------------------------------------------------------------
// Register a message to send
uClickYes = AppelDLL32("User32","RegisterWindowMessageA","CLICKYES_SUSPEND_RESUME")

// Find ClickYes Window by classname
wnd =AppelDLL32("USER32","FindWindowA","EXCLICKYES_WND",0)


SI wnd=0 ALORS
//appli non lancée
LanceAppli(RepDuLogiciel + "clickyes.exe", exeIconise, Faux)
Multitache(10)
// Register a message to send
uClickYes = AppelDLL32("User32","RegisterWindowMessageA","CLICKYES_SUSPEND_RESUME")

// Find ClickYes Window by classname
wnd =AppelDLL32("USER32","FindWindowA","EXCLICKYES_WND",0)
FIN
// Send the message to Resume ClickYes
Res = SendMessage(wnd, uClickYes, 1, 0)
----------------------------------------------------------------------------------------------------



--------------------------------------------------------------------------
Dans le code de fermeture de la fenêtre
----------------------------------------------------------------------
SendMessage(wnd, uClickYes, 0, 0)
ExeTermine(RepDuLogiciel + "clickyes.exe")
-----------------------------------------------------------------


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2739 Lectures)
Graver des CD
Information reportée ici car lue régulièrement.

Sous Windows XP, La simple présence d'un disque dans le graveur suffit. La copie de fichiers est alors possible vers le lecteur. Windows XP gère l'écriture normalement grâce à HighMat).

Sinon installer INCD de Nero qui est un composant ad hoc à votre sytème et permet donc aussi la copie simple sur le graveur.


Demandé et répondu par Mbsl le 27-Sep-2004 12:14 (4278 Lectures)
Utilisation de mailto avec des RC dans le corps
Windev 7.5
Outlook 2000
WK 2000 PRO

Dans la codification suivante :

LanceAppliAssociée("mailto: "+...
"?subject=" + W_C_Sujet + ...
"&body=" + W_C_Corps)

si w_c_corps contient des rc, il ne sont pas pris en compte. Il faut les remplacer par %0A.

Voir dans la Base de connaissances Microsoft - 192341

Mickael


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3657 Lectures)
Mise à jour automatique des données 'facile'
Source : NG fcdaw
Voici une ligne de commande trés utile pour proposer une mise à jour automatique des données quand on n'utilise pas WDSetup.

LanceAppli("WdmodFic.exe -nobacjup /WDD=MonAnalyse.wdd  /DIR=fNomCourt(ls_NomRepertoire), exeActif, exeBloquant)


Demandé et répondu par R&B le 27-Sep-2004 12:14 (5098 Lectures)
Magenta des bmp et boutons
L'affectation d'un BMP en image à un bouton en utilisant le parcours de fichiers ou en saisissant nom complet du fichier (description>Général>image), il arrive que le magenta (transparent) du bmp ne soit pas ignoré.

Solution :
Utiliser le bouton 'Catalogue' et sélectionner la collection 'Répertoire'.
Y sélectionner une des images de votre projet et valider.
Cette méthode permet de palier au problème de transparence du magenta pour les bmp.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2946 Lectures)
5.5 ressources basses
Emis par Kristian Paradis sur le forum daussy.org

"Bonjour a tous,

Je suis sur que je ne suis pas le seul qui lorsqu'il démarre l'application en mode test se fait souvent dire par windev qu'il reste moins de 25% de ressources gdi et user blablabla....

J'ai essayé cette astuce que j'ai trouvé sur un site de hardware (http://www.inpact-hardware.com/)

et ca semble bien fonctionner. (je n'ai pas eu le message depuis)

dans win.ini section windows ajouter la ligne:
GDIMaxHeapSize=32767

ATTENTION! 32768 a la valeur UserMaxHeapSize rend impossible le démarrage de windows... même en mode sans échec!!!

Ne pas mettre plus, j'ai essayé et windows refuse de démarrer GDI.exe et on me demande de réinstaller windows (même chose avec 32768).

J'espère que ca réglera les ennuis de plusieurs

Bon développement
Kristian Paradis


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3781 Lectures)
Simuler clic sur un bouton dans une autre application
Question postée sur le forum de daussy.org
réponse pas freddyp@wanadoo.fr :

lpBName est chaine asciiz de 128
lpBClass est chaine asciiz de 128

lpBName='Titre Fenetre' // Titre de la fenetre contenant le bouton
lpBClass='#32770' // Classe de la fenetre
NumFen est entier long=Appeldll32('USER32','FindWindowExA',Null,Null,&lpBClass,&lpBName)
si NumFen>0 alors
lpBName='Bouton' // Nom du bouton
lpBClass='Button' // Class Button
NumBtn est entier long=Appeldll32('USER32','FindWindowExA',NumFen,null,&lpBClass,&lpBName)
si NumBtn>0 alors
Post3 =postmessage(NumBtn,245,null,null) // BM_CLICK
fin
fin 


Demandé et répondu par R&B le 27-Sep-2004 12:14 (5367 Lectures)
Modifier la résolution ecran
Auteur du code : Philippe RAMIN

Déclaration de la structure DEVMOD dans le code du projet


DEVMODEA est une structure
dmDeviceName est une chaîne fixe sur 32 //Type C : BYTE
dmSpecVersion est un entier sur 2 octets //Type C : WORD
dmDriverVersion est un entier sur 2 octets //Type C : WORD
dmSize est un entier sur 2 octets //Type C : WORD
dmDriverExtra est un entier sur 2 octets //Type C : WORD
dmFields est un entier //Type C : DWORD
dmOrientation est un entier sur 2 octets //Type C : short
dmPaperSize est un entier sur 2 octets //Type C : short
dmPaperLength est un entier sur 2 octets //Type C : short
dmPaperWidth est un entier sur 2 octets //Type C : short
dmScale est un entier sur 2 octets //Type C : short
dmCopies est un entier sur 2 octets //Type C : short
dmDefaultSource est un entier sur 2 octets //Type C : short
dmPrintQuality est un entier sur 2 octets //Type C : short
dmColor est un entier sur 2 octets //Type C : short
dmDuplex est un entier sur 2 octets //Type C : short
dmYResolution est un entier sur 2 octets //Type C : short
dmTTOption est un entier sur 2 octets //Type C : short
dmCollate est un entier sur 2 octets //Type C : short
dmFormName est une chaîne fixe sur 32 //Type C : BYTE
dmLogPixels est un entier sur 2 octets //Type C : WORD
dmBitsPerPel est un entier //Type C : DWORD
dmPelsWidth est un entier //Type C : DWORD
dmPelsHeight est un entier //Type C : DWORD
dmDisplayFlags est un entier //Type C : DWORD
dmDisplayFrequency est un entier //Type C : DWORD
dmICMMethod est un entier //Type C : DWORD
dmICMIntent est un entier //Type C : DWORD
dmMediaType est un entier //Type C : DWORD
dmDitherType est un entier //Type C : DWORD
dmICCManufacturer est un entier //Type C : DWORD
dmICCModel est un entier //Type C : DWORD
dmPanningWidth est un entier //Type C : DWORD
dmPanningHeight est un entier //Type C : DWORD
FIN

CONSTANTE DM_BITSPERPEL=262144
CONSTANTE DM_PELSWIDTH=524288
CONSTANTE DM_PELSHEIGHT=1048576
CONSTANTE DM_DISPLAYFREQUENCY=4194304

CONSTANTE CDS_TEST=2
CONSTANTE CDS_UPDATEREGISTRY=1
CONSTANTE CDS_TEMP=0

Listage des résolutions dans un tableau


// code de la fenetre :
dm est une DEVMODEA
iModeNum est un entier
TANTQUE API('USER32','EnumDisplaySettingsA',Null,iModeNum,&dm)
TableAjouteLigne(TableResolutions,dm:dmDeviceName,dm:dmBitsPerPel,dm:dmPelsW
idth,dm:dmPelsHeight,dm:dmDisplayFrequency)
 iModeNum++
FIN

Bouton1 = Check si la résolution est Ok (ne modifie rien)


SI TableSelectOccurrence(TableResolutions)=0 ALORS RETOUR
dmtemp est une DEVMODEA
dmtemp:dmBitsPerPel=TableResolutions.dmBitsPerPel
dmtemp:dmPelsHeight=TableResolutions.dmPelsHeight
dmtemp:dmPelsWidth=TableResolutions.dmPelsWidth
dmtemp:dmDisplayFrequency=TableResolutions.dmDisplayFrequency
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_BITSPERPEL)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSWIDTH)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSHEIGHT)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_DISPLAYFREQUENCY)
dmtemp:dmSize=Dimension(dmtemp)
SI API('user32','ChangeDisplaySettingsA',&dmtemp, CDS_TEST)<>0 ALORS
 Erreur(ErreurInfo())
FIN

Bouton2 = Modification temporaire de la résolution


// Idem que le bouton 1 mais mettre le flag à 0 //

SI TableSelectOccurrence(TableResolutions)=0 ALORS RETOUR
dmtemp est une DEVMODEA
dmtemp:dmBitsPerPel=TableResolutions.dmBitsPerPel
dmtemp:dmPelsHeight=TableResolutions.dmPelsHeight
dmtemp:dmPelsWidth=TableResolutions.dmPelsWidth
dmtemp:dmDisplayFrequency=TableResolutions.dmDisplayFrequency
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_BITSPERPEL)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSWIDTH)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSHEIGHT)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_DISPLAYFREQUENCY)
dmtemp:dmSize=Dimension(dmtemp)
SI API('user32','ChangeDisplaySettingsA',&dmtemp, CDS_TEMP)<>0 ALORS
 Erreur(ErreurInfo())
FIN

Bouton3 = Modification permanente (maj de la base de registre)


// Idem que le bouton 1 mais mettre le flag à 1 //

SI TableSelectOccurrence(TableResolutions)=0 ALORS RETOUR
dmtemp est une DEVMODEA
dmtemp:dmBitsPerPel=TableResolutions.dmBitsPerPel
dmtemp:dmPelsHeight=TableResolutions.dmPelsHeight
dmtemp:dmPelsWidth=TableResolutions.dmPelsWidth
dmtemp:dmDisplayFrequency=TableResolutions.dmDisplayFrequency
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_BITSPERPEL)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSWIDTH)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_PELSHEIGHT)
dmtemp:dmFields=OUBinaire(dmtemp:dmFields,DM_DISPLAYFREQUENCY)
dmtemp:dmSize=Dimension(dmtemp)
SI API('user32','ChangeDisplaySettingsA',&dmtemp, CDS_UPDATEREGISTRY)<>0
ALORS
 Erreur(ErreurInfo())
FIN

Conclusion


Voila, un grand merci à Philippe Ramin pour cette trouvaille


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4196 Lectures)
Lister les processus NT
Merci à DrCharly93 pour ce post sur le NG PCSoft:

Comment lister les processus et modules en cours

Voici un bout de code trouver il y a longtemps sur internet
Procédure ProcesNT()
// Liste des process et modules sous NT
// Ce module pour fonctionner correctement doit être lancer dans une
//  fenêtre disposant d'une table 'TABLE1' composer de 5 colonnes
//  id           numérique entier (index dans la liste)
//  cProcessID   texte
//  cProcessName texte
//  cModuleName  texte
//  cPathName    texte
// Un interrupteur 'INTMODULE' permet de n'afficher
//  que les process (INTMODULE=0)
//  ou les process et modules correspondants (INTMODULE=1)

//
LOCAL
 idTabProcess  est un tableau de 200 entiers longs
 Cb     est un entier long=800  // taille en octets du tableau idTabProcess
 CbNeeded   est un entier long
 NumElements  est un entier long

 hTabModule  est un tableau de 200 entiers longs
 Cb2    est un entier long=800  // taille en octets du tableau hTabModule
 CbNeeded2   est un entier long
 NumModules   est un entier long
 Pname   est une chaine

 FileName   est une chaine fixe sur 260
 BaseName  est une chaine fixe sur 260
 nSize    est un entier long=260  // taille de FileName et BaseName

 lret,l1,l2  est un entier long
 hProcess   est un entier long
 i,i2    est un entier long
    NumDll    est un entier long


NumDll=chargedll('PSAPI.DLL')
si NumDll=0 alors
 erreur('La dll PSAPI n'a pas été chargée')
 renvoyer faux
fin

//
// The EnumProcesses function retrieves the process identifier
//  for each process object in the system.
//
//  BOOL EnumProcesses(
//    DWORD * lpidProcess,  // array to receive the process identifiers
//    DWORD cb,             // size of the array
//    DWORD * cbNeeded      // receives the number of bytes returned
//  );
Lret=appeldll32('PSAPI.DLL','EnumProcesses',&idTabProcess,Cb,&CbNeeded)
NumElements=CbNeeded/4   // Taille renvoyée divisée par la taille d'un
entier long (4 octets)

Pour i=1 a NumElements
    //
 // The OpenProcess function returns a handle to an existing process object.
 //
 //  HANDLE OpenProcess(
 //    DWORD dwDesiredAccess,  // access flag
 //    BOOL bInheritHandle,    // handle inheritance flag
 //    DWORD dwProcessId       // process identifier
 //  );
 //

HProcess=appeldll32('KERNEL32.DLL','OpenProcess',oubinaire(1024,16),0,idTabP
rocess[i])
 si HProcess<>0 alors  // On a un processus. On va rechercher ses modules.
        //
  // The EnumProcessModules function retrieves a handle for each module
  //  in the specified process.
  //
  // BOOL EnumProcessModules(
  //   HANDLE hProcess,      // handle to the process
  //   HMODULE * lphModule,  // array to receive the module handles
  //   DWORD cb,             // size of the array
  //   LPDWORD lpcbNeeded    // receives the number of bytes returned
  // );
  // Process_Query_Information=1024
  // Process_All_Access=16
  //

Lret=Appeldll32('PSAPI.DLL','EnumProcessModules',Hprocess,&hTabModule,Cb2,&C
bNeeded2)
  si LRet<>0 alors
   NumModules=CbNeeded2/4
   SI INTMODULE=0 alors NumModules=1
   Pour i2=1 a NumModules
    // The GetModuleBaseName function retrieves the base name of the
specified module.
    //
    //DWORD GetModuleBaseName(
    //  HANDLE hProcess,    // handle to the process
    //  HMODULE hModule,    // handle to the module
    //  LPTSTR lpBaseName,  // buffer that receives the base name
    //  DWORD nSize         // size of the buffer
    //);
     L1=Appeldll32('PSAPI.DLL','GetModuleBaseNameA',HProcess,hTabModule[i2]
....
                  ,&BaseName,nSize)
     SI L1=0 alors BaseName=''
    Si i2=1 alors Pname=minuscule(BaseName[[1 à L1]])
    //
    // The GetModuleFileNameEx function retrieves the fully qualified path
    //  for the specified module.
    //
    //  DWORD GetModuleFileNameEx(
    //    HANDLE hProcess,    // handle to the process
    //    HMODULE hModule,    // handle to the module
    //    LPTSTR lpFilename,  // buffer that receives the path
    //    DWORD nSize         // size of the buffer
    //  );
    //

L2=Appeldll32('PSAPI.DLL','GetModuleFileNameExA',HProcess,hTabModule[i2] ...
                  ,&FileName,nSize)
    Si L2=0 alors FileName=''
    TABLEAJOUTE('TABLE1',i+i2/1000+TAB+idTabProcess[i]+TAB+PName+...
              TAB+Minuscule(BaseName[[1 à L1]])+...
              tab+Minuscule(FileName[[1 a L2]]))
   fin
  fin
  LRet=Appeldll32('KERNEL32.DLL','CloseHandle',HProcess)
 FIN
fin

si NumDll<>0 alors
 dechargedll(NumDll)
fin


Demandé et répondu par Bassy le 27-Sep-2004 12:14 (2958 Lectures)
Vider la Corbeille Windows
Le code d'utilisation d'API Windows pour vider la Corbeille est :
LA_CONFIR est un entier sur 8 octets=0x00000000
AppelDLL32( "shell32.dll" , "SHEmptyRecycleBinA" , Handle() , Null ,&LA_CONFIR)


LA_CONFIR=0x00000000 // Avec message de confirmation
LA_CONFIR=0x00000001 // Sans confirmation
LA_CONFIR=0x00000000 // Sans jauge
LA_CONFIR=0x00000000 // Sans les effets sonores


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3679 Lectures)
Partager un repertoire windows
On va utilisez l'api netapi32.dll

plus d'info : NetShareAdd et SHARE_INFO_2

//partage d'un repertoire
STYPE_DISKTREE est un entier = 0

//permissions
ACCESS_READ     est un entier = 0x1
ACCESS_WRITE    est un entier = 0x2
ACCESS_CREATE   est un entier = 0x4
ACCESS_EXEC     est un entier = 0x8
ACCESS_DELETE   est un entier = 0x10
ACCESS_ATRIB    est un entier = 0x20
ACCESS_PERM     est un entier = 0x40

SHARE_INFO_2 est une structure
shi2_netname est un entier
shi2_type est un entier
shi2_remark est un entier
shi2_permissions est un entier
shi2_max_uses est un entier
shi2_current_uses est un entier
shi2_path est un entier
shi2_passwd est un entier
FIN
si2 est un SHARE_INFO_2

Nom_Partage est une chaîne UNICODE = AnsiVersUnicode("test")   //nom du partage
Description_Partage  est une chaîne UNICODE = AnsiVersUnicode("description de mon partage") //Description du partage
Chemin_Partage  est une chaîne UNICODE = AnsiVersUnicode("c:test") //Chemin du partage
Password_Partage est une chaîne="pitleda" // Mot de passe du partage
ServeurName_Partage  est une chaîne UNICODE = AnsiVersUnicode("\monpc") //Nom du serveur

success  est un entier
si2:shi2_netname=&Nom_Partage // nom du partage
si2:shi2_type=STYPE_DISKTREE  //Partager koi ? ici un repertoire
si2:shi2_remark=&Description_Partage //&Description_Partage // commentaire
si2:shi2_permissions=ACCESS_READ  //acces en lecture
si2:shi2_max_uses=-1 //illimlité
//si2:shi2_current_uses=
si2:shi2_path=&Chemin_Partage
si2:shi2_passwd=&Password_Partage

success=API("netapi32.dll","NetShareAdd",&ServeurName_Partage,2,&si2,Null)

MessageErreur est une chaîne
SELON success
	CASE 0 
		MessageErreur="Partage Effectué"
	CASE 5
		MessageErreur="ERREUR: Vous n'avez pas acces à la fonction demandé." 
	CASE 50
		MessageErreur="ERREUR: Le partage n'est pas supporté."
	CASE 53
		MessageErreur="ERREUR: Le chemin du partage n'est pas correct."
	CASE 87
		MessageErreur="ERREUR: Un Paramètre est invalide."
	CASE 123 
		MessageErreur="ERREUR: Le nom n'est pas valide."
	AUTRE CAS
		MessageErreur="ERREUR inconue"
FIN


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3014 Lectures)
Hyperfile sur Samba
Source : NG officiel (Adrien)

il y a des paramètres a modifier dans le fichier smb.conf qui se trouve communément sous /etc/samba.

[global]
	locking = yes
	strict locking = yes
	share modes = yes
	oplocks = no
	kernel oplocks = no
	blocking locks = no
	fake oplocks = no
	level2 oplocks = no


redémarrer le service !


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4363 Lectures)
hImporteTexte() sans délimiteur de chaînes
Souvent les fichiers à importer ne comportent que des délimiteurs de colonnes et de lignes.
Les chaînes ne sont pas encadrées par un délimiteur.

Pour exploiter ces fichier avec la hImporteTexte (plus performante qu'un parcours), il faut définir la chaine des délimiteur comme suit :

cSep est une chaine
cSep=TAB+caract(127)+RC
// intégration d'un fichier avec TAB en séparateur de colonnes et RC pour saut de lignes
//Ensuite utiliser l'option hImpSansDélimiteur :
hImporteTexte(fichier,rubriques,cSep,hImpSansDélimiteur)

Ainsi les colonnes seront correctement interprétées


Demandé et répondu par R&B le 27-Sep-2004 12:14 (6061 Lectures)
Fichier externe : lire le contenu hexadécimal
La lecture de la chaine hexa d'un fichier binaire peut être réalisée par la fonction flit() et moyennant un petit subterfuge dans la lecture des caractères. en effet flit() est conçue nativement pour une lecture de fichier texte et propose directement une conversion en code ascii des caractères lus.

L'idée est alors de d'utiliser la résolution automatique des types et un entier non signé sur 1 octet (0...255) facile à convertir en hexa.

Ensuite, on peut faire ce que l'on veut...
Bon dev.

cFichier est une chaine // contenu hexa du fichier
// Ouverture du fichier
nIdfic est un entier = fOuvre(MonFichier, foLecture)
SI nIdfic=-1 ALORS
    Erreur('L'ouverture du fichier a échoué')
SINON
    // récupère le nombre d'octets à lire 
    nbcar est un entier = fPositionne(nIdfic,0,fpFin)
    ncar est un entier
    fPositionne(nIdfic,0,fpDébut)
    sCar est un entier sans signe sur 1 octet
    fLit(nIdfic,1,&sCar)    // nouvelle syntaxe : par adresse
    TANTQUE ncar<nbcar
        ncar++
        // taitement de l'octet
        // conversion de l'entier en valeur hexa
        cfichier+=NumériqueVersChaine(sCar,'02X')
        // octet suivant                        
        fLit(nIdfic,1,&sCar)
    FIN
    // Fermeture du fichier
    fFerme(nIdfic)
FIN


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4007 Lectures)
Conversion Octet - Binaire
Arpès lecture d'un fichier en héxadécimal, voici la conversion des octets en binaire.

Bon dev.

nA,nB sont des entiers sans signe sur 1 octet
nA=64
nB=255
Info(Octet2Bin(nA),Octet2Bin(nB))

donne 01000000 et 11111111

avec

PROCEDURE Octet2Bin(sCar est un entier sans signe sur 1 octet)
// conversion de l'octet en hexa
sHexa est une chaîne fixe sur 2 = NumériqueVersChaine(sCar,'02X')
// conversion de l'octet (hexa) en binaire
sres est une chaîne fixe sur 8
i est un entier
BOUCLE
        i++
        SELON sHexa[[i]]
                CAS 0:
                        sres[[(4*(i-1))+1 A (4*i)]]='0000'
                CAS        1:
                        sres[[(4*(i-1))+1 A (4*i)]]='0001'
                CAS 2:
                        sres[[(4*(i-1))+1 A (4*i)]]='0010'
                CAS 3:
                        sres[[(4*(i-1))+1 A (4*i)]]='0011'
                CAS 4:
                        sres[[(4*(i-1))+1 A (4*i)]]='0100'
                CAS        5:
                        sres[[(4*(i-1))+1 A (4*i)]]='0101'
                CAS        6:
                        sres[[(4*(i-1))+1 A (4*i)]]='0110'
                CAS        7:
                        sres[[(4*(i-1))+1 A (4*i)]]='0111'
                CAS        8:
                        sres[[(4*(i-1))+1 A (4*i)]]='1000'
                CAS        9:
                        sres[[(4*(i-1))+1 A (4*i)]]='1001'
                CAS 'A':
                        sres[[(4*(i-1))+1 A (4*i)]]='1010'
                CAS 'B':
                        sres[[(4*(i-1))+1 A (4*i)]]='1011'
                CAS 'C':
                        sres[[(4*(i-1))+1 A (4*i)]]='1100'
                CAS 'D':
                        sres[[(4*(i-1))+1 A (4*i)]]='1101'
                CAS 'E':
                        sres[[(4*(i-1))+1 A (4*i)]]='1110'
                CAS 'F':
                        sres[[(4*(i-1))+1 A (4*i)]]='1111'
        FIN
        SI i=2 ALORS SORTIR
FIN
RENVOYER sres


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3389 Lectures)
Imprimer une page de site internet
Merci à Firetox pour cette soumission :
pour ceux qui comme moi on chercher un moment comment imprimer une page Web sans passer par un activeX.
l'interet etant d''utiliser en WD7.5 le iapercu(ihtml,MonFic.htm) et ensuite transferer ce fichier . Mais un beau jour vouloir l'imprimer sans qu'aucune question soit poser etc .....

voici le bout de code :

NomFic est une chaine = 'D:TestRTF.HTM'
monIe est un objet ole dynamique
si monie = null alors monie = allouer un objet OLE 'InternetExplorer.application'
si monie <> NULL ALORS 
monie>>visible=olefaux
// on charge le document Word
monie>>navigate(nomfic)//,olefaux,olevrai)
tantque monIe>>busy
// attente de la fin du chargement de la page
FIN
monIe>>ExecWB(6,2)
FIN


Penser à liberer l'objet dynamique après impression....
liberer MonIe


Complément de drCharly
Après moulte recherche, je me suis apercu que l'on pouvait imprimer une page internet sans faire apparaitre la boite de propriété de l'impresssion
monIe>>ExecWB(6,2,0,0)

Cela devrait éviter plusieurs jour de recherche.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3167 Lectures)
Lire un champ appartenant à une autre fenêtre
Question récurente s'il en est.... et la solution est pourtant si simple
Prenons deux fenêtre (fen1 et fen2), la première contient un table dont je veux récupérer des valeur dans du code de la seconde.
Les deux fenêtres doivent évidement être ouvertes.

Pour utiliser des champs d'autres fenêtres actives il faut utiliser l'indirection (consulter l'aide sur le sujet, c'est une des notions puissantes de windev) :

// code dans FEN2
// syntaxe 1 : accès direct en utilisant le 'chemin' du champ
MaVal = fen1.table.colonne[indice]
// syntaxe 2 : on construit le nom du champ (son 'chemin') à partir d'une chaine, les signes {} activnt l'indirection
MaVal = {'fen1.table.colonne['+indice+']',indChamp}


nb, la seconde syntaxe interprète la chaine pour construire le nom du champ. on peut donc construire le nom d'un champs avec des variables... trés utile pour économiser du code .


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3582 Lectures)
Appeler un traitement par une touche
Il est parfois nécessaire de ne rendre disponible des traitement que par une combinaison de touches.
Pour ce faire, la méthode la plus simple est de mettre le code dans un bouton, lequel est simlplement positionné en dehors de l'espace visible de la fenêtre. Evidement il ne faut pas omettre, dans la description du bouton d'affecter la lettre d'appel correspondante (les ALT et CRTL en combinaison sont utilisable).

La disponibilité de la touche de fonction est équivalente à celle du bouton. Attention donc au multifenêtrage et aux plans.
Pour les plans, si le bouton est affecté à un plan, la touche ne sera disponible que lorsque le plan sera actif...


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2