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 Ramses le 27-May-2005 10:49 (2534 Lectures)
Comment détecter un IDLE sous Windev
Ce thread permet de gérer un IDLE sous Windev

Attention: Windows 2000 & Up

PROCEDURE IdleProc(peMaxMilliSecs=5000, pbRestart=False)

LASTINPUTINFO is structure
	cbSize is unsigned int
	dwTime is int
END

lii is LASTINPUTINFO

lii:cbSize=Dimension(lii)

LOOP
	
	IF NOT API("USER32","GetLastInputInfo", &lii) THEN
		Msg2(__err)
		RETURN
	END
	
	currTicks is int=API("KERNEL32","GetTickCount")

	lastInputTicks is int=lii:dwTime

	idleTicks is int= currTicks - lastInputTicks;
	
	Trace("Current Tick="+currTicks+" | Last Input Tick="+lastInputTicks+" | Difference="+idleTicks)
	
	IF idleTicks>=peMaxMilliSecs THEN
		Info("Yo I'm In IDLE Mode !")
		IF NOT pbRestart THEN
			BREAK
		END
	END
	
	API("KERNEL32","Sleep",1000)
	
END


Demandé et répondu par R&B le 04-Feb-2005 12:06 (3499 Lectures)
Comment récupérer la position du curseur en coordonnées X/Y par rapport au champ ?
Voici le code permettant de répérer les coordonées X/Y par rapport à un champ texte à l'emplacement du curseur et non pas de la souris.

Res est un entier
hwd est un entier = handle(SaisieTexte)
PosDepart est un entier = SaisieTexte..Curseur
Res = API("USER32","SendMessageA", hwd,214, PosDepart, 0)
trace("X = " + PoidsFaible(Res) + " - Y = " + PoidsFort(Res) )


Demandé et répondu par KPiTN le 03-Feb-2005 15:39 (5512 Lectures)
Appeler une fonction d'une application windev à partir d'une autre application
Comment faire pour faire pour appeler une fonction d'une application windev à partir d'une autre application?

Application A = Application que l'on veut appeler.
Application B = Application qui va donner l'ordre.

---------------------------
Application A :
//Code d'initialisation de la fenetre ou sera stocké la fonction que l'on veut appeler
Evénement("maprocedure","*.*",0x0400)   //0x0400 correspond a une constante windows, la liste des contantes se trouvant dans le fichier WINCONST.WL dans windev

//Code la procedure appelée
PROCEDURE arf(Mess,wParam, lParam) //wParam et lParam sont la si on veux passer des paramètres
FenEtat(MaFenetre,DessusTout)
info("OK")



---------------------------
Application B :
Code en C++ :
HWND hWindow = 0;	
hWindow = FindWindow(NULL, "TITRE DE LA FENETRE A APPELLER");
PostMessage(hWindow,WM_USER,0,0);   //ici j'ai mis 0 et 0 car je ne passe pas de paramètre


Code en Windev :
HandTemp est un entier
HandTemp=AppelDLL32("USER32.DLL","FindWindowA",Null,"Sauvegarde des mails")
SendMessage(HandTemp,0x0400,1,2)


Demandé et répondu par Drcharly93 le 13-Dec-2004 21:20 (5675 Lectures)
Comment détecter un clic sur une colonne d'une table ?
Créer un Evenement
Créer un Evenement() sur la table voulue avec le N° de message 1529
Evenement('Nom de la procédure','Nom de la table', 1529)

Créer la procédure
Dans cette exemple de code le nom des deux colonne de la table se nomment _COL1 et _COL2
Le tri est effectué ascendant sur _COL2 et descendant sur _COL1
Procédure 'Nom de la procedure' (pMessage,wParam,lParam)
//wParam contient le numéro de la colonne cliquée
SI .wParam = <N° de la colonne de la table> ALORS
    // cette affectation permet de ne pas activer le tri par défaut 
    _eve.Retour = 0
    TableTri("_COL2"+TAB+"-_COL1")
FIN


Demandé et répondu par Drcharly93 le 13-Dec-2004 18:08 (5718 Lectures)
Message d'attente pendant un traitement long ..Comment faire ?
Comment remplir une table avec un Thread ?
utiliser un simple Thread dans lequel vous effectuez une boucle sur vos données
Exemple avec une Source de Donnéées nommé Rs
La procédure appelée par le Thread : RemplieTable
Exécution du Thread
ThreadExécute("MonThread",threadNormal,"RemplieTable")
ThreadAttend("MonThread")

Code de la procédure RempliTable
PROCEDURE RemplieTable()
Sql est une Chaine = "SELECT ......."
Rs est une source de donnees

TableSupprimeTout(<MaTable>)
SI PAS HExecuteRequeteSql(Rs,HRequeteDefaut,Sql) Alors
  Retour
Fin
HLitPremier(Rs)
TANTQUE Pas HEndehors(Rs)
  TableAjoute(<MaTable>,HRécupèreEnregistrement(Rs)
  HLitSuivant(Rs)
FIN


Demandé et répondu par R&B le 05-Nov-2004 12:00 (4819 Lectures)
Dans un superchamp, mes sous-champs ne sont pas disponible en saisie alors qu'ils sont actifs et visibles, comment faire ?
Les superchamps champs WinDev ne se comportent pas comme des conteneurs de leurs sous champs. En effet, on 'associe' en fait des champs entre eux.

Si on affecte un SuperChamp à un plan, il faut penser à y associer ses sous champs, sous peine de voir les éléments sans pouvoir y saisir quoi que ce soit.

une parade consiste à le faire par programmation à l'initialisation du superchamp.
// dans une boucle d'énuméraiton des sous champs :
MonSousChamp..plan = moimeme..Plan


Demandé et répondu par R&B le 13-Oct-2004 14:10 (3123 Lectures)
Comment ajouter un guillement dans une chaine ?
Plusieurs manière sont disponibles :
- la première est de doubler chaque guillement comme suit :
info("hello ""word""")

- la seconde est d'insérer le caractère ascii correspondant
info("hello "+caract(34)+"word"+caract(34))


Demandé et répondu par R&B le 05-Oct-2004 15:47 (5134 Lectures)
Comment connaitre le nom d'une option de menu à partir de son identifiant
L'énumération des élements apparue avec WinDev 7 permet bien des choses...

Dans le cas présent une procédure pour connaitre le nom d'une option de menu à partir de son identifiant (pratique pour en constituer une liste)

// Retourne le nom d'une option de menu à partir de son N° ID
PROCEDURE MenuNom(sParent,nNumOption, nNiveau=0)
// L'appel est du type :
//	MenuNom(NomFenêtre,NumOption)
//		NomFenêtre	= Nom de la fenêtre contenant le menu à parcourir
//		NumOption	= Numéro de l'option recherchée
sRetour est une chaîne		// nom de l'option ayant pour ID nNumOption
// énumération des options de menu
sOption est une chaîne=EnumèreSousElément(sParent,enumPremier+enumMenuPrincipal)

// il ne faut pas mettre le nom du menu
SI nNiveau=0 ET sOption<>"" ALORS
	sRetour=MenuNom(sParent+"."+sOption,nNumOption,nNiveau+1)
FIN
TANTQUE sOption<>"" ET sRetour=""
	// nom complet de l'option de menu
	sNomComplet est une chaîne=sParent+"."+sOption
	SI {sNomComplet}..Valeur=nNumOption ALORS
		sRetour=sNomComplet
	SINON
		// remplit les options du niveau supérieur
		sRetour=MenuNom(sParent+"."+sOption,nNumOption,nNiveau+1)
	FIN
	// option suivante
	sOption=EnumèreSousElément(sParent)
FIN
RENVOYER sRetour


Exemple d'utilisation :
// copie la liste des options du menu dans le presse papier (pour excel)
i est un entier
ss,sm,sf sont des chaines
sf = FenEnExécution()
Sablier
POUR i=1 A 200
	Jauge(i,200)
	ss+=i+TAB+MenuNom(sf,i)+RC
FIN
Jauge
VersPressePapier(ss)

donne un résultat comme suit :
Citation :
1 Menu._Menu.Fichier
2 Menu._Menu.Fichier.Config
3 Menu._Menu.Fichier.Quitter
4 ...


Demandé et répondu par Thernius le 28-Sep-2004 11:19 (3664 Lectures)
Comment changer le libellé d'option d'un interrupteur ?
Lorsque l'on parcourt les propriétés associées à ce type de champ, on ne trouve pas la propriété Option, quant à l'option libellé, elle correspond en fait au libellé du groupe d'option (qu'il y ait une ou plusieurs options).

Après ce petit état des lieux, voici la solution :

<InterrupteurNom>[NumeroOrdre]..libellé = <LaChaineQueVousSouhaitez>


Remarque :
A savoir que le 'NumeroOrdre' commence à 1.
Vous pouvez connaître le nombre d'options d'un interrupteur en effectuant :

eOptionsNombre est un entier = 0
eOptionsNombre = <InterrupteurNom>..Occurence


Voilà.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3719 Lectures)
Calculer le CRC 16 utilisé dans le protocole XModem
Extrait d'un post de Kristian Paradis sur le forum de daussy.org :

J'avais demandé il y a peu de l'aide pour calculer le CRC 16 utilisé dans le protocole XModem.

J'ai finalement été capable d'adapter un algorithme de C++ que j'ai trouvé alors voila, si quelqu'un d'autre en a besoin.

(Ou si vous trouvez une faille, vous pouvez m'en faire part! ;))


Procédure mCalculerCRC(_Chaine)

//Renvoie une chaine sur 2 octets.

eBit est un entier
eOctet est un entier

eCaract est un entier sans signe
eCRC est un entier sans signe

cChaine est une chaine = _Chaine

pour eOctet = 1 a taille(cChaine)

eCaract = asc(cChaine[[eOctet]])*0x100

eCRC = ouexbinaire(eCRC,eCaract)

pour eBit = 0 a 7

si etbinaire(eCRC,0x8000) <> 0 alors
eCRC = eCRC * 2
eCRC = ouexbinaire(eCRC,0x1021)
sinon
eCRC = eCRC * 2
FIN

fin

eCRC = etbinaire(eCrC,0xFFFF)

FIN

renvoyer caract(partieentiere(eCrC/256)) + caract(modulo(eCrc,256))


Kristian Paradis


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (3674 Lectures)
Comment savoir si une fenêtre est Ouverte ou Fermée ?
Pour savoir si une fenêtre est 'Ouverte (en exécution)' ou 'Fermée', il suffit d'utiliser la fonction de gestion des fenêtres FenEtat.

Exemple :
// Connaître l'état de la fenêtre 'fen2200'
Etat_fen2200 = FenEtat(fen2200)
SI Etat_fen2200 = inexistant ALORS
Traitement...
FIN

Les principales valeurs possibles renvoyées par FenEtat sont :
- Actif (la fenêtre est ouverte et possède le focus)
- AffichageSeulement (la fenêtre est ouverte mais ne possède pas le focus)
- Inexistant (la fenêtre n'existe pas ou n'est pas ouverte)
- Invisible (la fenêtre ne possède pas le focus et est invisible à l'écran)


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (5715 Lectures)
Comment afficher un document PDF dans une fenêtre ?
Il suffit pour cela de créer une fenêtre contenant un champ HTML, auquel on associera le chemin du fichier PDF, plutôt qu'une URL.

Voici un morceau de code pour vous aiguiller :

// MonIE est le nom du champs HTML
MonIE..Valeur = <chemin complet du fichier PDF>


Voilà à l'ouverture de la fenêtre le fichier PDF est chargé dans la fenêtre. Attention toutefois, il est impératif que le client Acrobat Reader soit présent sur la machine qui devra afficher le fichier PDF.

Code fournit par DrCharly93


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (4422 Lectures)
Comment donner le focus à un champ particulier ?
A l'ouverture d'une fenêtre, dans le but d'éviter un clic de souris, il peut être intéressant de donner le focus à un champ (de saisie ou autre) directement. Pour cela, il suffit d'utiliser le code suivant :

EcranPremier(<champQuiDoitPrendreLeFocus>)


Demandé et répondu par Thernius le 27-Sep-2004 12:14 (3726 Lectures)
Comment donner le focus à une ligne d'une table lors d'un clic droit
Il suffit de placer le code suivant dans l'évènement 'Clic sur bouton droit' de votre table :

nligne est un entier
nCol est un entier
ResInfo est une chaîne
x est un entier
y est un entier
// sélection sur la table <NomDeVotreTable>
x = PoidsFaible(CurseurPos())
y = PoidsFort(CurseurPos())
nligne = TableInfoXY(<NomDeVotreTable>, tiNumLigne + tiOrigineEcran, x, y)
nCol = TableInfoXY(<NomDeVotreTable>, tiNumColonne + tiOrigineEcran, x, y)
TableSelectPlus(<NomDeVotreTable>,nligne)


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2902 Lectures)
Tables fichier et requêtes paramétrables
Si vous avez créé une requete via le générateur de requete Avec une condition passée par paramètre il est nécessaire d'effectuer les opération suivantes:
A l'endroit ou vous voulez remplir la table

MonCode est un variant =<Ma Valeur>
MaRequete est une chaine = <Nom de ma Requete>
MaTableFichier est une chaine = <Nom de ma Table fichier>
SI PAS HExecuteRequete(MaRequete,HRequeteDefaut,MonCode) ALORS
   ERREUR(HErreurInfo())
   RETOUR
FIN
{MaTableFichier}..FichierParcouru = MaRequete


Merci DrCharly93


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4119 Lectures)
Affichage des ActiveX
La plupart des ActiveX se réaffichent mal dans Windev, si la fenêtre est bougée, redimensionnée, ou passe simplement en arrière-plan.

D'après ce que j'ai pu constater en analysant les messages avec Spy32++, il s'agit du message WM_PAINT que Windev ne retransmet pas aux champs ActiveX, et ceux-ci ne peuvent donc pas se réafficher lorsque nécessaire.
Le problème disparaît en plaçant la ligne de code :
AppelDLL32("user32", "UpdateWindow" , Handle("ChampActiveX"))

dans les événements de la fenêtre :
- Prise de focus
- Perte de focus
- Modification de la taille
- A chaque modification

En fait la fonction UpdateWindow() envoie à l'ActiveX le message
WM_PAINT que Windev oublie de transmettre...

Michel Fages


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3717 Lectures)
Identificateur xxx inconnu ou inaccessible ici...
Lors de l'ouverture d'un projet ou de la recomposition du graphe, WinDev peut retourner le message suivant :
'Identificateur X inconnu ou inaccessible ici: pour accéder à un élément hors portée, utilisez une déclaration externe ....'

En fait cette erreur est due au fait qu'il a détecté un appel à un élément qui ne figure pas dans la liste des éléments du projet (fenêtre, classe...)
Ce peut être du au fait qu'un collaborateur a ajouté cet élément au projet dans le cas d'un développement en groupe.

Pour résoudre cela il faut noter le nom de l'élément X et l'ajouter au projet : Projet > liste des composants du projet > Ajouter


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3710 Lectures)
Icone personnalisée dans les barres de titre
Plutôt que de passer sur toutes vos fenêtres et dans le détail, indiquer votre icone de projet en remplacement le l'icone par défaut (le fameux WD), voici donc comment faire :

1- Lors du développement, laissez cet information vide.
2- Assistant compilation : après le nom de l'executable, indiquer l'icone de votre projet.

C'est tout, cet icone sert lors de la création des raccourcis mais aussi dans les barres de titre de vos fenêtres.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4599 Lectures)
Connaitre le répertoire des données en installation réseau
Générallement le répertoire d'éxécution sert aussi de répertoire pour les données. Reste qu'en installation réseau, ce répertoire des données n'est pas celui de fRepEnCours(). Il faut donc retrouver ce répertoire par programmation.

Dans l'initialisation du projet, on va utiliser tout simplement le chemin d'un des fichiers de la base.
Cette possibilité est disponible avant même le lancement de la création de fichiers physiques.
gcRepDonnées est une chaine=Monfichier..répertoire
...
hCreationSiInexistant('*')
...

gcRepDonnée contient alors le chemin du répertoire des données sur le serveur de fichier... La globale peut être utilisée en lieu est place de fRepEnCours() pour localiser les fichiers de données.

Noter que ce fonctionnement est aussi valide pour les projet installé normalement.


Demandé et répondu par R&B le 27-Sep-2004 12:14 (1986 Lectures)
WinDev et les cartes SoundBlaster
Merci à KPiTN pour l'information.

Le driver pour la carte son Creative Sound Blaster live! 5.1 Digital fait
planter absolument tous les programmes executables générés avec WinDev 7.5.

La cause du problème est un programme nommé CTHELPER.EXE
Il Suffit de le supprimer de la base de registre.

Démarrer->exécuter -> regedit
Chercher dans :
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun
Une clé appelé : CTHELPER
Supprimer la clé et redémarrer


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