dBase pour tous !
Informations
sur des points qui vous gâchent la vie
"Bouts" de
programmes

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.

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

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)

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 |
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)

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)

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)

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)

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)

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)

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 quune 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 cest 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 lutilisateur 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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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.
|