Accueil > FAQ | FAQ |
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.
Voici la liste des principales catégories et de leurs sous-catégories. Choisissez une catégorie pour voir les Q&R.
Ici, la liste des dernières Q&R publiées.
Demandé et répondu par Ramses le 27-May-2005 10:49 (3304 Lectures)
Comment détecter un IDLE sous Windev
Ce thread permet de gérer un IDLE sous Windev
Attention: Windows 2000 & Up
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 (4132 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 (6317 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 :
---------------------------
Application B :
Code en C++ :
Code en Windev :
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 (6671 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
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
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 (6405 Lectures)
Message d'attente pendant un traitement long ..Comment faire ?
Comment remplir une table avec un Thread ?
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
Code de la procédure RempliTable
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 (5508 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.
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 (3682 Lectures)
Comment ajouter un guillement dans une chaine ?
Plusieurs manière sont disponibles :
- la première est de doubler chaque guillement comme suit :
- la seconde est d'insérer le caractère ascii correspondant
- 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 (5710 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)
Exemple d'utilisation :
donne un résultat comme suit :
Citation :
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 (4289 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 :
Remarque :
A savoir que le 'NumeroOrdre' commence à 1.
Vous pouvez connaître le nombre d'options d'un interrupteur en effectuant :
Voilà.
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 (4486 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! ;))
Kristian Paradis
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 (4572 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)
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 (8091 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 :
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
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 (4868 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 (4331 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 (3391 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
Merci DrCharly93
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 (4622 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 :
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
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 (5341 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
'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 (4254 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.
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 (5439 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é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.
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 (2515 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
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