FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
KGF_dll - nouvelles versions - Page 39 Emptypar papydall Hier à 16:57

» PANORAMIC V 1
KGF_dll - nouvelles versions - Page 39 Emptypar papydall Hier à 3:22

» select intégrés [résolu]
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
KGF_dll - nouvelles versions - Page 39 Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
KGF_dll - nouvelles versions - Page 39 Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0
KGF_dll - nouvelles versions - Page 39 Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
KGF_dll - nouvelles versions - Page 39 Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
KGF_dll - nouvelles versions - Page 39 Emptypar Klaus Lun 6 Mai 2024 - 10:23

» @Jack
KGF_dll - nouvelles versions - Page 39 Emptypar Jack Mar 30 Avr 2024 - 20:40

» Une calculatrice en une ligne de programme
KGF_dll - nouvelles versions - Page 39 Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
KGF_dll - nouvelles versions - Page 39 Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
KGF_dll - nouvelles versions - Page 39 Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le deal à ne pas rater :
Jeux, jouets et Lego : le deuxième à -50% (large sélection)
Voir le deal

 

 KGF_dll - nouvelles versions

Aller en bas 
+8
JL35
Marc
papydall
Jicehel
Yannick
pascal10000
Minibug
Klaus
12 participants
Aller à la page : Précédent  1 ... 21 ... 38, 39, 40  Suivant
AuteurMessage
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 14:50

je ne comprends pas, j'ai bien les codes de tous les autres caractères mais pas les flèches ! scratch

Dés que le ON_CHANGE détecte quelque chose, j'ai un CAPTION sur le FORM de la fenêtre SYNEDIT qui affiche le TEXT$() de l'EDIT. Donc je ne peux rien louper...

C'est bizarre cette histoire. Je ne comprends vraiment pas pourquoi ça ne me retourne rien ?!
Je vais tout reprendre et rechercher depuis le début...  drunken

PS : Même les touches MAJ , CONTROL , ALT et ATL-GR sont bien détectées !
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 15:13

Je viens de découvrir quelque chose de bizarre !

En appuyant simultanément sur ALT et les fléches j'ai réussi à récupérer les codes.
Est ce que tu as une idée d'où cela peut provenir, alors qu'avec SCANCODE tout fonctionné bien !

Edit de 16h25 :
J'ai tout calibrer et tout fonctionne correctement hormis cette touche ALT sur laquelle je dois appuyer pour déplacer mon curseur sur les fenêtre SYNEDIT. J'ai un bien meilleur résultat avec ce principe et les touches directionnelles sont beaucoup plus réactives.

Il ne reste plus qu'a trouver pourquoi cette touche ALT doit être activée  ?! scratch drunken geek

Edit de 18h03 :
J'ai fais un test surprenant.

j'ai mis un message a chaque fois qu'un caractère est ajouté à la chaîne à rechercher.
Tout est OK jusqu'a ce que je tape le caractère '_'. Le caractère suivant ne s'affiche pas comme si on activé le ALT dans un MAIN_MENU.

Il me semble bien qu'il y est quelque part une touche ALT activé ou simulée mais où et comment puisque tout fonctionnait bien avant ?!
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 19:29

J'ai passé un dimanche d'Advent avec les enfant et je viens juste de rentrer. Je vais reagrder cela, mais cette histore de Alt me chiffonne. Chez moi, les flèches sont reconnues telles quelles, sans Alt ni autre modificateur. Et le "_" est un caractère comme un autre, sabs signification particulière. Je vais remettre ma version de debug en route et je verrai bien.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 19:54

Bon, j'ai refait les essais, et je constate que, chez moi, il n'y a nul besoin de saisir Alt pour activer les touches de direction, ni aucune autre touche, d'ailleurs. Alt est considérée comme une touche quelconque et donne lieu à un message "c" indépendant. Les messages pour les 4 flèches arrivent bien, sans avoir à faire Alt. Idem d'ailleurs pour "_" - le message arrive, puis le caractère est inséré dans le Synedit.

D'ailleurs, en faisant des essaie de clavier, j'ai noté une chose curieuse (sans rapport avex KGF.dll oui Synedit):
lorsqu'on frappe la touche Alt à droite de la barre d'espacement, avec une des 4 flèches, on renverse carrément tout l'affichage de Windows ! Ainsi, AltGr/FlècheEnBas affiche l'écran à l'envers, AltGr/FlècheADroite affiche l'écran couché sur la droite, etc. Stupéfiant !

Pour en revenir à nous motons: pour être sûr qu'il n'y a pas de clnflit de version, j'ai regénéré KGF.dll (sans modification !) et je l'ai remis sur les sites et le WebDav. Essaie...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 20:01

Merci Klaus.

Je ne comprends pas car je n'ai pas eu le moindre problème auparavant.

Je vais redémarrer mon PC et recharger la dll.
Je vais aussi tenter de recharger Panoramic si je retrouve la dernière mise a jour...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 20:54

Bon et bien malgré toutes les manipulations c'est toujours pareil !  affraid

J'ai re-téléchargé la DLL et la dernière version de Panoramic 27i8 et pour terminé j'ai redémarré mon portable.
Je suis dépité... le pire dans tout cela c'est que l'ensemble fonctionne parfaitement !
Mais pourquoi cette touche ALT est elle nécessaire ?

J'ai regardé sa correspondance. J'ai étudié aussi la possibilité de simulé l'appuie de cette touche avec la dll mais impossible.

Il s'agit de la touche 18. En appuyant sur ALT ou ALT-GR, j'ai aussi eu le retour des touches 164 et 165 ?!

J'ai aussi vérifié l'appui de la touche toujours avec la DLL et là le résultat est à 0 hormis si j'appuie sur ALT ou ALT-GR avec un résultat qui passe à 1, c'est logique...

Donc je vais laisser tomber pour l'instant à moins que quelqu'un ai une idée...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 21:19

As-tu bien appelé
Code:
res% = dll_call3("SyneditFunction",SE%(act%),38,1) : ' autoriser message "c"
après avoir créé et configuré ton Synedit ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 21:29

oui bien sûr ! Je l'ai rajouté en dernière ligne de ma sub initialise_fenetre_synedit
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 21:53

Alors, je ne comprends vraiment pas. La touche Alt envoie un message "c" en lui-même, qui sera suivi d'un message "c" pour la flèche.

Chez moi, si je maintiens Alt, puis j'appuie sur les flèches, rien ne se passe. Le code envoyé est inconnu dans Synedit_Editor, et donc, pas de réaction. Par contre, les flèches seules sont parfaitement prises en compte.

C'est comme si, chez toi, la touche Alt était en permanence enfoncée et qu'il fallait appuyer dessus pour la "désactiver". J'avoue que là, je ne sais pas quoi faire. Tiens, j'ai une idée: j'ai mis sur le WebDav, dossier 'Synedit\Installation de Synedit_Editor", une version "debug" de Synedit_Editor.exe. Si tu as installé Synedit_Editor chez toi, tu pourrais:
- copier, à partir de ce dossier, Synedit_Editor.exe à la place du Synedit_Editor.exe que tu as
ou alors
- copier, à partir de ce dossier, Synedit_Editor.zip et décompresser dans ton dossier Synedit_Editor
- copier ensuite la dernière version de KGF.dll dans ce dossier Synedit_Editor
- créer un fichier nommé "Synedit_Debug.dat" dans le même dossier, peu importe le contenu
- tu lances ensuite Synedit_Editor
- tu ouvres une fenêtre (Nouveau par exemple)
- tu tapes n'importe quelle touche - tu verras un message affichant le message reçu pour chaque touche
Ainsi, tu pourras vérifier ce que la DLL envoie pour les flèches, pour Alt ou "_".
Ensuite, pour désactiver ce mode Debug, il suffira de renommer ce petit fichier Synedit_Debug.dat, ou de le supprimer.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 22:16

Ok je vais tenter de l'installer mais pas ce soir. Je regarderai demain...
Je te tiens au courant.

Sinon il y a aussi la possibilité que tu télécharge la version de GPP si tu es d'accord.
je pourrai te mettre la dernière version sur le webdav.

Bon dans tous les cas on regarde ça demain.
Bonne soirée
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 22:26

Non, on va plutôt faire l'inverse. Il suffit de quelques lignes pour mettre le problème en évidence. Je te poste ci-dessous un micro-extait de Synedit_Editor que tu peux exécuter dans l'éditeur. Tu seras immédiatement dans un Synedit, la taille n'est pas ajustée mais ça n'a aucune importance. Saisis juste les quelques touches qui t'intéressent et regarde le résultat.
Code:


label nouveau, change

dim res%, nf%, hndSE%, SE%, t%, l%, s$

edit 95 : hide 95 : on_change 95,change

dll_on "KGF.dll"
gosub nouveau

end

nouveau:
  t% = top(0) + 50                            : ' partir de la position par défaut
  l% = left(0) + 50
  nf% = 100
'  form nf% : top nf%,t%+20 : left nf%,l%+20    : ' créer et placer la nouvelle page
'    width nf%,600 : height nf%,400            : ' dimensionner la nouvelle page
  hndSE% = handle(0)                          : ' mémoriser le handle de la page
  SE% = dll_call2("SyneditCreate",handle(0),handle(95))  : ' créer l'objet Synedit
'  active nf%                                        : ' activer la nouvelle page
  res% = dll_call3("SyneditFunction",SE%,2,0)  : ' donner le focus à Synedit
  res% = dll_call3("SyneditFunction",SE%,7,0)  : ' forcer le mode ANSI
  res% = dll_call3("SyneditFunction",SE%,38,1) : ' autoriser message "c"
  return
 
change:
  s$ = text$(95)
  if left$(s$,1)="c"
    message "Caractère reçu: "+s$
    res% = dll_call3("SyneditFunction",SE%,2,0)
  end_if
  return
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 22:38

Ok je viens de tester et tout fonctionne parfaitement !
Les caractères les fleches et tout le reste est ok.

Chapeau au passage pour avoir mis en œuvre SYNEDIT en si peu de lignes.

Donc le problème vient bien de la 'centrale nucléaire'.
Maintenant il va falloir que je trouve d’où çà vient et là c'est pas gagné !
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 22:47

Bon, dans un sens, tu me rassures. KGF.dll et Synedit fonctionnent, c'est le principal. Le reste, c'est la galère habituelle de mise au point que nous connaissons tous deux.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 11 Déc 2016 - 22:57

Eh oui, et la vie continue...

Merci pour ton aide et le temps passé. Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: re   KGF_dll - nouvelles versions - Page 39 EmptyJeu 15 Déc 2016 - 1:48

J' ai du rater un épisode de la série SYNEDIT.
Pourrais tu me donner de plus amples explication sur les trois caractères supplémentaires dans le format de la fonction 3 ? Embarassed 

 KGF_dll - nouvelles versions - Page 39 Captur17

Du coup, il me manque ces caractères mais je ne sais pas à quoi ils corrrespondent ni que mettre pour faire quoi... scratch
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyVen 16 Déc 2016 - 20:21

Klaus au secours !

J'ai repris ton code en rajoutant la position du curseur. Seulement voila la position n'est pas récupérée.
Je sais bien que les valeurs ne sont mises a jour que lorsqu'un caractère est tapé mais cela devrait fonctionner non ?!
Ai je loupé quelque chose ?

Voici le code que j'ai modifié :

Code:

label change

dim res% , SE% , s$ , lig% , col%

edit 95 : hide 95 : on_change 95,change

dll_on "D:\BASIC\GPP\systeme\dll\KGF.dll"

  SE% = dll_call2("SyneditCreate",handle(0),handle(95))  : ' créer l'objet Synedit

  res% = dll_call3("SyneditFunction",SE%,2,0)  : ' donner le focus à Synedit
  res% = dll_call3("SyneditFunction",SE%,7,0)  : ' forcer le mode ANSI
  res% = dll_call3("SyneditFunction",SE%,38,1) : ' autoriser message "c"

END

change:
  res% = DLL_CALL3("SyneditFunction",SE%,30,lig%) : PAUSE 50                                                        : ' Localisation du curseur lig%
  res% = DLL_CALL3("SyneditFunction",SE%,31,col%) : PAUSE 50                                                        : ' Localisation du curseur col%
 
  s$ = text$(95)
  if left$(s$,1)="c"
    CAPTION 0,"Caractère : "+s$+"  / ligne : "+STR$(lig%)+"  /  colonne : "+STR$(col%)
    res% = dll_call3("SyneditFunction",SE%,2,0)
  end_if
return
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: re   KGF_dll - nouvelles versions - Page 39 EmptyVen 16 Déc 2016 - 21:58

Je crois que Klaus est parti en Laponie voir le
santa
ses
rendeer rendeer rendeer rendeer rendeer rendeer rendeer rendeer  
et ses  
jocolor jocolor jocolor jocolor
lol!
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyVen 16 Déc 2016 - 22:15

J’espère que c'est le cas... mais j'ai un doute ! Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 1:20

@Ygeronimi:
Citation :
Pourrais tu me donner de plus amples explication sur les trois caractères supplémentaires dans le format de la fonction 3 ?
Il s'agit de la mémorisation de certaines options générales:
KGF_dll - nouvelles versions - Page 39 Aa121

@Minibug:
ça marchera mieux comme ça:
Code:

label change

dim res% , SE% , s$ , lig% , col%

edit 95 : hide 95 : on_change 95,change

dll_on "KGF.dll"

  SE% = dll_call2("SyneditCreate",handle(0),handle(95))  : ' créer l'objet Synedit

  res% = dll_call3("SyneditFunction",SE%,2,0)  : ' donner le focus à Synedit
  res% = dll_call3("SyneditFunction",SE%,7,0)  : ' forcer le mode ANSI
  res% = dll_call3("SyneditFunction",SE%,38,1) : ' autoriser message "c"

END

change:
  lig% = DLL_CALL3("SyneditFunction",SE%,30,0) : PAUSE 50                                                        : ' Localisation du curseur lig%
  col% = DLL_CALL3("SyneditFunction",SE%,31,0) : PAUSE 50                                                        : ' Localisation du curseur col%

  s$ = text$(95)
  if left$(s$,1)="c"
    CAPTION 0,"Caractère : "+s$+"  / ligne : "+STR$(lig%)+"  /  colonne : "+STR$(col%)
    res% = dll_call3("SyneditFunction",SE%,2,0)
  end_if
return
Very Happy Very Happy Very Happy

Et mes excuses pour la longue absence - c'était dû à un peu de recul que j'ai pris pour consacrer un peu plus de temps à ma famille. Quelque fois, ça fait du bien aussi, autour des fêtes !

Donc, Bonne et Heureuse Année à vous tous !
Et dans mon post ci-dessous, vous trouverez mon "cadeau" pour, disons, redémarrer l'année dans la joie et la bonne humeur !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 1:40

Nouvelle version:
KGF.dll V7.14 du 20/01/2017

Nouveautés:
- Nouveau groupe de fonctions implémentant une base de données compatible DBASE/FOXPRO

Modules modifiés:
KGF.dll
KGF.chm


La doc et les sources sont à jour.

C'est un morceau important. Le code est basé sur une DLL en PowerBasic, nommée Cheetah4.dll, écrite par:
Copyright (C) 2006-2012 Paul Squires (support@planetsquires.com)
qui est informé de mon travail et se réjouit que son logiciel dont le développement a cessé depuis plusieurs années, trouve une nouvelle jeunesse.

Paul Squires a publié tout cela sur SourceForge, freeware opensource. Il y avait un wrapper FreeBasic que j'ai traduit en Delphi afin de l'inclure dans KGF.dll. A travers ce wrapper, on peut utiliser les fonctionnalités de cette base de données à partir de Panoramic. Revers de la médaille: il faut une DLL supplémentaire - c'est Cheetah.dll. Je l'ai donc incorporée dans KGF.dl en tant que ressources, et au premier accès à Cheetah, cette DLL est extraite et placée là où se trouve KGF.dll. Ceci est parfaitement transparent pour le programme en cours et n'a lieu qu'une seule fois, lors du tout premier accès à Cheetah.

Sur mon WebDav, il y a maintenant un dossier Cheetah. Il contient Cheetah4.dll (pour ceux qui veulent s'en servir sans KGF.dll, à partir de FreeBasic par exemple), un fichier Cheetah.chm (créé par moi) qui donne l'aide complète des fonctions utilisables dans KGF.dll à partir de Panoramic, ainsi qu'un dossier Cheetah4 qui contient la distribution complète (source et binaires) de Cheetah, avec mes ajouts personnels qui sont, dans le sousdossier Include, me fichier KGF_unit_Cheetah.pas (wrapper Delphi autour de Cheetah4.dll) ainsi que dans le sousdossier Exemples, un sousdossier Panoramic avec un programme réalisé par moi et deux bases de données exemple très simples.

Voici un programme de démo. En fait, c'est un peu plus qu'un programme de démo. C'est le début d'un gestionnaire de base de données permettant de créer une base de données en paramétrant la liste des champs, une ou plusieurs clés d'accès avec les champs pour chaque clé, la visualisation des données d'une base existante, la saisie et l'ajout d'un nouvel enregistrement, la sauvegarde et la restauration des définitions d'une base:
Code:
' test_Cheetah.bas

labels()
constantes()
variables()
invisibles()
form0()
menu()
pages()

dll_on "KGF.dll"
res% = dll_call1("CheetahLoadDll",adr(Cheetah$))
if res%<0
  message "Veuillez installer "+Cheetah$
  terminate
end_if

' s$ = string$(255," ")
' res% = dll_call1("CheetahGetVersion",adr(s$))
' message str$(res%)+" - "+trim$(s$)

end


sub labels()
  label CreerBase, OuvrirBase, FermerBase, FermerBase2, Sortir, Definitions, Visualiser, Ajouter
  label ChoixCreer, CrAjoutChamp, CrModifChamp, CrSupprimChamp, CrGridClick, CrChangeCle, CrClicCle
  label CrDBASE, CrFOXPRO, CrValidation, CrAnnulation, CrSauver, CrCharger, DefSauver, CreerEnregistrement
  label Creer5Enregistrements, Trier, SupprimerTout, Reindexer, ClickVisualiserChamp
end_sub

sub constantes()
  dim XDB_MOVEFIRST%       : XDB_MOVEFIRST%       = 29
  dim XDB_MOVENEXT_ATOMIC% : XDB_MOVENEXT_ATOMIC% = 33
  dim Cheetah$ : Cheetah$ = "Cheetah4.dll"
end_sub

sub variables()
  dim res%, no%, no1%, no2%, s$, s1$, x%, y%, l%, c%, i%, erreur%, f$
  dim NomBase$, PageActive%, PageCreerBase%, CrChampActif%, NombreChamps%, NombreEnregistrements%, NombreCles%
  dim PageDefinitionsBase%, PageVisualiserBase%, TypeBase%, ModeCreation%, PageAjouterBase%
  dim CmdCreation$, PageAjouterNouvelle%, PageAjouterChamps%, PageVisualiserNouvelle%, no_VisDonnees%
  dim no_CrNomBase%, no_CrNom%, no_CrType%, no_CrLong%, no_CrDec%, no_CrChamps%, no_CrCle%, no_CrPos%, no_CrCles%
  dim no_DefNomBase%, no_DefChamps%, no_DefCles%, no_DefNombreEnregs%, no_DefNombreChamps%, no_DefNombreCles%
  dim no_VisTag%
  dim sData$, ErrorCode%
  dim HandleBase%, HandleIndex%, HandleTag%
  dim NomChamp$(100), TypeChamp$(100), LongueurChamp%(100), DecimalChamp%(100)

end_sub

sub invisibles()
  open_dialog 1
  save_dialog 2
  dlist 3 : sort_on 3   : ' pour collectionner les champs d'une clé avec ccpp-lll  cc=clé  pp=position  lll=ligne
end_sub

sub form0()
  width 0,900 : height 0,700
  caption 0,"Cheetah - Gestionnaire de base de données"
end_sub

sub menu()
  no% = 100
  main_menu no% : no1% = no%
    no% = no% + 1 : no2% = no% : sub_menu no% : parent no%,no1% : caption no%,"Bases de données"
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Créer..."   : on_click no%,CreerBase
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Ouvrir..."  : on_click no%,OuvrirBase
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Fermer"     : on_click no%,FermerBase
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"-"
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Sortir"    : on_click no%,Sortir

    no% = no% + 1 : no2% = no% : sub_menu no% : parent no%,no1% : caption no%,"Définitions" : on_click no%,Definitions
    no% = no% + 1 : no2% = no% : sub_menu no% : parent no%,no1% : caption no%,"Données"
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Visualiser" : on_click no%,Visualiser
      no% = no% + 1 : sub_menu no% : parent no%,no2% : caption no%,"Ajouter" : on_click no%,Ajouter


end_sub

sub pages()
  ' page "Création d'une base"
  PageCreerBase% = 1000
  no% = PageCreerBase% : no1% = no%
  container no% : hide no% : full_space no% : caption no%,"Création d'une base"
  no% = no% + 1 : option no% : parent no%,no1% : width no%,120 : top no%,20 : left no%,20 : caption no%,"DBASE compatible" : on_click no%, CrDBASE
  no% = no% + 1 : option no% : parent no%,no1% : width no%,120 : top no%,40 : left no%,20 : caption no%,"FOXPRO compatible" : on_click no%, CrFOXPRO
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,20 : left no%,160 : caption no%,"Nom et chemin de la base:"
  no% = no% + 1 : edit no% : parent no%,no1% : no_CrNomBase% = no% : top no%,40 : left no%,160 : width no%,400
  no% = no% + 1 : button no% : parent no%,no1% : top no%,40 : left no%,570 : width no%,30 : caption no%,"..." : font_bold no% : on_click no%,ChoixCreer

  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,70 : left no%,20 : caption no%,"Champs:"
  no% = no% + 1 : grid no% : parent no%,no1% : top no%,90 : left no%,10 : width no%,490 : height no%,300 : on_click no%,CrGridClick : no_CrChamps% = no%
    grid_row no%,100 : grid_column no%,7 : grid_column_width no%,40
    grid_one_column_width no%,2,200
    grid_write no%,1,1,"No."
    grid_write no%,1,2,"Nom"
    grid_write no%,1,3,"Type"
    grid_write no%,1,4,"Long."
    grid_write no%,1,5,"Déc."
    grid_write no%,1,6,"# Clé"
    grid_write no%,1,7,"Ordre"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,90 : left no%,520 : caption no%,"Nom:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,120 : left no%,520 : caption no%,"Type:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,150 : left no%,520 : caption no%,"Long.:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,180 : left no%,520 : caption no%,"Déc.:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,210 : left no%,520 : caption no%,"# Clé:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,240 : left no%,520 : caption no%,"Ordre:"

  no% = no% + 1 : edit no% : parent no%,no1% : top no%,90 : left no%,560 : width no%,200 : no_CrNom% = no%
  no% = no% + 1 : combo no% :  parent no%,no1% : top no%,120 : left no%,560 : text no%,"c = texte" : no_CrType% = no%
    item_add no%,"c = texte"
    item_add no%,"n = numérique (DBASE)"
    item_add no%,"d = date (DBASE)"
    item_add no%,"l = logique (V/F)"
    item_add no%,"m = mémo"
    text no_CrType%,item_read$(no_CrType%,1)
  no% = no% + 1 : spin no% : parent no%,no1% : top no%,150 : left no%,560 : width no%,60 : min no%,1 : max no%,100 : position no%,1 : no_CrLong% = no%
  no% = no% + 1 : spin no% : parent no%,no1% : top no%,180 : left no%,560 : width no%,60 : min no%,0 : max no%,4 : position no%,0 : no_CrDec% = no%
  no% = no% + 1 : combo no% : parent no%,no1% : top no%,210 : left no%,560 : width no%,200 : no_CrCle% = no%
    item_add no%,"<aucune>"
    text no%,item_read$(no%,1)
  no% = no% + 1 : spin no% : parent no%,no1% : top no%,240 : left no%,560 : width no%,60 : min no%,0 : max no%,10 : position no%,0 : no_CrPos% = no%

  no% = no% + 1 : button no% : parent no%,no1% : top no%,270 : left no%,560 : caption no%,"Ajouter" : on_click no%,CrAjoutChamp
  no% = no% + 1 : button no% : parent no%,no1% : top no%,270 : left no%,660 : caption no%,"Modifier" : on_click no%,CrModifChamp
  no% = no% + 1 : button no% : parent no%,no1% : top no%,270 : left no%,760 : caption no%,"Supprimer" : on_click no%,CrSupprimChamp

  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,310 : left no%,560 : caption no%,"Clés:"
  for i%=1 to 10
    no% = no% + 1 : alpha no% : parent no%,no1% : top no%,310+20*i% : left no%,560 : caption no%,str$(i%)
  next i%
  no_CrCles% = no% + 1
  for i%=1 to 10
    no% = no% + 1 : edit no% : parent no%,no1% : top no%,310+20*i% : left no%,590 : width no%,200 : on_change no%,CrChangeCle : on_click no%,CrClicCle
  next i%

  no% = no% + 1 : button no% : parent no%,no1% : top no%,420 : left no%,100 : caption no%,"Créer" : font_bold no% : on_click no%,CrValidation
  no% = no% + 1 : button no% : parent no%,no1% : top no%,420 : left no%,200 : caption no%,"Annuler" : font_bold no% : on_click no%,CrAnnulation

  no% = no% + 1 : button no% : parent no%,no1% : top no%,460 : left no%,100 : width no%,180 : caption no%,"Sauver définition" : font_bold no% : on_click no%,CrSauver
  no% = no% + 1 : button no% : parent no%,no1% : top no%,490 : left no%,100 : width no%,180 : caption no%,"Charger définition" : font_bold no% : on_click no%,CrCharger
  mark_on PageCreerBase%+1
  
  ' définitions de la base ouverte
  PageDefinitionsBase% = 2000
  no% = PageDefinitionsBase% : no1% = no%
  container no% : hide no% : full_space no% : caption no%,"Définitions d'une base"
  no% = no% + 1 : option no% : parent no%,no1% : width no%,120 : top no%,20 : left no%,20 : caption no%,"DBASE compatible"
  no% = no% + 1 : option no% : parent no%,no1% : width no%,120 : top no%,40 : left no%,20 : caption no%,"FOXPRO compatible"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,20 : left no%,160 : caption no%,"Nom et chemin de la base:"
  no% = no% + 1 : edit no% : parent no%,no1% : no_DefNomBase% = no% : top no%,40 : left no%,160 : width no%,400

  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,70 : left no%,20 : caption no%,"Champs:"
  no% = no% + 1 : grid no% : parent no%,no1% : top no%,90 : left no%,10 : width no%,490 : height no%,300 : no_DefChamps% = no%
    grid_row no%,100 : grid_column no%,7 : grid_column_width no%,40
    grid_one_column_width no%,2,200
    grid_write no%,1,1,"No."
    grid_write no%,1,2,"Nom"
    grid_write no%,1,3,"Type"
    grid_write no%,1,4,"Long."
    grid_write no%,1,5,"Déc."
    grid_write no%,1,6,"# Clé"
    grid_write no%,1,7,"Ordre"

  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,70 : left no%,560 : caption no%,"Clés:"
  for i%=1 to 10
    no% = no% + 1 : alpha no% : parent no%,no1% : top no%,70+20*i% : left no%,560 : caption no%,str$(i%)
  next i%
  no_DefCles% = no% + 1
  for i%=1 to 10
    no% = no% + 1 : edit no% : parent no%,no1% : top no%,70+20*i% : left no%,590 : width no%,200
  next i%
  
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,420 : left no%,10 : caption no%,"Nombre d'enregistrements:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,440 : left no%,10 : caption no%,"Nombre de champs:"
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,460 : left no%,10 : caption no%,"Nombre de clés:"
  no% = no% + 1 : edit no% : parent no%,no1% : top no%,420 : left no%,200 : width no%,60 : no_DefNombreEnregs% = no%
  no% = no% + 1 : edit no% : parent no%,no1% : top no%,440 : left no%,200 : width no%,60 : no_DefNombreChamps% = no%
  no% = no% + 1 : edit no% : parent no%,no1% : top no%,460 : left no%,200 : width no%,60 : no_DefNombreCles% = no%

  no% = no% + 1 : button no% : parent no%,no1% : top no%,500 : left no%,100 : width no%,180 : caption no%,"Sauver définition" : font_bold no% : on_click no%,DefSauver

  ' visualiser les données de la base ouverte
  PageVisualiserBase% = 3000
  no% = PageVisualiserBase% : no1% = no%
  container no% : hide no% : full_space no% : caption no%,"Visualiser les données d'une base"

  ' ajouter des données à une base
  PageAjouterBase% = 4000
  no% = PageAjouterBase% : no1% = no%
  container no% : hide no% : full_space no% : caption no%,"Ajouter des données à une base"

end_sub




CreerBase:
  if NomBase$<>"" then return
  if PageActive%<>0 then hide PageActive%
  PageActive% = PageCreerBase%
  text no_CrNomBase%,"Nouveau.dbf"
  CrChampActif% = 0
  CmdCreation$ = ""
  HandleBase% = 0
  HandleIndex% = 0
  HandleTag% = 0
  NombreChamps% = 0
  ModeCreation% = 1
  PageAjouterNouvelle% = 1
  PageVisualiserNouvelle% = 1
  
  i% = 2
  while grid_read$(no_CrChamps%,i%,1)<>""
    grid_write no_CrChamps%,i%,1,""
    grid_write no_CrChamps%,i%,2,""
    grid_write no_CrChamps%,i%,3,""
    grid_write no_CrChamps%,i%,4,""
    grid_write no_CrChamps%,i%,5,""
    grid_write no_CrChamps%,i%,6,""
    grid_write no_CrChamps%,i%,7,""
    i% = i% + 1
  end_while
  show PageActive%
  
  return
  
OuvrirBase:
  if NomBase$<>"" then return
  if PageActive%<>0 then hide PageActive%
  PageActive% = PageDefinitionsBase%
  i% = 2
  while grid_read$(no_CrChamps%,i%,1)<>""
    grid_write no_CrChamps%,i%,1,""
    grid_write no_CrChamps%,i%,2,""
    grid_write no_CrChamps%,i%,3,""
    grid_write no_CrChamps%,i%,4,""
    grid_write no_CrChamps%,i%,5,""
    grid_write no_CrChamps%,i%,6,""
    grid_write no_CrChamps%,i%,7,""
    i% = i% + 1
  end_while
  show PageActive%

  HandleBase% = 0
  HandleIndex% = 0
  HandleTag% = 0
  NombreChamps% = 0
  NombreEnregistrements% = 0

  filter 1,"Base de données (*.dbf)|*.dbf"
  s$ = file_name$(1)
  if s$="_" then return
  if file_exists(s$)=0
    message "Le fichier n'existe pas"
    return
  end_if
  
  s$ = "disk="+s$
  res% = dll_call2("CheetahOpenDatabase",adr(s$),adr(HandleBase%))
  if res%<>0
    ErreurCheetah("CheetahOpenDatabase",res%)
    return
  end_if
  NomBase$ = s$

  s$ = left$(NomBase$,len(NomBase$)-4) + ".btx"
  res% = dll_call3("CheetahOpenIndex",adr(s$),Handlebase%,adr(HandleIndex%))
  if res%<>0
    ErreurCheetah("CheetahOpenIndex",res%)
    NomBase$ = ""
    return
  end_if
  message "L'indexe est ouvert."

  NomBase$ = s$
  caption 0,"Cheetah - "+NomBase$
  message "La base est ouverte."
  ModeCreation% = 0
  PageAjouterNouvelle% = 1
  PageVisualiserNouvelle% = 1

  ChargerBase()

  return

FermerBase:
  hide PageActive%
  if NomBase$="" then return
  res% = dll_call1("CheetahCloseDatabase",adr(HandleBase%))

FermerBase2:
  select PageActive%
    case 1000 : ' PageCreerBase%
      i% = 2
      while grid_read$(no_CrChamps%,i%,1)<>""
        grid_write no_CrChamps%,i%,1,""
        grid_write no_CrChamps%,i%,2,""
        grid_write no_CrChamps%,i%,3,""
        grid_write no_CrChamps%,i%,4,""
        grid_write no_CrChamps%,i%,5,""
        grid_write no_CrChamps%,i%,6,""
        grid_write no_CrChamps%,i%,7,""
        i% = i% + 1
      end_while
      CmdCreation$ = ""
      CrChampActif% = 0
      NomBase$ = ""
      ModeCreation% = 0
    case 2000 : ' PageDefinitionsBase%
      i% = 2
      while grid_read$(no_CrChamps%,i%,1)<>""
        grid_write no_CrChamps%,i%,1,""
        grid_write no_CrChamps%,i%,2,""
        grid_write no_CrChamps%,i%,3,""
        grid_write no_CrChamps%,i%,4,""
        grid_write no_CrChamps%,i%,5,""
        grid_write no_CrChamps%,i%,6,""
        grid_write no_CrChamps%,i%,7,""
        i% = i% + 1
      end_while
      NomBase$ = ""
      HandleBase% = 0
      HandleIndex% = 0
      HandleTag% = 0
      NombreChamps% = 0
      NombreEnregistrements% = 0
    case 3000 : ' PageDonneesBase%
    
  end_select
  NomBase$ = ""
  caption 0,"Cheetah - Gestionnaire de base de données"
  return

Sortir:
  if NomBase$<>""
    if message_confirmation_yes_no("Une base est ouverte.  Fermer ?")<>1 then return
    gosub FermerBase
  end_if
  res% = dll_call0("CheetahShutdown")
  terminate
  return
  
Definitions:
  if NomBase$="" then return
  if ModeCreation%=1 then return
  if PageActive%<>0 then hide PageActive%
  PageActive% = PageDefinitionsBase%
  show PageActive%

  return

Visualiser:
  if NomBase$="" then return
  if ModeCreation%=1 then return
  if PageActive%<>0 then hide PageActive%
  PageActive% = PageVisualiserBase%
  if PageVisualiserNouvelle%=1 then CreerChampsVisualiser()

  show PageActive%
  
  return
  
Ajouter:
  if NomBase$="" then return
  if ModeCreation%=1 then return
  if PageActive%<>0 then hide PageActive%
  PageActive% = PageAjouterBase%
  if PageAjouterNouvelle%=1 then CreerChampsAjouter()

  show PageActive%

  return

ChoixCreer:
  filter 2,"Base de données (*.dbf)|*.dbf"
  s$ = file_name$(2)
  if s$="_" then return
  if file_exists(s$)=1
    message "Cette base existe déjà !"
    return
  end_if
  s1$ = file_extract_extension$(s$)
  if s1$=""
    s1$ = ".dbf"
    s$ = s$ + s1$
  end_if
  if s1$<>".dbf" then s$ = left$(s$,len(s$)-len(s1$)) + ".dbf"
  text no_CrNomBase%,s$
  return

CrAjoutChamp:
  l% = 2
  ' vérifier la cohérence des paramètres
  if text$(no_CrNom%)=""
    message "Le nom du champ manque"
    return
  end_if
  CorrigerParams()
  ' trouver la première place libre
  while grid_read$(no_CrChamps%,l%,1)<>""
    if grid_read$(no_CrChamps%,l%,2)=text$(no_CrNom%)
      message "Ce champ existe déjà !"
      return
    end_if
    l% = l% + 1
  end_while
  CrChampActif% = l%
  CopyChamps()
  NombreChamps% = NombreChamps% + 1
  return

CrModifChamp:
  if CrChampActif%=0 then return
  ' vérifier la cohérence des paramètres
  if text$(no_CrNom%)=""
    message "Le nom du champ manque"
    return
  end_if
  l% = 2
  while grid_read$(no_CrChamps%,l%,1)<>""
    if grid_read$(no_CrChamps%,l%,2)=text$(no_CrNom%)
      if l%<>CrChampActif%
        message "Ce champ existe déjà !"
        return
      end_if
    end_if
    l% = l% + 1
  end_while
  CorrigerParams()
  CopyChamps()
  return

CrSupprimChamp:
  if CrChampActif%=0 then return
  l% = CrChampActif%
  while grid_read$(no_CrChamps%,l%+1,1)<>""
    for i%=2 to 7
      grid_write no_CrChamps%,l%,i%,grid_read$(no_CrChamps%,l%+1,i%)
    next i%
    l% = l% + 1
  end_while
  for i%=1 to 7
    grid_write no_CrChamps%,l%,i%,""
  next i%
  NombreChamps% = NombreChamps% - 1
  return
  
CrGridClick:
  x% = mouse_x_left_down(no_CrChamps%)
  y% = mouse_y_left_down(no_CrChamps%)
  c% = grid_x_to_column(no_CrChamps%,x%)
  l% = grid_y_to_row(no_CrChamps%,y%)
'  message "ligne="+str$(l%)+"   colonne="+str$(c%)
  if grid_read$(no_CrChamps%,l%,1)=""
    grid_write no_CrChamps%,l%,1,""
    grid_write no_CrChamps%,l%,2,""
    grid_write no_CrChamps%,l%,3,""
    grid_write no_CrChamps%,l%,4,""
    grid_write no_CrChamps%,l%,5,""
    grid_write no_CrChamps%,l%,6,""
    grid_write no_CrChamps%,l%,7,""
    CrChampActif% = 0
  else
    s$ = grid_read$(no_CrChamps%,l%,2)
    text no_CrNom%,s$
    s$ = grid_read$(no_CrChamps%,l%,3)
    for i%=1 to count(no_CrType%)
      if s$=left$(item_read$(no_CrType%,i%),1)
        text no_CrType%,item_read$(no_CrType%,i%)
        exit_for
      end_if
    next i%
    s$ = grid_read$(no_CrChamps%,l%,4)
    position no_CrLong%,val(s$)
    s$ = grid_read$(no_CrChamps%,l%,5)
    position no_CrDec%,val(s$)
    if grid_read$(no_CrChamps%,l%,6)=""
      text no_CrCle%,"<aucune>"
      position no_CrPos%,0
    else
      text no_CrCle%,text$(no_CrCles%+val(grid_read$(no_CrChamps%,l%,6))-1)
      position no_CrPos%,val(grid_read$(no_CrChamps%,l%,7))
    end_if
    CrChampActif% = l%
  end_if
  return
  
CrDBASE:
  if grid_read$(no_CrChamps%,2,1)<>""
     off_click PageCreerBase%+2
     mark_on PageCreerBase%+2
     on_click PageCreerBase%+2,CrFOXPRO
     return
  end_if
  clear no_CrType%
  item_add no_CrType%,"c = texte"
  item_add no_CrType%,"n = numérique (DBASE)"
  item_add no_CrType%,"d = date (DBASE)"
  item_add no_CrType%,"l = logique (V/F)"
  item_add no_CrType%,"m = mémo"
  text no_CrType%,item_read$(no_CrType%,1)
  return
  
CrFOXPRO:
  if grid_read$(no_CrChamps%,2,1)<>""
     off_click PageCreerBase%+1
     mark_on PageCreerBase%+1
     on_click PageCreerBase%+1,CrDBASE
     return
  end_if
  clear no_CrType%
  item_add no_CrType%,"c = texte"
  item_add no_CrType%,"y = monétaire (FOXPRO)"
  item_add no_CrType%,"t = date/heure (FOXPRO)"
  item_add no_CrType%,"l = logique (V/F)"
  item_add no_CrType%,"m = mémo"
  text no_CrType%,item_read$(no_CrType%,1)
  return
  
CrChangeCle:
  i% = number_change - no_CrCles%
  if i%>0
    if text$(no_CrCles%+i%-1)=""
      text no_CrCles%+i%,""
      return
    end_if
  end_if
  item_delete no_CrCle%,i%+2
  item_insert no_CrCle%,i%+2,text$(no_CrCles%+i%)
  text no_CrCle%,text$(no_CrCles%+i%)
  position no_CrPos%,1
  return
  
CrClicCle:
  i% = number_click - no_CrCles%
  if i%>0
    if text$(no_CrCles%+i%-1)=""
      set_focus no_CrCles%
      return
    end_if
  end_if
  text no_CrCle%,text$(no_CrCles%+i%)
  return

CrSauver:
  if grid_read$(no_CrChamps%,2,1)="" then return
  filter 2,"Sauvegarde des défnitions (*.dbs)|*.dbs"
  s$ = file_name$(2)
  if s$="_" then return
  s1$ = file_extract_extension$(s$)
  if s1$=""
    s$ = s$ + ".dbs"
    s1$ = ".dbs"
  end_if
  if s1$<>".dbs" then s$ = left$(s$,len(s$)-len(s1$)) + ".dbs"
  if file_exists(s$)=1
    if message_confirmation_yes_no("Cette sauvegarde existe déjà. Remplacer ?")<>1 then return
  end_if
  f$ = s$
  file_open_write 1,f$
  file_writeln 1,"Cheetah Parameter Backup"
  file_writeln 1,NomBase$
  file_writeln 1,"#Fields"
  i%=2
  while grid_read$(no_CrChamps%,i%,1)<>""
    s$ = grid_read$(no_CrChamps%,i%,1)+","
    s$ = s$ + grid_read$(no_CrChamps%,i%,2)+","+grid_read$(no_CrChamps%,i%,3)+","
    s$ = s$ + grid_read$(no_CrChamps%,i%,4)+","+grid_read$(no_CrChamps%,i%,5)+","
    s$ = s$ + grid_read$(no_CrChamps%,i%,6)+","+grid_read$(no_CrChamps%,i%,7)+","
    file_writeln 1,s$
    i% = i% + 1
  end_while
  file_writeln 1,"#Keys"
  i% = 0
  while text$(no_CrCles%+i%)<>""
    file_writeln 1,text$(no_CrCles%+i%)
    i% = i% + 1
  end_while
  file_writeln 1,"#End"
  file_close 1
  return

CrCharger:
  if NomBase$<>""
    message "Une base est actuellement ouverte."
    return
  end_if
  filter 1,"Sauvegarde des défnitions (*.dbs)|*.dbs"
  s$ = file_name$(1)
  if s$="_" then return
  s1$ = file_extract_extension$(s$)
  if s1$=""
    s$ = s$ + ".dbs"
    s1$ = ".dbs"
  end_if
  if s1$<>".dbs" then s$ = left$(s$,len(s$)-len(s1$)) + ".dbs"
  if file_exists(s$)=0
    message "Cette sauvegarde n'existe pas."
    return
  end_if
  f$ = s$
  file_open_read 1,f$
  file_readln 1,s$
  if s$<>"Cheetah Parameter Backup"
    message "Ce fichier n'est pas une sauvegarde de définitions."
    file_close 1
    return
  end_if
  file_readln 1,f$
  file_readln 1,s$
  if s$<>"#Fields"
    message "La structure du fichier est abimée."
    file_close 1
    return
  end_if
  i% = 1
  while s$<>"#Keys"
    file_readln 1,s$
    if s$="#Keys" then exit_while
    i% = i% + 1
    for c%=1 to 7
      y% = instr(s$,",")
' message "s$="+s$+"  i%="+str$(i%)+"  c%="+str$(c%)+"  y%="+str$(y%)
      grid_write no_CrChamps%,i%,c%,left$(s$,y%-1)
      s$ = mid$(s$,y%+1,len(s$))
    next c%
  end_while
  NombreChamps% = i% - 1
  while grid_read$(no_CrChamps%,i%+1,1)<>""
    i% = i% + 1
    grid_write no_CrChamps%,i%,1,""
    grid_write no_CrChamps%,i%,2,""
    grid_write no_CrChamps%,i%,3,""
    grid_write no_CrChamps%,i%,4,""
    grid_write no_CrChamps%,i%,5,""
    grid_write no_CrChamps%,i%,6,""
    grid_write no_CrChamps%,i%,7,""
  end_while
  i% = 0
  while s$<>"#End"
    file_readln 1,s$
    if s$="#End" then exit_while
    text no_CrCles%+i%,s$
    i% = i% + 1
  end_while
  while i%<9
    text no_CrCles%+i%,""
    i% = i% + 1
  end_while
  file_close 1
  return

DefSauver:
  if NomBase$="" then return
  filter 2,"Sauvegarde des défnitions (*.dbs)|*.dbs"
  s$ = file_name$(2)
  if s$="_" then return
  s1$ = file_extract_extension$(s$)
  if s1$=""
    s$ = s$ + ".dbs"
    s1$ = ".dbs"
  end_if
  if s1$<>".dbs" then s$ = left$(s$,len(s$)-len(s1$)) + ".dbs"
  if file_exists(s$)=1
    if message_confirmation_yes_no("Cette sauvegarde existe déjà. Remplacer ?")<>1 then return
  end_if
  f$ = s$
  file_open_write 1,f$
  file_writeln 1,"Cheetah Parameter Backup"
  file_writeln 1,NomBase$
  file_writeln 1,"#Fields"
  i%=2
  while grid_read$(no_DefChamps%,i%,1)<>""
    s$ = grid_read$(no_DefChamps%,i%,1)+","
    s$ = s$ + grid_read$(no_DefChamps%,i%,2)+","+grid_read$(no_DefChamps%,i%,3)+","
    s$ = s$ + grid_read$(no_DefChamps%,i%,4)+","+grid_read$(no_DefChamps%,i%,5)+","
    s$ = s$ + grid_read$(no_DefChamps%,i%,6)+","+grid_read$(no_DefChamps%,i%,7)+","
    file_writeln 1,s$
    i% = i% + 1
  end_while
  file_writeln 1,"#Keys"
  i% = 0
  while text$(no_DefCles%+i%)<>""
    file_writeln 1,text$(no_DefCles%+i%)
    i% = i% + 1
  end_while
  file_writeln 1,"#End"
  file_close 1
  return
  
CrValidation:
  ' demander le nom du fichier à créer
  s$ = text$(no_CrNomBase%)
  if lower$(right$(s$,4))<>".dbf"
    message "Le nom de la base manque ou est invalide"
    return
  end_if
  l% = 2
  if grid_read$(no_CrChamps%,l%,1)=""
    message "Aucun champ n'est défini"
    return
  end_if
  NomBase$ = text$(no_CrNomBase%)
  caption 0,"Cheetah - "+NomBase$
  CmdCreation$ = "disk  = "+NomBase$+";"
  if checked(PageCreerBase%+1)=1               : ' DBASE
    CmdCreation$ = CmdCreation$ + "type  = dbase;"
    CmdCreation$ = CmdCreation$ + "memosize = 512;"
  else                                         : ' FOXPRO
    CmdCreation$ = CmdCreation$ + "type  = foxpro;"
    CmdCreation$ = CmdCreation$ + "memosize = 64;"
  end_if
  while grid_read$(no_CrChamps%,l%,1)<>""
    CmdCreation$ = CmdCreation$ + "field = "+grid_read$(no_CrChamps%,l%,2)+","+grid_read$(no_CrChamps%,l%,3)+","+grid_read$(no_CrChamps%,l%,4)+","+grid_read$(no_CrChamps%,l%,5)+";"
    l% = l% + 1
  end_while
'  message CmdCreation$
  res% = dll_call1("CheetahCreateDatabase",adr(CmdCreation$))
  if res%<>0
    ErreurCheetah("CheetahCreateDatabase",res%)
    return
  end_if
  message "La base est créée."
    
  s$ = "disk="+NomBase$
  res% = dll_call2("CheetahOpenDatabase",adr(s$),adr(HandleBase%))
  if res%<>0
    ErreurCheetah("CheetahOpenDatabase",res%)
    gosub FermerBase
  end_if
  message "La base est ouverte."
  
  s$ = "disk = "+left$(NomBase$,len(NomBase$)-4) + ".btx"
  res% = dll_call1("CheetahCreateIndex",adr(s$))
  if res%<>0
    ErreurCheetah("CheetahCreateIndex",res%)
    return
  end_if
  message "L'indexe est créé."

  res% = dll_call3("CheetahOpenIndex",adr(s$),Handlebase%,adr(HandleIndex%))
  if res%<>0
    ErreurCheetah("CheetahOpenIndex",res%)
    return
  end_if
  message "L'indexe est ouvert."
  
  clear 3
  for l%=1 to NombreChamps%                  : ' collectionner et trier les champs faisant partie de clés
    if grid_read$(no_CrChamps%,l%+1,6)<>""
      s$ = right$("0"+grid_read$(no_CrChamps%,l%+1,6),2)+right$("0"+grid_read$(no_CrChamps%,l%+1,7),2)+"-"+right$("00"+str$(l%+1),3)
      item_add 3,s$
    end_if
  next l%

  if count(3)>0
    for i%=1 to count(no_CrCle%)-1
      s$ = "TagName="+item_read$(no_CrCle%,i%+1)+"; Expression="
      for l%=1 to count(3)
        s1$ = item_read$(3,l%)
        if val(left$(s1$,2))=i%
          if right$(s$,1)<>"=" then s$ = s$ + "+"
          s$ = s$ + grid_read$(no_CrChamps%,val(right$(s1$,3)),2)
        end_if
      next l%
      if right$(s$,1)<>"="
        s$ = s$ + "; UpperCase=TRUE"
'        message "cle "+str$(i%)+"="+s$

        res% = dll_call2("CheetahCreateTag",adr(s$),HandleIndex%)
        if res%<>0
          ErreurCheetah("CheetahCreateTag",res%)
          return
        end_if
'        message "La clé/tag <"+s$+"> est créée."

      end_if
    next i%
  else
    message "Aucune clé définie."
  end_if
  
  hide PageActive%
  PageActive% = 0
  return
  
CrAnnulation:
  hide PageActive%
  PageActive% = 0
  return
  
CreerEnregistrement:
  CreerEnregistrement(1)
  return

Creer5Enregistrements:
  Creer5Enregistrements()
  return
  
Trier:
  Trier()
  return
  
SupprimerTout:
  SupprimerTout()
  return
  
Reindexer:
  Reindexer()
  return
  
ClickVisualiserChamp:
  ClickVisualiserChamp()
  return

sub CopyChamps()
  dim_local k%
  grid_write no_CrChamps%,CrChampActif%,1,str$(CrChampActif%-1)
  grid_write no_CrChamps%,CrChampActif%,2,text$(no_CrNom%)
  grid_write no_CrChamps%,CrChampActif%,3,left$(text$(no_CrType%),1)
  grid_write no_CrChamps%,CrChampActif%,4,text$(no_CrLong%)
  grid_write no_CrChamps%,CrChampActif%,5,text$(no_CrDec%)
  if text$(no_CrCle%)="<aucune>"
    grid_write no_CrChamps%,CrChampActif%,6,""
    grid_write no_CrChamps%,CrChampActif%,7,""
  else
    for i%=1 to 11
      if text$(no_CrCle%)=item_read$(no_CrCle%,i%)
        grid_write no_CrChamps%,CrChampActif%,6,str$(i%-1)
        grid_write no_CrChamps%,CrChampActif%,7,str$(position(no_CrPos%))
        exit_for
      end_if
    next i%
  end_if
end_sub

sub CorrigerParams()
  dim_local s$, i%
  erreur% = 0
  s$ = left$(text$(no_CrType%),1)
  if text$(no_CrCle%)="<aucune>" then position no_CrPos%,0
  if checked(PageCreerBase%+1)=1       : ' DBASE
    ' jamais de décimales sauf type n
    if s$<>"n" then position no_CrDec%,0
    ' toujours type n comme monétaire au lieu de type y
    if s$="y" then text no_CrType%,item_read$(no_CrType%,2)
    ' toujours type d comme date/time au lieu de type t
    if s$="t" then text no_CrType%,item_read$(no_CrType%,3)
    ' toujours longueur 1 si type l
    if s$="l" then position no_CrLong%,1
    ' toujours longueur 10 si type m
    if s$="m" then position no_CrLong%,10
    ' toujours longueur 8 si type d
    if s$="d" then position no_CrLong%,8
  else                                 : ' FOXPRO
    ' jamais de décimales
    position no_CrDec%,0
    ' toujours type y comme monétaire au lieu de type t
    if s$="n" then text no_CrType%,item_read$(no_CrType%,2)
    ' toujours type t comme date/time au lieu de type d
    if s$="d" then text no_CrType%,item_read$(no_CrType%,3)
    ' toujours longueur 1 si type l
    if s$="l" then position no_CrLong%,1
    ' toujours longueur 4 si type m
    if s$="m" then position no_CrLong%,4
    ' toujours longueur 8 si type t
    if s$="t" then position no_CrLong%,8
  end_if
end_sub

sub ErreurCheetah(txt$,err%)
  dim_local s$
  s$ = string$(53," ")
  res% = dll_call2("CheetahGetErrorText",err%,adr(s$))
  message txt$+": erreur "+s$
end_sub

sub ChargerBase()
  dim_local v1%, v2%
  res% = dll_call2("CheetahFileType",HandleBase%,adr(TypeBase%))
  select TypeBase%
    case 0: ' tyoe inconnu
      mark_off PageDefinitionsBase%+1
      mark_off PageDefinitionsBase%+2
    case 1: ' DBASE
      mark_on PageDefinitionsBase%+1
      mark_off PageDefinitionsBase%+2
    case 2: ' FOXPRO
      mark_off PageDefinitionsBase%+1
      mark_on PageDefinitionsBase%+2
  end_select
  
  res% = dll_call2("CheetahRecordCount",HandleBase%,adr(NombreEnregistrements%))
  text no_DefNombreEnregs%,str$(NombreEnregistrements%)

  res% = dll_call2("CheetahFieldCount",HandleBase%,adr(NombreChamps%))
  text no_DefNombreChamps%,str$(NombreChamps%)

  s$ = string$(10," ")
  for i%=1 to NombreChamps%
    s1$ = " "
    grid_write no_DefChamps%,i%+1,1,str$(i%)
    res% = dll_call6("CheetahFieldInfo",HandleBase%,i%,adr(s$),adr(s1$),adr(v1%),adr(v2%))
    NomChamp$(i%)      = trim$(s$)
    grid_write no_DefChamps%,i%+1,2,NomChamp$(i%)
    TypeChamp$(i%)     = s1$
    grid_write no_DefChamps%,i%+1,3,TypeChamp$(i%)
    LongueurChamp%(i%) = v1%
    grid_write no_DefChamps%,i%+1,4,str$(LongueurChamp%(i%))
    DecimalChamp%(i%)  = v2%
    grid_write no_DefChamps%,i%+1,5,str$(DecimalChamp%(i%))
  next i%
  
  for i%=1 to 10
    s$ = string$(10," ")
    s1$ = string$(20," ")
    res% = dll_call5("CheetahGetTagByNumber",i%,HandleIndex%,adr(HandleTag%),adr(s$),adr(s1$))
    if res%=0
      NombreCles% = i%
      ' clé trouvé - analyser !
      text no_DefCles%+i%-1,trim$(s$)
      l% = 0
      while len(s1$)>0
        v1% = hex(left$(s1$,2))
        s1$ = trim$(mid$(s1$,3,len(s1$)))
        l% = l% + 1
        grid_write no_DefChamps%,v1%+1,6,str$(i%)
        grid_write no_DefChamps%,v1%+1,7,str$(l%)
      end_while
    else
      exit_for
    end_if
  next i%
  text no_DefNombreCles%,str$(NombreCles%)
end_sub

sub CreerChampsAjouter()
  dim_local y%
  no% = PageAjouterBase% : no1% = no%
  if object_exists(no%)=1 then delete no%
  container no% : hide no% : full_space no% : caption no%,"Ajouter des données à une base"

  y% = 20
  for i%=1 to NombreChamps%
    no% = no% + 1 : alpha no% : parent no%,no1% : top no%,y% : left no%,20 : caption no%,grid_read$(No_DefChamps%,i%+1,2)
    if TypeChamp$(i%)="M"
      y% = y% + 22 + 60
    else
      y% = y% + 22
    end_if
  next i%
  PageAjouterChamps% = no%
  y% = 20
  for i%=1 to NombreChamps%
    if TypeChamp$(i%)="M"
      no% = no% + 1 : memo no% : parent no%,no1% : top no%,y% : left no%,150 : width no%,200 : height no%,80 : bar_both no%
      y% = y% + 22 + 60
    else
      no% = no% + 1 : edit no% : parent no%,no1% : top no%,y% : left no%,150 : width no%,200
      y% = y% + 22
    end_if
  next i%
  y% = y% + 22
  no% = no% + 1 : button no% : parent no%,no1% : top no%,y% : left no%,150 : caption no%,"Créer" : on_click no%,CreerEnregistrement
  PageAjouterNouvelle% = 0
'   no% = no% + 1 : button no% : parent no%,no1% : top no%,y% : left no%,350 : width no%,200 : caption no%,"Créer 5 enregistrements" : on_click no%,Creer5Enregistrements
end_sub

sub CreerChampsVisualiser()
  dim_local w%, h%, i%, tag$, n%, s$
  no% = PageVisualiserBase% : no1% = no%
  if object_exists(no%)=1 then delete no%
  container no% : full_space no% : caption no%,"Visualiser les données d'une base"
  w% = width(PageVisualiserBase%) : h% = height(PageVisualiserBase%) : hide no%
  no% = no% + 1 : grid no% : parent no%,no1% : top no%,20 : left no%,20 : no_VisDonnees% = no% : on_click no%,ClickVisualiserChamp
    width no%,w%-30 : height no%,h%-100
    grid_row no%,NombreEnregistrements%+10 : grid_column no%,NombreChamps%+1
    grid_write no%,1,1,"#"
    for i%=1 to NombreChamps%
      grid_write no%,1,i%+1,NomChamp$(i%)
    next i%

  tag$ = text$(no_CrCles%)
  if tag$="" then tag$ = text$(no_DefCles%)
  res% = dll_call3("CheetahGetTag",adr(tag$),HandleIndex%,adr(HandleTag%))
  if res%<>0
    ErreurCheetah("CheetahGetTag",res%)
    exit_sub
  end_if
  
  h% = 20+height(no_VisDonnees%)+10
  no% = no% + 1 : alpha no% : parent no%,no1% : top no%,h% : left no%,20 : caption no%,"Trier selon:"
  no% = no% + 1 : combo no% : parent no%,no1% : top no%,h% : left no%,80 : width no%,200 : no_VisTag% = no%
  for i%=1 to NombreCles%
    tag$ = text$(no_CrCles%+i%-1)
    if tag$="" then tag$ = text$(no_DefCles%+i%-1)
    item_add no%,tag$
  next i%
  text no%,item_read$(no%,1)
  no% = no% + 1 : button no% : parent no%,no1% : top no%,h% : left no%,290 : caption no%,"Trier" : on_click no%,Trier
  no% = no% + 1 : button no% : parent no%,no1% : top no%,h% : left no%,490 : caption no%,"Supprimer tout" : on_click no%,SupprimerTout
  no% = no% + 1 : button no% : parent no%,no1% : top no%,h% : left no%,590 : caption no%,"Réindexer" : on_click no%,Reindexer

  Visualiser()

  PageVisualiserNouvelle% = 0
end_sub

sub visualiser()
  dim_local w%, h%, i%, tag$, n%, s$, nc%
  res% = dll_call4("CheetahMove",HandleBase%,HandleTag%,XDB_MOVEFIRST%,adr(n%))
  if res%<>0
    ErreurCheetah("CheetahMove",res%)
    exit_sub
  end_if

  i% = 1
  while res%=0
    res% = dll_call3("CheetahGetRecord",HandleBase%,n%,0)
    if res%<>0
      if res%<>1014 then ErreurCheetah("CheetahGetRecord",res%)
      exit_sub
    end_if
    i% = i% + 1
    if dll_call1("CheetahIsDeleted",HandleBase%)=0
      grid_write no_VisDonnees%,i%,1,str$(i%-1)
      for nc%=1 to NombreChamps%
        if TypeChamp$(nc%)="M"
          s$ = string$(5000," ")
        else
          s$ = string$(LongueurChamp%(1)," ")
        end_if
        n% = nc%
        res% = dll_call5("CheetahGetField",HandleBase%,0,adr(n%),0,adr(s$))
        grid_write no_VisDonnees%,i%,n%+1,trim$(s$)
      next nc%
    End_If


    ' You can use the %XDB_MOVENEXT_ATOMIC move ONLY if you know
    ' that the most previous inkey key position has not changed. A %XDB_MOVENEXT
    ' performs a seek prior to doing the move to the next key. The %XDB_MOVENEXT_ATOMIC
    ' does not do the seek and assumes that the key position is valid.
    res% = dll_call4("CheetahMove",HandleBase%,HandleTag%,XDB_MOVENEXT_ATOMIC%,adr(n%))
    ' res% = dll_call4("CheetahMove",HandleBase%,HandleTag%,XDB_MOVENEXT%,adr(n%))
  end_while
end_sub

sub Trier()
  dim_local tag$
  tag$ = text$(no_VisTag%)
  res% = dll_call3("CheetahGetTag",adr(tag$),HandleIndex%,adr(HandleTag%))
  if res%<>0
    ErreurCheetah("CheetahGetTag",res%)
    exit_sub
  end_if

  Visualiser()

end_sub

sub CreerEnregistrement(mes%)
  dim_local nomchamp$, textechamp$, nchamp%
  res% = dll_call1("CheetahClearBuffer",HandleBase%)
  if res%<>0
    ErreurCheetah("CheetahClearBuffer",res%)
    exit_sub
  end_if
  
  for i%=1 to NombreChamps%
    nomchamp$ = caption$(PageAjouterBase%+i%)
    textechamp$ = text$(PageAjouterChamps%+i%)
    nchamp% = i%
    res% = dll_call4("CheetahSetField",HandleBase%,adr(nomchamp$),adr(nchamp%),adr(textechamp$))
  if res%<>0
      ErreurCheetah("CheetahSetField champ "+str$(i%),res%)
      exit_sub
    end_if
  next i%
  
  res% = dll_call2("CheetahPutRecord",HandleBase%,0)
  if res%<>0
    ErreurCheetah("CheetahPutRecord",res%)
    exit_sub
  end_if
  if mes%=1 then message "Enregistrement ajouté."
end_sub

sub Creer5Enregistrements()
  dim_local i%
  
  if message_confirmation_yes_no("5 enregistrements prédéfinis vont être ajoutés. D'accord ?")<>1 then exit_sub
  
  text PageAjouterChamps%+1,"Martin"
  text PageAjouterChamps%+2,"83345"
  text PageAjouterChamps%+3,"Dupont"
  text PageAjouterChamps%+4,"5 Rue des Fleurs"
  text PageAjouterChamps%+5,"2017/01/18"
  text PageAjouterChamps%+6,"Vergnes"
  CreerEnregistrement(0)
  
  text PageAjouterChamps%+1,"Jeanne"
  text PageAjouterChamps%+2,"23456"
  text PageAjouterChamps%+3,"Fermant"
  text PageAjouterChamps%+4,"17 bld de la République"
  text PageAjouterChamps%+5,"2016/05/23"
  text PageAjouterChamps%+6,"Bouvant"
  CreerEnregistrement(0)

  text PageAjouterChamps%+1,"Alain"
  text PageAjouterChamps%+2,"70250"
  text PageAjouterChamps%+3,"Dupont"
  text PageAjouterChamps%+4,"17 Place de la Tour"
  text PageAjouterChamps%+5,"2017/01/18"
  text PageAjouterChamps%+6,"Bordes"
  CreerEnregistrement(0)

  text PageAjouterChamps%+1,"Thérèse"
  text PageAjouterChamps%+2,"33027"
  text PageAjouterChamps%+3,"Rouvier"
  text PageAjouterChamps%+4,"188 rue de la Gare"
  text PageAjouterChamps%+5,"2015/10/05"
  text PageAjouterChamps%+6,"Calais"
  CreerEnregistrement(0)

  text PageAjouterChamps%+1,"Jean-Pierre"
  text PageAjouterChamps%+2,"28510"
  text PageAjouterChamps%+3,"Fermant"
  text PageAjouterChamps%+4,"Lieu-dit La Boulangère"
  text PageAjouterChamps%+5,"2015/11/17"
  text PageAjouterChamps%+6,"Tortiers"
  CreerEnregistrement(0)

  message "Les 5 nregistrements prédéfinis ont été ajoutés."
  
end_sub

sub SupprimerTout()
  if message_confirmation_yes_no("Voulez-vous vraiment supprimer tous les enregistrements ?")<>1 then exit_sub
  res% = dll_call1("CheetahZap",HandleBase%)
  if res%<>0
    ErreurCheetah("CheetahZap",res%)
    return
  end_if
  visualiser()
end_sub

sub Reindexer()
  if message_confirmation_yes_no("Voulez-vous vraiment réindexer la base ?")<>1 then exit_sub
  res% = dll_call1("CheetahReindex",HandleBase%)
  if res%<>0
    ErreurCheetah("CheetahReindex",res%)
    return
  end_if
  visualiser()
end_sub

sub ClickVisualiserChamp()
  dim_local x%, y%, l%, c%
  x% = mouse_x_left_down(number_click)
  y% = mouse_y_left_down(number_click)
  c% = grid_x_to_column(no_VisDonnees%,x%)
  l% = grid_y_to_row(no_VisDonnees%,y%)
  message grid_read$(no_VisDonnees%,l%,c%)
  
end_sub

J'espère que cela vous inspirera. Je fournirai de plus amples explications ultérieurement. Sachez également que plusieurs bases de données peuvent être utilisées simultanément dans le même programme. Ce n'est pas limité à ce niveau.

EDIT

Pour le moment, la base de données doit être de type DBASE. La partie FOXPRO est codée, mais pas encore testée. Mais même avec la partie DBASE, c'est assez spectaculaire. Mensez seulement que vous pouvez avoir un champ de type MEMO dans lequel on peut mettre de textes de n'importe quel longueur... Sur le WebDav, dans le sousdossier Panoramic que j'ai mentionné, il y a une base de données exemple avec 3 enregistrements très simples: juste un champ qui sert de clé, puis un mémo. Et le 3ème enregistrement contient le code source du programme ci-dessus (pas tout à fait la dernière version), et en cliquant sur la cellule du grid de visualisation, un a une idée de ce que ça représente...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: re   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 11:30

@Klaus,

Bonne année à toi et bon retour parmis nous.

Si tu as suivi le le forum, tu as du voir que notre ami Minibug a pris une décision
un peu moins radicale que certain mais bon...
https://panoramic.1fr1.net/t4255p650-gestionnaire-de-projets-panoramic
Sad
Tu as du voir aussi que nous avons changé de version de Panoramic
https://panoramic.1fr1.net/t5080-version-instantanee-du-16-01-2017-panoramic-v-0-9-27i10
et, il me semble que quelques nouveautés vont te rendre la dll plus facile...
Laughing
En tout cas, je suis content de te relire et te savoir en forme.
Je vais regarder ces nouveautés.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 12:02

Oui, j'ai lu tout ce qui s'est passé sur le forum, depuis ma pause pour raisins familiales. Et je suis surpris, déçu et triste pour la décision de Minibug. Mais c'est son choix et je le respecte. Cependant, lorsqu'iil dit:
Citation :
J'ai rencontré aussi des dysfonctionnements avec KGF qui ne viennent pas de mon PC puisque testé sur différentes machines et différents programmes.
L'absence de Klaus, me montre aussi à quel point on devient dépendent de la dll KGF. Et comme il n'est plus aussi souvent là c'est plus compliqué...
j'ai les remarques suivantes à faire:
- problèmes avec KGF.dll ? Possible. Personne ne peut garantir un logiciel sans bugs. Mais j'ai toujours été présent et réactif pour corriger les bugs, et je continuerai dans ce sens.
-dépendance de KGF.dll ? Oui, certes... mais on est dépendant de Panoramic également, à mon humble avis. Il y a également des bugs, et le forum en est plein depuis un mois que j'ai pris un peu de recul, et ça n'arrête personne. Tout le monde sait que Jack sera présent selon ses disponibilités et qu'il fera de son mieux pour faire vivre son bébé. La nouvelle versioin en est la preuve éclatante. Il en est de même pour moi, et Cheetah en est également la preuve... Smile Smile Smile

Et oui, j'ai vu la nouvelle version de Panoramic. Je l'ai tétéchargée et installée et je suis en train de l'évaluer. Il y aura prochainement des nouvelles. Clairement, je vois déjà que certaines fonctions de KGF.dll sont devenues obsolètes: SelectListBoxItem et SelectComboBoxItem par exemple, puisque Panoramic a maintenant la commande ITEM_SELECT qui fait exactement la même chose.

Alors, oui, KGF.dll continue
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: re   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 12:10

Pour moi, même si parfois on a des bizarreries  Laughing, KGF rempli très bien le rôle que j' y donne. 
C' est à dire un complément de Panoramic le temps que Jack puisse mettre les fonctions,commandes et autres 
en langage Panoramic et avoir accès à des possibilités dont Panoramic ne pourra pas nous faire profiter.

Alors, vas y! continues! on ne manquera pas de défis à te lancer d' ici quelques années...
lol!
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 13:57

Bonjour à tous,

Klaus, en réponse à Minibug, a écrit:
-dépendance de KGF.dll ? Oui, certes... mais on est dépendant de Panoramic également, à mon humble avis. Il y a également des bugs, et le forum en est plein depuis un mois que j'ai pris un peu de recul, et ça n'arrête personne. Tout le monde sait que Jack sera présent selon ses disponibilités et qu'il fera de son mieux pour faire vivre son bébé.

Je souscris à cette analyse à 100%:
on est dépendant de Panoramic également.  C'est très vrai ! et il faut savoir se désintoxiquer de temps en temps !
Il y a également des bugs, le forum en est plein depuis un mois que j'ai pris un peu de recul, et ça n'arrête personne,  Tout le monde sait que Jack sera présent.... Ben oui, et on ne lâchera rien  !
Very Happy
A+
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 22 Jan 2017 - 23:37

Dans mon WebDav, il y a un dossier DllViewer, dans lequel se trouve l'utilitaire DllViewer (réalisé en Delphi par moi) qui permet de visualiser la liste des fonctions exportées par une DLL. Cet utilitaire a maintenant un nouveau bouton qui apparaît lorsqu'on charge une DLL. Ce bouton permet d'exporter cette liste de symboles dans un fichier texte.

Je l'ai appliqué sur KGF.dll. On a maintenant 965 fonctions à disposition !

Depuis début 2010, cela fait une moyenne de 150 fonctions par an...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 Empty

Revenir en haut Aller en bas
 
KGF_dll - nouvelles versions
Revenir en haut 
Page 39 sur 40Aller à la page : Précédent  1 ... 21 ... 38, 39, 40  Suivant
 Sujets similaires
-
» Nouvelles versions
» KGF_dll - nouvelles versions
» KGF_dll - nouvelles versions
» Synedit_Editor - nouvelles versions
» KGF_dll - nouvelles versions

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Activité des sites créés par les Panoramiciens. :: Le site de Klaus-
Sauter vers: