Accueil > FAQ > WinDev Fenêtres FAQ
 Résumé de la catégorie
Voici les informations en lien avec cette catégorie.
Catégorie Q&R Dernières Q&R publiées
 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&#...

 
Demandé et répondu par R&B le 05-Nov-2004 12:00 (4879 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 27-Sep-2004 12:14 (2949 Lectures)
Onglets, ordre de navigation et touche Entrée
Dans une fenêtre de type fiche où tous les champs ne sont pas répartis dans les onglet, la navigation (au clavier par tab ou entrée) entre les champs qui ne sont pas dans l'onglet et ceux qui y sont pose des problèmes avec l navigation via la touche entrée.
La anvigation via la touche entrée est obtenue en n'ayant aucun bouton de type validation dans la fenêtre.
Si on positionne les champs hors onglet avant ceux de l'onglet, la navigation dans l'onglet n'est pas obtenue. On passe directement de l'onglet aux boutons (derniers dans l'ordres de navigation).

La solution est trés simple :
quand on arrive dans l'onglet on doit simuler l'appuis sur la touche tab qui va passer le curseur au premier champ de l'onglet !

Ajouter le code suivant dans le code de prise de focus de l'onglet :

 EnvoieTouche('{TAB}',Handle(MoiMême..Nom))


Demandé et répondu par R&B le 27-Sep-2004 12:14 (5349 Lectures)
Répertoires dans un treeview
Astuce de la part de Philippe RAMIN, Amélioration de l'idée de Laurent LOISELEUX. Code original sur le site de l'asso.

//Déclarations globales :
gEnroule est un entier
gImage1 est une chaîne=fRépertoireTemp()+'Image1.bmp' // Image d'une
disquette
gImage2 est une chaîne=fRépertoireTemp()+'Image2.bmp' // Image d'un disque
dur
gImage3 est une chaîne=fRépertoireTemp()+'Image3.bmp' // Image d'un CD
gImage4 est une chaîne=fRépertoireTemp()+'Image4.bmp' // Image du Répertoire
enroulé
gImage5 est une chaîne=fRépertoireTemp()+'Image5.bmp' // Image du Répertoire
déroulé

//Vous mettez ce que vous voulez dans les images moi j'ai créé 5 champs images
invisibles (Image1-->5) contenant le code init suivant :

Dc est un entier=dDébutDessin(MoiMême)
hIcon est un entier=0
API('SHELL32','ExtractIconExA','Shell32.dll',6,&hIcon,Null,1)
SI hIcon>1 ALORS
SI API('USER32','DrawIcon',Dc,1,1,hIcon)=0 ALORS
Erreur(ErreurInfo())
FIN
API('USER32','DestroyIcon',hIcon)
FIN
dSauveImageBMP(MoiMême,fRépertoireTemp()+MoiMême..Nom+'.bmp')

//( Dans l'ordre des images : Index=6, 8, 40, 3 et 4 (correspond à l'index de
l'icone dans le Shell32.dll) )

//Créer le treeview <MyLittleTree> bien sur...

//----------------------------------------------------------------------------
-------------
//Initialisation du treeview avec la liste des disques

//Attention :
Si vous utilisez la même méthode que moi pour les images il faut s'assurer
mettre le code suivant dans l'initialisation de la fenêtre (question de DC),
sinon vous pouvez le mettre dans l'init du treeview avec des images en dur :

TheString est une chaîne=NetListeDisque(-1)
cCpt est un entier=1
OneString est une chaîne=ExtraitChaîne(TheString,cCpt,RC)
FichierTemp est une chaîne=''
BOUCLE
   SELON SansEspace(ExtraitChaîne(OneString,2,TAB))
   CAS 'FD':
      ArbreAjoute(MyLittleTree,ExtraitChaîne(OneString,1,TAB)+':',gImage1,gImage1)
   CAS 'HD':
      ArbreAjoute(MyLittleTree,ExtraitChaîne(OneString,1,TAB)+':',gImage2,gImage2)
   CAS 'CD':
      ArbreAjoute(MyLittleTree,ExtraitChaîne(OneString,1,TAB)+':',gImage3,gImage3)
   FIN
   cCpt++
   OneString=ExtraitChaîne(TheString,cCpt,RC)
   SI OneString~='' ALORS
      SORTIR
   FIN
FIN


//----------------------------------------------------------------------------
-------------
//Code d'évènement du treeview

//Au double-clic:
SI gEnroule=aEnroule ALORS
MaSelection est une chaîne=ListeRep(ArbreSelect(MoiMême))
SI PAS MaSelection~='' ALORS
Info('Ma sélection : '+MaSelection)
FIN
FIN

//A l'enroulé/déroulé:
gEnroule=ArbreEtat(MyLittleTree,ArbreSelect(MoiMême))


//----------------------------------------------------------------------------
-------------
//Procédure de LISTEREP utilisée par le double-clic du tree

PROCEDURE ListeRep(xRepertoire)
// Listage de répertoire

cRepertoire est une chaîne=Remplace(xRepertoire,TAB,'')
cString est une chaîne=NetListeRep(cRepertoire+'*.')
cString=ExtraitChaîne(cString,1,RC)
SI cString~='' ALORS
RENVOYER cRepertoire
FIN
cCpt est un entier=1
cOneRep est une chaîne=ExtraitChaîne(cString,cCpt)
cDeroule est un booléen=Faux
TANTQUE cOneRep<>EOT
SI PAS cOneRep~='.' ET PAS cOneRep~='..' ALORS
ArbreAjoute(MyLittleTree,xRepertoire+TAB+cOneRep,gImage4,gImage5)
cDeroule=Vrai
FIN
cCpt++
cOneRep=ExtraitChaîne(cString,cCpt)
FIN
ArbreDéroule(MyLittleTree,xRepertoire)
SI cDeroule ALORS
RENVOYER ''
SINON
RENVOYER cRepertoire
FIN



//----------------------------------------------------------------------------
-------------
//Destruction (fermeture de la fenêtre)

// En option : Le nettoyage peut être fait avant mais pas dans le même
traitement que dDébutDessin...
dFinDessin(Image1)
dFinDessin(Image2)
dFinDessin(Image3)
dFinDessin(Image4)
dFinDessin(Image5)

// En option : supprime les bmp dynamiques
fSupprime(gImage1)
fSupprime(gImage2)
fSupprime(gImage3)
fSupprime(gImage4)
fSupprime(gImage5)


Demandé et répondu par R&B le 27-Sep-2004 12:14 (2589 Lectures)
Info/Erreur/Ouinon personnalisées
Posté à P. Burton sur ozdev.net et traduit ici bas, cette astuce ne vaut que pour wd7.5 :

Aller dans ProjetDescription du projet/Onglet Style
Cocher la dernière case : 'Appliquer le thème de gabarit sur les fenêtre d'information système...'
Voila
Une fenêtre est créée 'WindevMessageBox', lui appliquer le style que l'on veux. Mais NE PAS modifier le reste (codes icones...).
Maintenant elle sera appelée à chaque appel de Info() ou Erreur().


Merci Peter


Demandé et répondu par R&B le 27-Sep-2004 12:14 (4675 Lectures)
Supprimer un champ créé avec ChampClone()
ChampClone permet de créer une copie de champs existant dans une fenêtre.

L'inverse est possible par l'API
AppelDLL32('user32','DestroyWindow',handle(cNomChamp))


Limites (résolue avec WinDev 8 et ChampSupprime) :
- Pour les champs composés (tables, onglets...) cela ne marche pas ! il faudrait disposer du handle du composant (colonne, volet) et tester.
- Impossible de réutiliser un champ cloné puis supprimé. Si l'API supprime le contrôle dans la fenêtre, le contexte fenêtre de WinDev n'est pas rafraîchit (le champ existe encore).


Demandé et répondu par R&B le 27-Sep-2004 12:14 (3779 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 (3747 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 (5816 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 (4453 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 (3768 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 (2929 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 (4161 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


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