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 (2736 Lectures)
Rebooter le projet en execution
Comment faire pour que l'application se relance ?
En effet, les modifications de la configuration par un panneau de configuration intégré doivent être prise en compte par le relancement de l'exe (lecture de la configuration dans initialisation du projet).

Pour ce faire c'est trés simple :
l'application doit être multi-instance (pas testé si non instance)
On lance une autre session via LanceAppli() en spécifiant le nom de l'exe courant disponible avec exeInfo(). Puis, on termine la session en cours avec FinProgramme().
Ainsi l'utilisateur se voit invité dans une autre session du même logiciel... avec les nouveau paramètres de configuration pris en compte.

SI PAS LanceAppli(gProjetExe,exeActif,exeNonBloquant) ALORS
	Erreur(ErreurInfo(errMessage))
SINON
	FinProgramme()
FIN


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3200 Lectures)
Conversion Décimal - Hexadécimal
Conversions par Michel Fages

Decimal en hexa


hex = NumToString(dec, 'x')

Hexa en décimal


dec = Val(hex, 16)


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2866 Lectures)
Inactiver une touche clavier
Merci au post de Firetox qui permet de répondre à cette question récurente :

voici sonc un exemple de code pour inactiver la touche échap.
le principe et simple, on intercepte l'évènement correspondant à cette touche et on transforme le résultat obtenu pour qu'il ne soit pas interprété par l'application.
Pour les autres touches, il suffit de trouver les valeur windows de l'évènement correspondant. Notez la présence du fichier Windev7x/Personnel/Externe/KeyConst.WL qui peut être inclus à votre projet pas le comande Externe 'KeyConst.WL' en début de projet.

Un evenement et une procedure :
// ouverture de la fenetre
GLOBAL
WMKeydown est un entier long = 256
evenement('Annul_Echap','*.*',WMKeydown)

// procedure Annul_Echap
Procédure Annul_Echap()
si _eve.wparam = 27 alors
// ou si _eve.wparam = VK_ESCAPE alors
_eve.retour = 0
FIN


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4410 Lectures)
Supprimer une ligne dans un fichier texte
Il est impossible d'éffectuer cette manipulation directement dans le fichier original. Reste que rien n'empèche de passer par un fichier temporaire.

Il suffit alors simplement de copier dans un fichier temporaire les parties à conserver du fichier d'origine et sauter les lignes à supprimer.
Faire suivre le procédé par un fRenomme() et le tour est joué.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3306 Lectures)
MonGroupe..Etat ne contient pas la valeur prévue
Attention :
Il est possible que la proriété ..Etat d'un groupe de champs ne corresponde pas à la dernière valeur qui lui a été fixée.
En effet, si vous affectez indépendament l'état de certains champs du groupe, la propriété du groupe peut se voir affectée sans que les autres champs se voient modifiées.

Cause :
Aide de la propriété ..Etat
Citation :
Etat d'un groupe de champs
Connaître l'état d'un groupe de champs : l'état renvoyé correspond à l'état du premier champ du groupe.


La modification de l'état de ce premier champs (selon l'ordre des tabstops) affecte la propriété ..etat du groupe sans que l'état des autres champs soient modifiés.

Une solution consiste alors simplement à ajouter un champs invisible au groupe : CHPGP_ et ensuite remplacer
si <NomDuGroupe>..etat=Actif alors 

par
si CHPGP_<NomDuGroupe>..etat=Actif alors 

pour être à coup sûr de tomber juste dans l'évaluation l'état du groupe.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2352 Lectures)
..visible avec une fenêtre comportant des plans
La propriété ..visible et la gestion des plans se recouvrent.

Ainsi monchamp..visible retourne faux même si le champs est visible quand le champs n'appartient pas au plan courant de la fenêtre.

La solution, pour les fenêtres qui comportent des plans
// le plan du champ devient le plan courant
Mafenêtre..plan=Monchamp..plan
// récupère la visibilité effective du champ
info(Monchamp..visible) // retourne alors vrai


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2849 Lectures)
Colonnes de tables qui deviennent inexistantes en execution
L'utilisation de ConstuitTableFichier() pour alimenter une table à partir du résultat d'une requete doit être accompagnée de précaution.

Extrait de l'aide :
Citation :
-Les colonnes de la table définies sous l'éditeur sont supprimées.
- Les modes de saisie définis sous l'éditeur pour la table sont conservés.
...
Les colonnes créées portent les noms "_COL1", "_COL2", "_COL3", etc. Ces colonnes sont accessibles par programmation via l'opérateur d'indirection { }.


Ainsi, après cette fonction, il ne faut utiliser plus que l'indirection et _COL1... pour manipuler les colonnes de votre table. Ne plus utiliser les noms des colonnes définies avec l'éditeur de fenêtre.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2500 Lectures)
Suprimer une sous chaine dans une chaine
La procédure suivante supprime la première occurrence d'une sous chaine dans une autre :
PROCEDURE ChaineSupprime(ChaineInitiale,ChaineASupprimer)
pos est un entier
len est un entier=Taille(ChaineASupprimer)
c est une chaîne
pos=Position(ChaineInitiale,ChaineASupprimer)
SI pos<>0 ALORS
   c=ExtraitChaîne(ChaineInitiale,1,ChaineASupprimer)
   ChaineInitiale=c+ExtraitChaîne(ChaineInitiale,2,ChaineASupprimer)
FIN


Exemple :
ChaineSupprime("111222333","222") => "111333"


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (2693 Lectures)
Copier Windows / Coller Windev (Fichiers uniquement)
Copier des Fichiers sous windows, pour les coller sous windev. (Récupération du chemin des fichiers contenus dans le presse papier)

NbFIchierARecup est un entier
FileName est une chaîne
CFDrop est un entier
i est un entier
//acces au Press Papier
AppelDLL32("user32", "OpenClipboard",0)
//chercher si le press papier contient des fichiers
CFDrop=AppelDLL32("user32", "GetClipboardData",CF_HDROP)
//recuperer le nombre de fichier dans le press papier
NbFIchierARecup=AppelDLL32("SHELL32","DragQueryFile",CFDrop,-1,"",0)
POUR i=0 A NbFIchierARecup-1
	FileName=Complète(FileName,350)
	//récuperation du fichier
	AppelDLL32("SHELL32","DragQueryFile",CFDrop,i,FileName,Taille(FileName))
	Trace(FileName)
	FileName=SansEspace(FileName)	Trace(FileName)
FIN
//Fermeture du press papier
AppelDLL32("user32", "CloseClipboard")

Auteur : KPiTN


Demandé et répondu par R&B le 27-Sep-2004 12:14 (1189 Lectures)
Propriétés des éléments des fenêtres non ouvertes
Si les propriétés des éléments des fenêtres (champs...) sont disponibles, il n'en demeure qu'elles ne sont lisibles que si la fenêtre est ouverte car WinDev ne peut lire que les propriétés des éléments chargé en mémoires (APIs et poignées).

Une solution consiste simplement à ouvrir la fenêtre en mode 'caché'. C'est à dire hors écran.
Evidement une condition sera que cette fenêtre ne doit effectuer aucun traitement automatique avec interaction nécessaire en ouverture quand elle est dans ce mode d'ouverture. Il faudra alors désactiver ces traitements dans la phase d'initialisation de la fenêtre et des champs.

// Appel de la fenêtre 'cachée'
OuvreSoeur(nomfenetre,Vrai)


// init fenêtre ouverte hors ecran
PROCEDURE NomFenetre(pbModeCaché=Faux)
SI pbModeCaché ALORS FenEtat(nomfenêtre,HorsEcran)
// Evaluer pbModeCaché pour inactiver les traitements d'initialisation avec interaction


Demandé et répondu par Totof le 27-Sep-2004 12:14 (2635 Lectures)
Threads et multitâche
Bonjour tout le monde,

J'ai un message pour les utilisateurs de Threads.
Après avoir contacté le support technique de WD, j'ai appris
qu'il ne fallait JAMAIS UTILISER LA FONCTION MULTITACHE dans une procédure appelée par un Thread.

Avant je fesais :
Tantque pas ArretThead
multitache(-1)
Fin

Maintenant il faut faire :
Tantque pas ArretThread

Fin


Le gestionnaire des tâches indique que 100% des ressources processeur sont utilisées ... mais on m'a dit que ce n'était qu'un affichage windows et effectivement on peut continuer à travailler correctement.

Il ne faut pas utiliser multitâche dans les threads.

C'était l'info du jour.

A+

Tof


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3682 Lectures)
Copier Windev / Coller Windows (Fichiers uniquement)
Copier des Fichiers sous windev, pour les coller sous windows.
SI AppelDLL32("user32", "OpenClipboard",0) ALORS
	AppelDLL32("user32", "EmptyClipboard" )
	Data=""
	
	//Récupération des chemins de fichiers dans une table 
	POUR i=1 A TableSelectOccurrence(TABLEEXEMPLE)
		Data+=TABLEEXEMPLE.Chemin[TableSelect(TABLEEXEMPLE,i)] + Caract(0)	
	FIN
	
	
	hGlobal=AppelDLL32("kernel32","GlobalAlloc",0x40,Dimension(df) + Taille(Data))
	SI hGlobal ALORS
		lpGlobal=AppelDLL32("kernel32","GlobalLock",hGlobal)
		
		
		df:pFiles = Dimension(df)
		AppelDLL32("kernel32","RtlMoveMemory",lpGlobal,&df,Dimension(df))
		AppelDLL32("kernel32","RtlMoveMemory",(lpGlobal + Dimension(df)),Data,Taille(Data))
		AppelDLL32("kernel32","GlobalUnlock",hGlobal)
		
		
		// Copie les fichiers dans le press papier
		SI AppelDLL32("user32", "SetClipboardData",CF_HDROP,hGlobal) ALORS
			AppelDLL32("user32", "CloseClipboard") 				
		FIN
	FIN
FIN


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3072 Lectures)
[Outlook] Insertion de contact
Insertion de contact dans outlook à partir d'une BDD
Les différents élément du contact sont décrit dans le code

// ----------------------------------------------------------------------------
//
// Insérer dans Les Contacts Outlook des données stockées dans une BDD (ou autre)
//
// ----------------------------------------------------------------------------


ReqFournisseur est une Source de Données

objApp est un objet OLE dynamique
objNS est un objet OLE dynamique
myFolder1 est un objet OLE dynamique
objFolder est un objet OLE dynamique
cit1 est un objet OLE dynamique

objApp=ObjetActif("OutLook.Application")
objNS=objApp>>GetNamespace("MAPI")
//Récuperer le dossier contact de votre choix
myFolder1=objNS>>PickFolder

//REQUETE CLASSIQUE WINDEV a remplacer par votre type de requete habituelle (HexecuteRequeteSQL ...)
ReqFournisseur=Req("Select * from fournisseurs",ReqFournisseur)

HLitPremier(ReqFournisseur)
TANTQUE PAS HEnDehors(ReqFournisseur)
	cit1 = myFolder1>>Items>>Add(2)
	//Nom
	cit1>>FirstName =ReqFournisseur.Nom
	//Prenom
	cit1>>LastName =ReqFournisseur.prenom
	// Société
	cit1>>CompanyName=ReqFournisseur.RaisonSociale
	// Premiere Adresse Email
	cit1>>Email1Address = ReqFournisseur.Mail
	// RUE DE L'ADRESSE
	cit1>>BusinessAddressStreet=ReqFournisseur.AdressePaiement
	//CODE POSTAL 
	cit1>>BusinessAddressPostalCode=ReqFournisseur.CPPaiement
	// VILLE
	cit1>>BusinessAddressState=ReqFournisseur.VillePaiement
	//fax
	cit1>>BusinessFaxNumber=ReqFournisseur.FaxPaiement
	//Telephone
	cit1>>BusinessTelephoneNumber=ReqFournisseur.TelPaiement
	// web site
	cit1>>WebPage=ReqFournisseur.Site
	//classement du titre du contact ici(SOCIETE et FIRSTNAME)	
	SI cit1>>FirstName <>"" ALORS
		cit1>>FileAs=cit1>>CompanyName + RC + "(" + cit1>>FirstName + ")"
	SINON
		cit1>>FileAs=cit1>>CompanyName 
	FIN
	//CATEGORIE DU CONTACT 
	cit1>>Categories="Fournisseurs"
	cit1>>SAVE
	
	HLitSuivant(ReqFournisseur)
FIN


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (4257 Lectures)
[OUTLOOK] Récupérer les infos des contacts Outlook
Récupérer des infos des contacts outlook

// ---------------------------------------
// Récupérer des infos des contacts outlook
// ----------------------------------------

ReqFournisseur est une Source de Données

objApp est un objet OLE dynamique
objNS est un objet OLE dynamique
myFolder1 est un objet OLE dynamique
objFolder est un objet OLE dynamique
cit1 est un objet OLE dynamique

NBContact est un entier
i est un entier=1

objApp=ObjetActif("OutLook.Application")
objNS=objApp>>GetNamespace("MAPI")
//Récuperer le dossier contact de votre choix
myFolder1=objNS>>PickFolder
// Nombre de contact dans le dossier selectionné
NBContact = myFolder1>>items>>count
TANTQUE i<NBContact
	cit1=myFolder1>>items(i)	
	Trace(cit1>>FirstName + " - " + cit1>>CompanyName + " - " + cit1>>Email1Address + "- ETC ..." )
	i++
FIN

// ----------------------------------------------
//   Les infos à récupérer : (EXEMPLE)
// ----------------------------------------------
//	//Nom
//	cit1>>FirstName 
//	//Prenom
//	//cit1>>LastName 
//	// Société
//	cit1>>CompanyName
//	// Premiere Adresse Email
//	cit1>>Email1Address 
//	// RUE DE L'ADRESSE
//	cit1>>BusinessAddressStreet
//	//CODE POSTAL 
//	cit1>>BusinessAddressPostalCode
//	// VILLE
//	cit1>>BusinessAddressState
//	//fax
//	cit1>>BusinessFaxNumber
//	//Telephone
//	cit1>>BusinessTelephoneNumber
//	// web site
//	cit1>>WebPage=ReqFournisseur.Site
//	//CATEGORIE
//	cit1>>Categories


Demandé et répondu par KPiTN le 27-Sep-2004 12:14 (3019 Lectures)
Recherche dans un Tableau (Suppression des lignes non désirées)
Procédure de recherche dans un tableau, on ne gardera dans ce tableau que les lignes qui nous intéressent
// ---------------------------------------------------------------------------------------
//	PROCEDURE DE RECHERCHE DANS UN TABLEAU (EN GARDANT UNIQUEMENT LES ELEMENTS RECHERCHE)
// ---------------------------------------------------------------------------------------
//  TableTaches.Taches  <--- TableTaches est le nom de votre table , Taches est le nom de la colonne
//  TxtRecherche  <------ Champs texte qui contient le mot recherché


Pos est un entier
i est un entier
NumCherche est un entier
SupprIndice est un entier
TabRecherche est un tableau de 1000 entier
TableOccu est un entier

//MISE A JOUR DE VOTRE TABLE (DANS LAQUEL VOUS FEREZ LA RECHERCHE)
MajTableTaches


//RECHERCHE DANS LA TABLE DES LIGNES A SUPPRIMER
NumCherche=0
POUR i = 1 A TableTaches..Occurrence
	Pos =Position(Majuscule(TableTaches.Taches[i]),Majuscule(TxtRecherche))
	SI Pos> 0 ALORS
		NumCherche++
		TabRecherche[NumCherche]=i
	FIN
FIN
TableOccu=TableTaches..Occurrence
SupprIndice=0
NumCherche=0

//SUPPRESSION DES LIGNES QUI NE VOUS INTERESSE PAS 
POUR i=1 A TableOccu
	SI i<>(TabRecherche[SupprIndice+1]) ALORS
		TableSupprime(TableTaches,i-NumCherche)
		NumCherche++
	SINON
		SupprIndice++
	FIN
FIN


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (5736 Lectures)
Comment convertir une durée en minute, seconde ?
Ce code a été fourni par DrCharly dans un post, merci à lui.

t1 est une Heure
t2 est une Heure
d1 est une Durée

t1 = HeureSys()
//Traitement
t2 = HeureSys()
d1 = t2 -t1
Info("Durée : " +
d1..Minute+"m"+d1..Seconde+"s"+d1..Milliseconde+"c")


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2114 Lectures)
Cacher et récupérer des enregistrements.
Il peut s'avérer utile de 'cacher' des enregistrements pour effecteur un traitement et les récupérer ensuite.

- Remplir un tableau (dynamique) avec les n° des enregistrement à cacher.
ndim est un entier
tEnr est un tableau de 0 entiers sur 8 octets
ndim=Dimension(tEnr,Dimension(rEnr)+1)
tEnr[ndim]=HNumEnr(FICHIER)


- Utiliser hRaye() pour les enlever des parcours du traitement.

POUR i= 1 A ndim
   HRaye(FICHIER,tEnr[i],hIgnoreIntégrité)
FIN


- Lancer le traitement, les enregistrement rayés ne sont plus lisible

- Récupérer les enregistrements par lecture et modification.
POUR i= 1 A ndim
   HLit(FICHIER,tEnr[i])
   HModifie(FICHIER,tEnr[i],hIgnoreIntégrité)
FIN


Hop : les enregistrements sont à nouveau là : magique !

NB :
- il faut veiller à ne pas quitter le traitement avant récupération des enregistrement ou bien alors se prémunir d'un mécanisme de sauvegarde/ restauration du fichier.
- Il faut aussi veiller à se prémunir d'un réindexation avec compactage du fichier pendant la durée du traitement sous peine de perdre les informations.

A utiliser de préférence avec des fichier temporaires donc.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3396 Lectures)
Afficher les composantes des clés composées
Les clés composées sont désormais disponibles sous forme de chaines via HconstruitValClé() qui simplifie grandement la gestion des clés composées.

Reste que les valeurs sont complétées par hValMin (ou hValMax).
hValMin est le caractère 0 de la table ascii, lequel correspond aussi en C/C++ (language dans lequel est créé WinDev) au caractère de fin de chaine.
Ainsi le code suivant
cCle est une chaine = HConstruiValCle(Fichier,Cle,val1,val2...)
info(cVal)

...ne retourne que la valeur de le première partie de la clé. info interprète le premier cacactère hValMin comme la fin de la chaine.

Pour résoudre ce problème, il faut simplement remplacer les caractère hValMin par des caractères affichables (un expace par exemple), ce qui donne :
cCle est une chaine = HConstruiValCle(Fichier,Cle,val1,val2...)
info(remplace(cVal,hvalmin,' ')


Demandé et répondu par R&B le 27-Sep-2004 12:14 (6021 Lectures)
SQL INSERT : connaître le dernier ID auto. (HF et MySQL)
FAQ aimablement soumise par KPiTN :

Récupérer le dernier identifiant inséré

BDD Hyperfile :
ReqNav est une source de donnée
HExécuteRequêteSQL(ReqNav,'Insert Into Navires (LibNavire) Values (' + TxtNavire + ')')
DernierIdentifiant=ReqNav.idnavire


BDD Mysql :
ReqNav est une source de donnée
HExécuteRequêteSQL(ReqNav,'ConnectSQL',hRequêteSansCorrection,'insert into navires (libnavire) values ('' + TxtNavire+ '')')
HExécuteRequêteSQL(ReqNav,'ConnectSQL',hRequêteSansCorrection,Minuscule('SELECT LAST_INSERT_ID() as idnavire'))
HLitPremier(ReqNav)
DernierIdentifiant=ReqNav.idnavire


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (3050 Lectures)
Pourquoi une concaténation dans une requête SQL ne fonctionne pas?
Voici le morceau de code qui ne fonctionne pas :

...RIGHT(OPERATION.DATE,2)+"/"+MID(OPERATION.DATE,5,2)+"/"+MID(OPERATION.DATE,3,2) AS DATEAFF...


La solution est donnée par DrCharly, la voici :

...RIGHT(OPERATION.DATE,2)+'/'+MID(OPERATION.DATE,5,2)+'/'+MID(OPERATION.DATE,3,2) AS DATEAFF...


Dans le code de la requête, il suffit de ne pas mettre de guillemets ("), mais tout simplement les remplacer par des quotes simples (').


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