Aide
Accueil Téléchargements Aide Documentation Contact Recherche Plan du site

 

Liste de codes erreurs
Les dates
Pas à pas - A propos.wfm
Pas à pas Le formulaire
dUflp
Newsgroups

dBase pour tous !

 

Informations sur des points qui vous gâchent la vie

   

Les index

Ce répertoire existe-t-il ?

Combobox : le code ne s'éxécute pas dès l'ouverture

Icônes : celles du bouton poussoir sont moches pour les menus

L'option "Build" ne s'affiche pas dans ma barre de menu

J'ai des soucis avec Inno Setup et ScripMaker

J'ai un message d'erreur

Je ne sais pas comment faire un formulaire

Supprimer le lancement de la fenêtre dQuery au démarrage de dBase

Au démarrage de dBase, j'ai un message d'erreur avec des fichiers non trouvés

J'ai changé de machine, de version de windows et je n'arrive plus à faire fonctionner dBase (Dep)

Utilisation de tables dBase d'un niveau inférieur

Tester une éventuelle configuration 64 bits

Y-a-t-il des problèmes de corruption de fichier avec les champs mémos ?

Savoir ce que contient un fichier index MDX

Traquer les erreurs avec PLUSErr.log

S'y retrouver entre le nom de l'imprimante et le nom du driver d'imprimante

La limitation à 2 GB de chaque fichier dbf est-elle maintenue ? (août 2014)

 

"Bouts" de programmes


Ouvre_Url : ouvre un navigateur Web et affiche la page choisie. Pratique par l'exemple pour créer simplement un système d'aide,

Sélection de l'imprimante Windows par défault

Eviter qu'un programme ne se lance plusieurs fois

Combien de fois un programme a-t-il été lancé ?

Les fonctions DMY() et DOW() en français

La conversion d'un nombre en lettres

Vérifie la syntaxe d'une adresse email

Passage de données entre deux formulaires

Passage d'une valeur d'un formulaire à un autre

Convertir un fichier dBase III

Connaitre, modifier l'état des touches Majuscules, numérique, défilement.

La connexion Internet est-elle établie

Lancer un programme à l'ouverture de dbase

 

 

Plus2_5-Icon.jpg (1250 octets) Sélection de l'imprimante Windows par défault


La fonction CHOOSEPRINTER() de dBASE permet de modifier l'imprimante utilisée lors d'une édition. Si cette fonction donne toute satisfaction lorsque l'on travaille uniquement avec dBASE, cela peut être pénalisant si l'on pilote avec dBASE d'autres programmes, comme Word par exemple.

En effet, dans ce cas, l'imprimante sélectionnée doit être perçue comme l'imprimante par défault de Windows.

Un petit programme va vous aider à faire cette modification.

Vous pouvez le télécharger ici. La version anglaise se situe ici

ImprimanteDefault.gif (22552 octets)

 

Voir aussi la page sur la différence entre nom de l'imprimante et du driver.

(Retour haut de la page)

vdb5.gif (351 octets)  Plus2_5-Icon.jpg (1250 octets) Vérifie la syntaxe d'une adresse email

 

Quelques lignes pour la vérification de la syntaxe d'une adresse email. Utilise ce que l'on appelle les expressions régulières.

Un article (en anglais) du dBulletin traite le sujet des expressions régulières et le dBL.

Attention, seule la syntaxe de l'adresse est vérifiée, pas l'existence de la boite mail. Pour ce dernier point il faut interroger le serveur de mail pour savoir si la boite existe ou non.

Ce code a pour but premier d'être inséré pour vérifier que la saisie de l'adresse email semble correcte au sens du protocole Mail Internet

 

 

cMonEmail = 'dbase@free.fr'

//cMonEmail = 'dbase@fr_ee.fr'

LOCAL oRegExp

oRegExp = new OleAutoClient("VBScript.RegExp")

oRegExp.IgnoreCase = .T.

oRegExp.Pattern = '^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$'

iif( oRegExp.Test(cMonEmail), ;

msgbox("Adresse valide", cMonEmail,0+64), ;

msgbox("Adresse non valide", cMonEmail,0+48) )

RELEASE OBJECT oRegExp   // detruit l'objet

oRegExp = null           // efface la variable

return

Télécharger le code

 

Pour aller plus loin dans la vérification, vous pouvez utiliser EmailAdress.cc (dans dUFLP)  qui vérifie plus d'informations lors de la validation.

 

 

(Retour haut de la page)

vdb5.gif (351 octets)    Eviter que le programme ne se lance plusieurs fois -

 

          (ci-dessous pour les versions à partir de VdB7.0 )

Lorsqu'un exécutable est crée, on peut souhaiter que l'utilisateur ne l'exécute qu'une seule fois.

Ce code est à mettre dans l'entête du programme pour éviter plusieurs instances

On suppose que l'application dont l'on veut contrôler le nombre d'instances s'appelle MonApplication.exe

auteur : Romain Strieff [dBVIPS]


Extern cHandle GetModuleHandle(cString) Kernel

Extern cInt GetModuleUsage(cHandle) Kernel

If GetModuleUsage(GetModuleHandle("MonApplication.exe")) > 1

   MsgBox("Cette application est déjà en service. Utiliser la barre de tâches.", ;

   "Attention, Fonctionnement en double", 16)

Quit

Endif

 

Plus2_5-Icon.jpg (1250 octets) A partir des versions 7.0 et suivantes  (32 bits)

 

La solution précédente n'est pas valable pour les versions 32 bits. Une solution simple est de regarder s'il existe déjà une fenêtre portant le nom de l'application. Source : dUflp miscapi.prg. Attention, cette version peut rencontrer des difficultés avec des caractères accentués ou spéciaux.  Toute fenêtre windows peut être testée.

 

function FenetreExiste(cNomBarreDeTitre)

/* Cette fonction utilise le nom de la barre de titre

Eviter les caractères accentués et spéciaux

Cette fonction n'est pas sensible à la casse

? FenetreExiste("dbase plus")  // true

? FenetreExiste("DBasE plUs") // true

*/

local nWinHandle

if type("FindWindow") # "FP"

   extern CHANDLE FindWindow(CSTRING,CSTRING) user32 from "FindWindowA"

endif

nWinHandle = FindWindow(0,cNomBarreDeTitre)

return (nWinHandle > 0)  // renvoie true si la fenêtre existe

 

 

Les autres options possibles avec ce code et la fonction API findwindows()

 

Dans le dUflp vous pouvez aussi consulter la fonction appflag dans appflag.cc

(Retour haut de la page)

 

 

Plus2_5-Icon.jpg (1250 octets) Combien de fois un programme a-t-il été lancé ?

 

Cette fonction permet de connaître combien de fois est chargé un programme. Elle offre l'avantage d'utiliser le nom de l'exe et non celui du titre de sa fenêtre. Mise à disposition par Bernard Mouille.



(Retour haut de la page)

vdb5.gif (351 octets) Plus2_5-Icon.jpg (1250 octets) Les index

 

Lorsque l'on commence a créer une table en dBase, la mise en place des index est quasiment « magique ». Ce sera aussi la source de nombreux problèmes si vous ne vous souvenez pas de ceci :

dBase apprécie guère des espaces dans un champ qui est indexé. Alors lorsque vous construisez un index, pensez à ce qu'il ne comprenne bien que des caractères alphanumériques et pas d'espaces

La difficulté se présente en indexant des éléments de longueur variable (un nom de famille par exemple).

L'idéal est donc de créer des index dont la longueur est fixe et sans espaces. Voir l'instruction INDEX


(Retour haut de la page)

Plus2_5-Icon.jpg (1250 octets) Les fonctions DMY() et DOW()


Lorsque dBase n'a plus bénéficié de version française, les fonctions DMY() et DOW() ont retourné les termes anglais pour les jours et le mois. Si Fernand Raynaud avait popularisé "Sunday" pour les français, dimanche reste préférable...

 

Aussi une fonction, nommée DMY_FR() peut être ajoutée aux programmes pour refrançiser cette fonction. Le code, facilement modifiable par un débutant, est dans un formulaire de démonstration. Il est téléchargeable ici.

 

Cette fonction est facilement adaptable sous Visual Dbase au cas où vous n'utiliseriez pas une version française de VDbase.

 

(Retour haut de la page)

 

Plus2_5-Icon.jpg (1250 octets) La conversion de nombres en lettres


Le français comporte un certain nombre de particularité pour lécriture des nombres en lettres, comme mille invariable alors que millions ne l'est pas, cent qui n'a de S que s'il s'agit d'un multiple deux cents, mais deux cent trois. Le petit utilitaire NombreEnMots.cc vous facilitera le travail. Il fonctionne jusqu'à 2 999 999 999 999 999 999 quand pour la même fonction word s'arrête à 999 999.

Deux petits formulaires sont donnés avec pour montrer l'utilisation. Le code, facilement modifiable par un débutant, est téléchargeable ici.

 

(Retour haut de la page)

 

vdb5.gif (351 octets)   Plus2_5-Icon.jpg (1250 octets) Les icônes de Resource.dll pour les boutons poussoirs sont moins bien dans les menus


Les icônes des boutons-poussoirs contenues dans le fichier resource.dll possèdent un fond pourpre qui permet de gérer la transparence du fond. Si l'on utilise cette même icône dans un menu, le fond pourpre apparaît, réduisant la portée de l'icône. Seule solution ; utiliser une autre source.

Source : newsgroup dbase.programming 21/08/2009 - Exemple

 

Remarque : il est possible de créer simplement des icônes à l'aide de logiciels de traitement d'image. Photofiltre par exemple.

 

(Retour haut de la page)

Plus2_5-Icon.jpg (1250 octets) Combobox dont le code ne s'exécute pas à l'ouverture

 

From: "Mervyn Bick"
Newsgroups: dbase.getting-started
Sent: Friday,August 07, 2009 11:33 PM
Subject: Re: combobox

 On Fri, 07 Aug 2009 23:11:17 0200, Emeka ossai a écrit:

> J'ai un combobox qui comporte un code, lorsque je clique sur lui, il affiche le Nom équivalent. Lorsque je clique sur le premier code, il n'affiche pas le Nom équivalent, jusqu'à ce que je clique sur le second code et que je revienne cliquer sur le Premier code. S'agit-il d'un bug ? Ca ne se passe pas avec dbase 5.7

Réponse :


Peut-être pas tant un bug qu’une lacune. Le combobox en dBase Plus ne dispose pas d'un événement onClick (mais ce n'est peut-être pas vrai pour la dernière version de dBase, mais c’est vrai pour la v2.6.0.1 que je suis en train d'utiliser), et ainsi l’évènement onChange est généralement utilisé pour déclencher des actions.

Le problème est que le premier élément de la liste est sélectionné lorsque la liste déroulante s'ouvre. En cliquant sur lui on ne cause pas un changement dans les éléments sélectionnés de sorte que l’événement onChange ne se déclenche pas. Le passage à la deuxième valeur provoque l'événement onChange.


Il existe plusieurs moyens de contourner cela et tout dépend de ce dont vous avez besoin quand une valeur dans la liste déroulante est sélectionnée. Vous pouvez, par exemple, utiliser l'événement OnOpen pour afficher la recherche du premier élément. Pour les sélections ultérieures l’événement onChange gérera les choses.

Si la liste déroulante est un tableau, vous pouvez faire en sorte que la première valeur soit vide lorsque le formulaire s'ouvre. Lorsque l'utilisateur sélectionne une autre valeur de l’événement, onChange se déclenche. Si vous voulez vraiment vous assurer que l’utilisateur ne peut pas choisir la valeur à blanc, vous pouvez écrire du code dans l'événement onChange pour vérifier et supprimer la valeur vide. Cela ne fera évidemment le travail que la première fois, mais il ne fera pas de dégâts pour les autres sélections.

Mervyn.

 

(Retour haut de la page)

vdb5.gif (351 octets) Plus2_5-Icon.jpg (1250 octets) J'ai un message d'erreur

Une section été ouverte dans ce site pour traiter ce point.

(Retour haut de la page)

 

Ce répertoire existe-t-il ?

 

Plusieurs méthode sont possibles, et cette liste est très loin d'être exhaustive:

 

La plus courte ?

 

? file("C:\LeDossierExiste\nul")


Utilisez le mot nul en tant que fichier dans le dossier que vous voulez tester. Il est reconnu par l'OS à cet effet. Si le répertoire existe la valeur true est renvoyée, sinon, false. (Merci à Bruce Beacham)

 

? file("C:\program files\nul")  // renvoie True

 

Utilisation de la méthode dir() d'un objet tableau

 

cDir = "c:\windows"

? new array().dir( cDir+"\*.", "D" ) > 0     // renvoie True dans cet exemple

 

Une méthode de spécialiste :

cDir = "c:\windows"

? new OleAutoClient("Scripting.FileSystemObject").FolderExists(cDir)


(Retour haut de la page)

 

 

vdb5.gif (351 octets) Ouvre_Url


Un « Pas à Pas » pour utiliser cette fonction dans dBase

Ouvre_Url("http://www.dbase2000.com")

programme issu du forum Vdbase 5

auteur : Romain Strieff [dBVIPS] - 16 novembre 1999

 

exemple d'utilisation

DossierAide sera une chaine de caractère qui contient le dossier où se trouve la page web

exemple : DossierAide = "C:\WEBSHARE\WWWROOT\MonDossier\"

laPage sera une chaîne de caractères qui contient le nom du fichier htm ou html

exemple : laPage = "succes.htm"

 

La fonction peut s'utiliser ainsi :

Ouvre_Url(DossierAide+laPage)

Ouvre_Url(DossierAide+"succes.htm")


le code en dBase

 

************************

Function Ouvre_Url(cURL)

************************

#define SW_SHOWNORMAL 1

#define SW_SHOWMINIMIZED 2

#define SW_SHOWMAXIMIZED 3

#define SW_SHOWNOACTIVATE 4

#if __vdb__ >= 7

   #define WINAPI_A "A"

   #define WINAPI_SHELL "SHELL32"

#else

   #define WINAPI_A ""

   #define WINAPI_SHELL "SHELL"

#endif

if type("ShellExecute") #"FP"

   extern cHandle ShellExecute(cHandle, cstring, cstring, cstring, ;

   cstring, CINT) WINAPI_SHELL ;

   from "ShellExecute"+WINAPI_A

endif

local nHandle

private sd     && macro nécessite une variable de type private

sd = set("dire") && parfois il pourrait changer de dirs, ceci est une précaution

nHandle = ShellExecute(_app.framewin.hwnd,"open",;

cUrl,null,null,SW_SHOWNORMAL)

if sd # set("dire")

   set dire to "&sd."

   endif

return nHandle


(Retour haut de la page)

 

 

Plus2_5-Icon.jpg (1250 octets) Passage de données entre deux formulaires

 

 

Cette question revient souvent dans les forums. Pour vous aider à comprendre, deux exemples.

Le premier formcomm_fr appelle un formulaire permettant de choisir une valeur dans une liste déroulante

Le seconde, fishfields_fr.wfm appelle un formulaire permettant de choisir une valeur dans une table de données

Téléchargement des exemples

 


(Retour haut de la page)

 

 

Plus2_5-Icon.jpg (1250 octets) Passage d'une valeur d'un formulaire à un autre

 

Cas fréquent, on veut passer la valeur d'un champ de saisie à un formulaire que l'on ouvre en appuyant sur un bouton. Ken Mayer a fait une réponse claire dans un forum :

 

Créer une propriété personnalisée dans le formulaire enfant qui contiendra la valeur à passer

 

// installe le nouveau formulaire :
set procedure to MonEnfantForm.wfm // nom de votre formulaire pour le charger

// de nouveau, nom de la classe du formulaire pour créer l'objet

form.EnfantForm = new MonEnfantFormForm()
// créer une propriété personnalisée "ValeurID", avec la valeur de l'objet champ de saisie:

form.EnfantForm.ValeurID = form.ValeurID.value
form.EnfantForm.parent = form // référence au formulaire parent/appelé
                               // ainsi l'on peut s'y référer

// lance le formulaire enfant
form.EnfantForm.mdi := false
form.EnfantForm.readModal()

Ensuite, dans le formulaire enfant on procéde à la vérfifiation que la valeur est bien disponible. Vous faites ceci en surchargeant le code de la propriété readModal (dans le concepteur de formulaire, vous pouvez ajouter ce code dans la boîte de dialogue de propriété)

 

if type( form.ValeurID ) # "U" // non indéfinie, donc cela existe

   // Faire quelque chose ici pour l'utiliser : utiliser pour une recherche dans une table,
   // et affiche une ligne spécifique, ou tout autre chose dont vous avez besoin

else
   // Form.ValeurID n'existe pas, vous devez décider
   // s'il y a une erreur, ou ce que vous voulez ...

endif

 

Date : Tue, 08 Nov 2011 20:58:52 -0800
De : "Ken Mayer [dBVIP]"
Sujet : Re: memory declaraton
Newsgroups: dbase.getting-started



(Retour haut de la page)

 

 

 

Plus2_5-Icon.jpg (1250 octets) Supprimer le lancement de la fenêtre dQuery au démarrage de dBase

 

Si cette fenêtre ne vous convient pas, effectuez la démarcher suiavante.

Sélectionnez  "Properties" dans la barre de menu

Puis "Desktop Properties"

Dans la fenêtre qui s'affiche, sélectionner l'onglet "Applications"

En bas à droite, regardez le cadre "Other"

Déselectionnez l'option "Open dQuery at startup"

Confirmez en cliquant sur Apply puis OK

 

La version 2.62 déselectionne par défaut l'optoin de lancement de dQuery au démarrage

(Retour haut de la page)

 

 

Plus2_5-Icon.jpg (1250 octets) Au démarrage de dBase, j'ai un message d'erreur avec un/des fichiers non trouvés

 

Souvent la solution se trouve en consultant le fichier Plus.ini de dBase. Si vous avez effectuée l'installation par défaut de dBase, le chemin complet est : c:\Program Files\DBASE\PLUS\BIN\PLUS.ini.

Parcourez ce fichier. Si vous pensez avoir trouvé la ligne comportant le fichier en cause :
Faites une sauvegarde de PLUS.ini en PLUS.old par exemple

Retirez la ligne contenant le/les fichiers

Sauvegardez Plus.ini et fermez.

Relancez dBase.

Si vous ne savez pas où se trouve le fichier plus.ini, vous pouvez l'ouvrir en utilisant la fenêtre de commande :

modi comm _dbWinhome + "bin/plus.ini"

From: "Ivar B. Jessen" <nospam@nospam.com>
Newsgroups: dbase.programming
Sent: Friday, August 27, 2010 8:07 PM
Subject: Re: finding dbase .ini

(Retour haut de la page)

 

Plus2_5-Icon.jpg (1250 octets)  La connexion Internet est-elle établie

 

Permet de savoir si l'ordinateur est connecté ou non.

 

Pour cela on va utiliser une ressource de windows :

If type("InternetGetConnectedState")#"FP"

   Extern cLong InternetGetConnectedState(cLong,cLong) "wininet.dll"

endif

result = InternetGetConnectedState(0,0)

 

Un simple formulaire vous en montre le fonctionnement

 

(Retour haut de la page)

 

 dbasedos.gif (376 octets) vdb5.gif (351 octets) Plus2_5-Icon.jpg (1250 octets) Y-a-t-il des problèmes de corruption de fichier avec les champs mémos ?

 

 

http://news.dbase.com/newsgroups.php?art_group=dbase.programming&article_id=10100   - 20 février 2006

> Avez-vous eu des problèmes avec plusieurs champs mémo/binaires dans le même fichier BLOB.
> Un post sur un autre forum a indiqué que ce n'était pas une bonne idée.
> Je n'ai eu que de très rares problèmes avec des champs mémo au fil des ans, mais
> je ne me souviens si j'avais mélangé "binaire" et "MEMO" dans le même BLOB
>

Je suis en désaccord avec les gens qui prétendent qu'il y a un problème. Je n'ai pas entendu parler de corruption d'un champ mémo (ou BLOB) depuis longtemps. Je pense que cela se produisait plus dans le dBASE/DOS et les versions 16-bit. Mais le BDE 32-bit n'a pas
rapporté ce genre de problème depuis longtemps. Cela ne veut pas dire que ça n'arrive jamais, mais c'est beaucoup plus rare ...

Ken

 

(Retour haut de la page)

 

 

 

Plus2_5-Icon.jpg (1250 octets) Lancer un programme au démarrage de dBase

 

Si vous désirez lancer systématiquement un programme, comprenant par exemple des instructions de configuration, à l'ouverture de dBase, il suffit de le préciseer dans le fichier Plus.ini. Si vous avez effectuée l'installation par défaut de dBase, le chemin complet est : c:\Program Files\DBASE\PLUS\BIN\PLUS.ini.

 

Parcourez ce fichier pour rechercher la section [CommandSettings].
Si vous pensez avoir trouvé la section :
Faites une sauvegarde de PLUS.ini en PLUS.old par exemple

Recherchez la section [CommandSettings]
Inscrivez le nom du programme ou formulaire à lancer précédé de la commande : command=do

Sauvegardez Plus.ini et fermez.

Relancez dBase.


[CommandSettings]
command=do <chemin\nom_du_fichier.extension>

     // si vous avez oublié où se trouve le fichier ini, pour l'ouvrir :

modi comm _dbWinhome + "bin/plus.ini"

Sujet : Re: Running a form or program when IDE starts up
Date : Fri, 25 Jan 2013 16:31:04 +0200
Auteur : "WJS"
Distribution : dbase.programming

 

 

(Retour haut de la page)

 

 

 

Plus2_5-Icon.jpg (1250 octets) La limitation à 2 GB des fichiers .dbf perdure-t-elle ?

 

Jusqu'à ce que dBASE ait son propre moteur de base de données, cela est susceptible de rester un problème. Le moteur de la base de données est le BDE (Borland Data Engine) de Borland. Ce qui était trés large à son lancement dans les années 1990 devient une contrainte en 2014.

Il est facile de contourner cette limitation.
Lorsque vous êtes à un moment où vous avez ce problème spécifique, c'est que vous avez au moins un DBF proche de la taille de 2Go. Aujourd'hui, cela ne peut jamais être efficace dans un environnement multi-utilisateurs.
Il "travaille bien" en quelque sorte, mais il sera presque impossible d'assurer la cohérence, l'intégrité transactionnelle, la durabilité, et il sera lent lors de l'utilisation du réseau.

Ce type d'exigence est facile à remplir par le remplacement d'une base de données de DBF par  une base de données Firebird (moteur de serveur local ou distant) sans trop se soucier pour l'optimisation de la vitesse, l'indexation et d'autres réglages fins (comme separér les accès en lecture et écriture, etc).

Il suffit d'installer le moteur de serveur, créer une base de données, utilisez l'une des zillion de "datapumps" disponible (ou de préférence celle qui est livrée avec l'installation complète du BDE), transférez vos données de DBF pour FB et allez-y.

Les fichiers peuvent alors être de 2 Tera-octet sans trop de problèmes.

 

 

 

Source :

Sujet : Re: 2GB file size limit
Date : Wed, 20 Aug 2014 14:21:58 +0200
Auteurs : Lysander et Ken Mayer
Distribution : dbase.cto-wants-to-know

http://news.dbase.com/newsgroups.php?art_group=dbase.cto-wants-to-know&article_id=2496

 

 

 

 

(Retour haut de la page)

 

 

Si vous voyez des erreurs,si vous avez des compléments à apporter,  n'hésitez pas à le signaler.

Dernière modification de cette page lundi 01 septembre 2014 18:50

© M.A.