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
» Logiciel de planétarium.
KGF_dll - nouvelles versions - Page 39 Emptypar Pedro Aujourd'hui à 8:08

» Un autre pense-bête...
KGF_dll - nouvelles versions - Page 39 Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
KGF_dll - nouvelles versions - Page 39 Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
KGF_dll - nouvelles versions - Page 39 Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
KGF_dll - nouvelles versions - Page 39 Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
KGF_dll - nouvelles versions - Page 39 Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
KGF_dll - nouvelles versions - Page 39 Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
KGF_dll - nouvelles versions - Page 39 Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
KGF_dll - nouvelles versions - Page 39 Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
KGF_dll - nouvelles versions - Page 39 Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
KGF_dll - nouvelles versions - Page 39 Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
KGF_dll - nouvelles versions - Page 39 Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
KGF_dll - nouvelles versions - Page 39 Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -28%
-28% Machine à café avec broyeur ...
Voir le deal
229.99 €

 

 KGF_dll - nouvelles versions

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

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyJeu 10 Déc 2020 - 1:24

KGF.dll V9.42 du 10/12/2020

Nouveautés:
- EvaluateExpression: le message d'erreur en cas de fonction invalide est supprimé.

Modules modifiés:
KGF.dll

La doc est inchangée.

C'est une simple mise à jour technique sans changements de fonctionnalités.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 10 Jan 2021 - 10:13

KGF.dll V9.43 du 10/01/2021

Nouveautés:
- nouvel objet: KGFFileStream et ses fonctions de support
- nouvel objet: MemoryTree et ses fonctions de support
- nouvelles fonctions: ExpandTreeView, LoadTreeViewFromText


Modules modifiés:
KGF.dll
KGF.chm


La doc est à jour.

Ceci est une mise à jour majeure !

Les deux nouvelles fonctions concernant TreeView sont des extensions de fonctionnalités pour un objet existant.

Par contre, les deux nouveaux objets représentent un ajout important dont vous ne découvrirez l'utilité que progressivement.

D'abord, MemoryTree:
C'est un objet similaire à TreeView, mais c'est un objet non-visuel. Il est géré uniquement en mémoire. Pour afficher son contenu, on peut utiliser on MEMO ou un LIST Panoramic, ou un TreeView de KGF.dll. Cet objet sert à gérer des structures logiques arborescentes, sans avoir à se soucier de la présentation visuelle. Les domaines d'application sont vastes: généalogie, pièces détachées, gestion de projets (notamment en développement !), organigrammes d'entreprise avec les personnes attachées à chaque service, etc.

Voici une démo. Cliquez sur "Créer", puis "Peupler". Rien ne semble se passer puisque c'est un objet non visuel. Pourtant, une structure logique arborescente est bien créée. Cliquez alors sur "Afficher" et vous verrez le résultat. On peut ensuite naviguer la la structure avec les boutons présents, la modifier ou cliquer sur un des éléments affichés. La structure est ajustée et l'affichage est chaue fois automatiquement corrigé.
Code:
' test_MemoryTree.bas

' Ce programme de démo montre les fonctionnalités de l'objet MemoryTree.
' Toutes les fonctions agissent uniquement sur l'objet non visuel en mémoire.
' Pour visualiser le résultat, un objet Panoramic MEMO est utilisé pour afficher
' le texte courant tu MemoryTree, et un objet TreeView de KGF.dll est utilisé
' pour représenter ce contenu visuellement sous la forme d'un arbre.
' Les noeuds dans l'objet TreeView peuvent être sélectionnés par un clic gauche.
' Le noeud ainsi sélectionné devient le noeud sur lequel certaines actions
' s'appliquent, comme "Soeur suivant", "Parent", "Insérer" etc.

label close0, eventTV
label creMT, delMT, fillMT, affMT, foldMT, expMT, frMT, nrMT, prMT
label parMT, cldMT, fsMT, nsMT, psMT, insMT, chgMT
                    
dim MT%, TV%, MTN%, rootMT%, nodeMT%
dim MTNeurope%, MTNfrance%, MTNvilles%, MTNfleuves%, MTNallemagne%
dim res%, fill%, M1%, txt$, n%, i%, s$, ind%, stack%(100), sp%, p%
M1% = 0 - 1
fill% = 0
sp% = -1

full_space 0
on_close 0,close0

button 1 : top 1,10 : left 1,10 : caption 1,"Créer" : on_click 1,creMT
button 2 : top 2,10 : left 2,left(1)+width(1)+10 : caption 2,"Supprimer" : on_click 2,delMT
button 3 : top 3,10 : left 3,left(2)+width(2)+10 : caption 3,"Peupler" : on_click 3,fillMT

memo 20 : top 20,70 : left 20,330 : width 20,300 : height 20,500 : bar_both 20
button 21 : top 21,70 : left 21,left(20)+width(20)+20 : caption 21,"Afficher" : on_click 21,affMT
button 22 : top 22,70 : left 22,left(21)+width(21)+20 : caption 22,"Plier" : on_click 22,foldMT
button 23 : top 23,70 : left 23,left(22)+width(22)+20 : caption 23,"Etendre" : on_click 23,expMT

button 31 : top 31,100 : left 31,left(20)+width(20)+20 : caption 31,"Racine 0" : on_click 31,frMT
button 32 : top 32,100 : left 32,left(31)+width(31)+20 : caption 32,"Racine suiv" : on_click 32,nrMT
button 33 : top 33,100 : left 33,left(32)+width(32)+20 : caption 33,"Racine préc" : on_click 33,prMT

button 41 : top 41,130 : left 41,left(20)+width(20)+20 : caption 41,"Parent" : on_click 41,parMT

button 51 : top 51,160 : left 51,left(20)+width(20)+20 : caption 51,"Soeur 0" : on_click 51,fsMT
button 52 : top 52,160 : left 52,left(51)+width(51)+20 : caption 52,"Soeur suiv" : on_click 52,nsMT
button 53 : top 53,160 : left 53,left(52)+width(52)+20 : caption 53,"Soeur préc" : on_click 53,psMT

button 61 : top 61,190 : left 61,left(20)+width(20)+20 : caption 61,"Enfant" : on_click 61,cldMT


alpha 71 :  top 71,300 : left 71,left(20)+width(20)+20 : caption 71,"Insérer devant noeud sélectionné:"
edit 72 :   top 72,320 : left 72,left(20)+width(20)+20 : width 72,300
button 73 : top 73,320 : left 73,left(72)+width(72)+20 : caption 73,"Insérer" : on_click 73,insMT
alpha 81 :  top 81,350 : left 81,left(20)+width(20)+20 : caption 81,"Changer le texte du noeud sélectionné:"
edit 82 :   top 82,370 : left 82,left(20)+width(20)+20 : width 82,300
button 83 : top 83,370 : left 83,left(82)+width(82)+20 : caption 83,"Insérer" : on_click 83,chgMT

edit 99 : hide 99 :on_change 99,eventTV

dll_on "KGF.dll"

TV% = dll_call3("CreateTreeViewEx",handle(0),17,M1%)
res% = dll_call5("ResizeTreeView",TV%,70,10,300,500)
res% = dll_call4("SetTreeViewOptions",TV%,1,3,hex("FF0000"))
res% = dll_call4("SetTreeViewOptions",TV%,1,4,3)

res% = dll_call3("SetTreeViewEventReceiver",TV%,1,handle(99))

end      

close0:
  if TV%<>0 then res% = dll_call3("SetTreeViewEventReceiver",TV%,0,0)
  if MT%<>0 then MT% = dll_call1("DeleteMemoryTree",MT%)            
  if TV%<>0 then TV% = dll_call2("DeleteTreeView",TV%,1)            
  return
  
eventTV:
  s$ = text$(99)
  if left$(s$,6)<>"click," then return
  s$ = Mid$(s$,7,len(s$))
  p% = instr(s$,",")
  ind% = val(left$(s$,p%-1))
  nodeMT% = dll_call2("SelectMemoryTreeNodeByIndex",MT%,ind%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
                    
creMT:
  MT% = dll_call0("CreateMemoryTree")
  fill% = 0
  ' *** visualisation
  clear 20
  return
  
delMT:
  MT% = dll_call1("DeleteMemoryTree",MT%)
  fill% = 0
  ' *** visualisation
  clear 20
  res% = dll_call1("ClearTreeView",TV%)
  return  
  
fillMT:
  if fill%<>0 then return
  txt$ = "Europe"
  MTNeurope% = dll_call2("AddMemoryTreeRootNode",MT%,adr(txt$))
  txt$ = "France"
  MTNfrance% = dll_call3("AddMemoryTreeNode",MT%,MTNeurope%,adr(txt$))
  txt$ = "Villes"
  MTNvilles% = dll_call3("AddMemoryTreeNode",MT%,MTNfrance%,adr(txt$))
  txt$ = "Paris"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Lyon"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Marseilles"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Fleuves"
  MTNfleuves% = dll_call3("AddMemoryTreeNode",MT%,MTNfrance%,adr(txt$))
  txt$ = "Seine"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Loire"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Allemagne"
  MTNallemagne% = dll_call3("AddMemoryTreeNode",MT%,MTNeurope%,adr(txt$))
  txt$ = "Villes"
  MTNvilles% = dll_call3("AddMemoryTreeNode",MT%,MTNallemagne%,adr(txt$))
  txt$ = "Berlin"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Hambourg"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Munique"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Fleuves"
  MTNfleuves% = dll_call3("AddMemoryTreeNode",MT%,MTNallemagne%,adr(txt$))
  txt$ = "Danube"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Weser"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
'   rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,0,0)
  fill% = 1
  return                  
              
affMT:
  ' *** visualisation
  if MT%=0 then return
  res% = dll_call1("ClearTreeView",TV%)
  res% = dll_call2("GetMemoryTreeText",MT%,handle(20))
  res% = dll_call2("LoadTreeViewFromText",TV%,handle(20))
  if count(20)>0
    for i%=1 to count(20)
      s$ = item_read$(20,i%)
      p% = instr(s$,",")
      s$ = string$(val(left$(s$,p%-1))*4+1," ") + mid$(s$,p%+1,len(s$))
      item_delete 20,i%
      item_insert 20,i%,s$
    next i%
  end_if
  res% = dll_call2("ExpandTreeView",TV%,1)
  return      
                    
foldMT:
  ' *** visualisation
  res% = dll_call2("ExpandTreeView",TV%,0)
  return

expMT:
  ' *** visualisation
  res% = dll_call2("ExpandTreeView",TV%,1)
  return

frMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,0,0)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
  
nrMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,rootMT%,1)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
  
prMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,rootMT%,2)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
  
parMT:
  nodeMT% = dll_call2("GetMemoryTreeNodeParent",MT%,nodeMT%)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
cldMT:
  nodeMT% = dll_call2("GetMemoryTreeFirstChildNode",MT%,nodeMT%)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
fsMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,0)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
nsMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,1)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
psMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,2)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
insMT:
  if nodeMT%=0 then return
  txt$ = text$(72)
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  nodeMT% = dll_call3("InsertMemoryTreeNode",MT%,nodeMT%,adr(txt$))
  ' *** visualisation
  gosub affMT
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
  
chgMT:
  if nodeMT%=0 then return
  txt$ = text$(72)
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("ChangeMemoTreeNodeText",MT%,nodeMT%,adr(txt$))
  ' *** visualisation
  gosub affMT
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return

Ensuite, KGFFileStream.
Cet objet est un nouveau moyen d'écrire des données dans un fichier et de les relire. Un tel objet gère un fichier "container" dans lequel on peut placer des variables simples Panoramic, des tableaux (unidimensionnels) Panoramic ainsi que des fichiers. L'objet gère un répertoire des données qu'il contient et on peut à tout moment récupérer une donnée spécifique. C'est idéal pour sauvegarder des données hétéroclites d'une application dans un seul fichier. Facilité de distriutioin d'un logiciel, simplification des saivegardes, sauvegarde de l'état d'un programme puisqu'on peut y placer des variables Panoramic, etc. Les applications sont vastes.
Voici une démo. L'utilisation est simple et découle directement des libellés de boutons.
Code:
' test_KGFFileStream.bas

label creer, fermer, openread, openmaj
label addtext, addinteger, addfloat, addtextarray, addintegerarray, addfloatarray
label infos, getsegment

dim res%, FS%, nom$, nom1$, txt$, ident$, n%, v, seg%, index%, segtype%
dim textarray$(4), integerarray%(3), floatarray(5)

dll_on "KGF.dll"

full_space 0

button 1 : top 1,10 : left 1,10 : width 1,130 : caption 1,"Créer FileStream" : on_click 1,creer
button 2 : top 2,10 : left 2,150 : width 2,130 : caption 2,"Fermer FileStream" : on_click 2,fermer
button 3 : top 3,10 : left 3,290 : width 3,130 : caption 3,"Ouvrir lecture" : on_click 3,openread
button 4 : top 4,10 : left 4,430 : width 4,130 : caption 4,"Ouvrir mise à jour" : on_click 4,openmaj

button 11 : top 11,40 : left 11,10 : width 11,130 : caption 11,"Ajouter texte" : on_click 11,addtext
button 12 : top 12,40 : left 12,150 : width 12,130 : caption 12,"Ajouter integer" : on_click 12,addinteger
button 13 : top 13,40 : left 13,290 : width 13,130 : caption 13,"Ajouter float" : on_click 13,addfloat
button 14 : top 14,40 : left 14,430 : width 14,130 : caption 14,"Ajouter array texte" : on_click 14,addtextarray
button 15 : top 15,40 : left 15,570 : width 15,130 : caption 15,"Ajouter array integer" : on_click 15,addintegerarray
button 16 : top 16,40 : left 16,710 : width 16,130 : caption 16,"Ajouter array float" : on_click 16,addfloatarray

button 21 : top 21,70 : left 21,10 : width 21,130 : caption 21,"Infos" : on_click 21,infos

alpha 31 : top 31,110 :left 31,10 : caption 31,"Index:"
spin 32 : top 32,110 : left 32,50 : width 32,80 : min 32,1 : max 32,1000 : text 32,"1"
button 33 : top 33,110 : left 33,150 : width 33,130 : caption 33,"Lire Segment" : on_click 33,getsegment
          
memo 100 : top 100,150 : left 100,10 : width 100,400 : height 100,height_client(0)-160 : bar_both 100  

seg% = 0        
end
              
creer:
  nom$ = "TestFileStream.fst"
  FS% = dll_call2("CreateKGFFileStream",adr(nom$),0)
  message str$(FS%)
  seg% = 0
  return  
  
fermer:
  FS% = dll_call1("CloseKGFFileStream",FS%)
  message str$(FS%)
  return
  
openread:
  nom$ = "TestFileStream.fst"
  FS% = dll_call2("CreateKGFFileStream",adr(nom$),1)
  message str$(FS%)
  seg% = 0
  return

openmaj:
  nom$ = "TestFileStream.fst"
  FS% = dll_call2("CreateKGFFileStream",adr(nom$),3)
  message str$(FS%)
  seg% = 0
  return

addtext:
  nom1$ = "Texte de démo"
  txt$ = "Ceci est un texte de démo."+chr$(13)+chr$(10)+"Il a 2 lignes."
  
  res% = dll_call4("AppendSegmentToKGFFileStream",FS%,0,adr(nom1$),adr(txt$))
  message str$(res%)
  
  return
  
addinteger:
  nom1$ = "Entier 123"
  n% = 123
  
  res% = dll_call4("AppendSegmentToKGFFileStream",FS%,1,adr(nom1$),adr(n%))
  message str$(res%)
  
  return
  
addfloat:
  nom1$ = "flottant Pi"
  v = pi
  
  res% = dll_call4("AppendSegmentToKGFFileStream",FS%,2,adr(nom1$),adr(v))
  message str$(res%)
  
  return
  
addtextarray:  
  textarray$(0) = "Ceci est"
  textarray$(1) = "un des éléments"
  textarray$(2) = "d'un tableau texte"
  textarray$(3) = "avec 5 éléments."
  textarray$(4) = "*** fin des éléments***"
  
  nom1$ = "text array 5 éléments"
  res% = dll_call5("AppendArraySegmentToKGFFileStream",FS%,4,adr(nom1$),5,adr(textarray$))
  message str$(res%)

  return
  
addintegerarray:
  integerarray%(0) = 17
  integerarray%(1) = 23
  integerarray%(2) = 29
  integerarray%(3) = 31
  
  nom1$ = "integer array 4 éléments"
  res% = dll_call5("AppendArraySegmentToKGFFileStream",FS%,5,adr(nom1$),5,adr(integerarray%))
  message str$(res%)

  return
  
addfloatarray:  
  floatarray(0) = 1*pi
  floatarray(1) = 2*pi
  floatarray(2) = 3*pi
  floatarray(3) = 4*pi
  floatarray(4) = 5*pi
  floatarray(5) = 6*pi
  
  nom1$ = "float array 6 éléments"
  res% = dll_call5("AppendArraySegmentToKGFFileStream",FS%,6,adr(nom1$),6,adr(floatarray))
  message str$(res%)

  return
  
  
infos:
  res% = dll_call2("GetKGFFileStreamDirectory",FS%,handle(100))
  message str$(res%)
  return
  
getsegment:
  index% = val(text$(32))
  segtype% = dll_call2("GetKGFFileStreamSegmentType",FS%,index%)
  if segtype%<0
    if segtype%=-1
      message "Ce fichier ne contient aucun segment"
    else
      message "Index hors limites - doit être entre 1 et "+str$(0-segType%-1)
    end_if
    return
  end_if  
  
  select segtype%
    case 0: ' TEXT
      ' il faut donner un espace suffisant pour recevoir le string !
      txt$ = string$(500," ")
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(txt$))
      message str$(res%)+"   "+trim$(txt$)
      return
    case 1: ' INTEGER
      ' effacement des données est inutile - juste pourprouver que la restauration a bien eu lieu
      n% = 0
      res% = dll_call3("ExtracKGFtFileStreamSegment",FS%,index%,adr(n%))
      message str$(res%)+"   "+str$(n%)
      return
    case 2: ' FLOAT
      ' effacement des données est inutile - juste pourprouver que la restauration a bien eu lieu
      v = 0
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(v))
      message str$(res%)+"   "+str$(v)
      return
    case 3: ' FILE
      nom$ = 'FichierEnSortie.dat"
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(nom$))
      if res%=0 then message str$(res%)+"   enregistré dans "+nom$
      if res%<0 then message str$(res%)
      return
    case 4: ' TEXTARRAY
      textarray$(0) = "        "
      textarray$(1) = "               "
      textarray$(2) = "                  "
      textarray$(3) = "                "
      textarray$(4) = "                       "
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(textArray$))   : '      retour en textArray$
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,handle(100))       : '      retour en mémo
      message str$(res%)+"  "+textarray$(0)+chr$(13)+chr$(10)+textarray$(1)+chr$(13)+chr$(10)+textarray$(2)+chr$(13)+chr$(10)+textarray$(3)+chr$(13)+chr$(10)+textarray$(4)
      return
    case 5: ' INTEGERARRAY
      ' effacement des données est inutile - juste pourprouver que la restauration a bien eu lieu
      integerarray%(0) = 0
      integerarray%(1) = 0
      integerarray%(2) = 0
      integerarray%(3) = 0
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(integerarray%))
      message str$(res%)+"   "+str$(integerarray%(0))+" "+str$(integerarray%(1))+" "+str$(integerarray%(2))+" "+str$(integerarray%(3))
      return
    case 6: ' FLOATARRAY
      ' effacement des données est inutile - juste pourprouver que la restauration a bien eu lieu
      floatarray(0) = 0
      floatarray(1) = 0
      floatarray(2) = 0
      floatarray(3) = 0
      floatarray(4) = 0
      floatarray(5) = 0
      res% = dll_call3("ExtractKGFFileStreamSegment",FS%,index%,adr(floatarray))
      message str$(res%)+"   "+str$(floatarray(0))+" "+str$(floatarray(1))+" "+str$(floatarray(2))+" "+str$(floatarray(3))+" "+str$(floatarray(4))+" "+str$(floatarray(5))
      return
  end_select
  message "Oups... type de segment non prévu: "+str$(segtype%)
  return

Initialement, j'avais prévu de publier cela luste avant Noël, en guise de cadeau. Mais la fabrication de la doc m'a pris beaucoup plus de temps que prévu. Donc, ce sera ma contribution pour ouvrir cette Nouvelle Année en beauté, en y ajoutant une pointe de créativité et d'optimisme.

Une excellente Nouvelle Année 2021 à tous les Panoramiciens !


Dernière édition par Klaus le Mar 12 Jan 2021 - 13:19, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyLun 11 Jan 2021 - 18:12

KGF.dll V9.43 du 10/01/2021

Nouveautés:
- nouvelles fonctions: ChangeMemoryTreeNodeStringData, GetMemoryTreeNodeStringData

Modules modifiés:
KGF.dll
KGF.chm


La doc est à jour.

Ceci est un petit ajout à l'objet MemoryTree. Maintenant, chaque noeud peut avoir des données optionnelles sous forme d'une chaîne de caractères non limitée. Ces données sont optionnelles et ne changent la structure en rien. Elles sont distinctes du nom du noeud (de son libellé). Ces fonctions permettent de changer les données texte pour un noeud et de les relire.

Le programme de démo a été étendu à ces nouvelles fonctions:
Code:
' test_MemoryTree.bas

' Ce programme de démo montre les fonctionnalités de l'objet MemoryTree.
' Toutes les fonctions agissent uniquement sur l'objet non visuel en mémoire.
' Pour visualiser le résultat, un objet Panoramic MEMO est utilisé pour afficher
' le texte courant tu MemoryTree, et un objet TreeView de KGF.dll est utilisé
' pour représenter ce contenu visuellement sous la forme d'un arbre.
' Les noeuds dans l'objet TreeView peuvent être sélectionnés par un clic gauche.
' Le noeud ainsi sélectionné devient le noeud sur lequel certaines actions
' s'appliquent, comme "Soeur suivant", "Parent", "Insérer" etc.
' Ob peut affecter une chaîne de caractères aux données "string" d'un noeud.
' Le clic sur un noeud à gauche affiche également les données string du noeud (s'il y en a).

label close0, eventTV
label creMT, delMT, fillMT, affMT, foldMT, expMT, frMT, nrMT, prMT
label parMT, cldMT, fsMT, nsMT, psMT, insMT, chgMT, chgMS
                   
dim MT%, TV%, MTN%, rootMT%, nodeMT%
dim MTNeurope%, MTNfrance%, MTNvilles%, MTNfleuves%, MTNallemagne%
dim res%, fill%, M1%, txt$, n%, i%, s$, ind%, stack%(100), sp%, p%
M1% = 0 - 1
fill% = 0
sp% = -1

full_space 0
on_close 0,close0

button 1 : top 1,10 : left 1,10 : caption 1,"Créer" : on_click 1,creMT
button 2 : top 2,10 : left 2,left(1)+width(1)+10 : caption 2,"Supprimer" : on_click 2,delMT
button 3 : top 3,10 : left 3,left(2)+width(2)+10 : caption 3,"Peupler" : on_click 3,fillMT

memo 20 : top 20,70 : left 20,330 : width 20,300 : height 20,500 : bar_both 20
button 21 : top 21,70 : left 21,left(20)+width(20)+20 : caption 21,"Afficher" : on_click 21,affMT
button 22 : top 22,70 : left 22,left(21)+width(21)+20 : caption 22,"Plier" : on_click 22,foldMT
button 23 : top 23,70 : left 23,left(22)+width(22)+20 : caption 23,"Etendre" : on_click 23,expMT

button 31 : top 31,100 : left 31,left(20)+width(20)+20 : caption 31,"Racine 0" : on_click 31,frMT
button 32 : top 32,100 : left 32,left(31)+width(31)+20 : caption 32,"Racine suiv" : on_click 32,nrMT
button 33 : top 33,100 : left 33,left(32)+width(32)+20 : caption 33,"Racine préc" : on_click 33,prMT

button 41 : top 41,130 : left 41,left(20)+width(20)+20 : caption 41,"Parent" : on_click 41,parMT

button 51 : top 51,160 : left 51,left(20)+width(20)+20 : caption 51,"Soeur 0" : on_click 51,fsMT
button 52 : top 52,160 : left 52,left(51)+width(51)+20 : caption 52,"Soeur suiv" : on_click 52,nsMT
button 53 : top 53,160 : left 53,left(52)+width(52)+20 : caption 53,"Soeur préc" : on_click 53,psMT

button 61 : top 61,190 : left 61,left(20)+width(20)+20 : caption 61,"Enfant" : on_click 61,cldMT


alpha 71 :  top 71,300 : left 71,left(20)+width(20)+20 : caption 71,"Insérer devant noeud sélectionné:"
edit 72 :  top 72,320 : left 72,left(20)+width(20)+20 : width 72,300
button 73 : top 73,320 : left 73,left(72)+width(72)+20 : caption 73,"Insérer" : on_click 73,insMT
alpha 81 :  top 81,350 : left 81,left(20)+width(20)+20 : caption 81,"Changer le texte du noeud sélectionné:"
edit 82 :  top 82,370 : left 82,left(20)+width(20)+20 : width 82,300
button 83 : top 83,370 : left 83,left(82)+width(82)+20 : caption 83,"Insérer" : on_click 83,chgMT
alpha 91 :  top 91,400 : left 91,left(20)+width(20)+20 : caption 91,"Changer les donnée string du noeud sélectionné:"
edit 92 :  top 92,420 : left 92,left(20)+width(20)+20 : width 92,300
button 93 : top 93,420 : left 93,left(92)+width(92)+20 : caption 93,"Changer" : on_click 93,chgMS

edit 99 : hide 99 :on_change 99,eventTV

dll_on "KGF.dll"

TV% = dll_call3("CreateTreeViewEx",handle(0),17,M1%)
res% = dll_call5("ResizeTreeView",TV%,70,10,300,500)
res% = dll_call4("SetTreeViewOptions",TV%,1,3,hex("FF0000"))
res% = dll_call4("SetTreeViewOptions",TV%,1,4,3)

res% = dll_call3("SetTreeViewEventReceiver",TV%,1,handle(99))

end     

close0:
  if TV%<>0 then res% = dll_call3("SetTreeViewEventReceiver",TV%,0,0)
  if MT%<>0 then MT% = dll_call1("DeleteMemoryTree",MT%)           
  if TV%<>0 then TV% = dll_call2("DeleteTreeView",TV%,1)           
  return
 
eventTV:
  s$ = text$(99)
  if left$(s$,6)<>"click," then return
  s$ = Mid$(s$,7,len(s$))
  p% = instr(s$,",")
  ind% = val(left$(s$,p%-1))
  nodeMT% = dll_call2("SelectMemoryTreeNodeByIndex",MT%,ind%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  txt$ = string$(255," ")
  res% = dll_call3("GetMemoryTreeNodeStringData",MT%,nodeMT%,adr(txt$))
  text 92,trim$(txt$)
  return
                   
creMT:
  MT% = dll_call0("CreateMemoryTree")
  fill% = 0
  ' *** visualisation
  clear 20
  return
 
delMT:
  MT% = dll_call1("DeleteMemoryTree",MT%)
  fill% = 0
  ' *** visualisation
  clear 20
  res% = dll_call1("ClearTreeView",TV%)
  return 
 
fillMT:
  if fill%<>0 then return
  txt$ = "Europe"
  MTNeurope% = dll_call2("AddMemoryTreeRootNode",MT%,adr(txt$))
  txt$ = "France"
  MTNfrance% = dll_call3("AddMemoryTreeNode",MT%,MTNeurope%,adr(txt$))
  txt$ = "Villes"
  MTNvilles% = dll_call3("AddMemoryTreeNode",MT%,MTNfrance%,adr(txt$))
  txt$ = "Paris"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Lyon"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Marseilles"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Fleuves"
  MTNfleuves% = dll_call3("AddMemoryTreeNode",MT%,MTNfrance%,adr(txt$))
  txt$ = "Seine"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Loire"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Allemagne"
  MTNallemagne% = dll_call3("AddMemoryTreeNode",MT%,MTNeurope%,adr(txt$))
  txt$ = "Villes"
  MTNvilles% = dll_call3("AddMemoryTreeNode",MT%,MTNallemagne%,adr(txt$))
  txt$ = "Berlin"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Hambourg"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Munique"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNvilles%,adr(txt$))
  txt$ = "Fleuves"
  MTNfleuves% = dll_call3("AddMemoryTreeNode",MT%,MTNallemagne%,adr(txt$))
  txt$ = "Danube"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
  txt$ = "Weser"
  res% = dll_call3("AddMemoryTreeNode",MT%,MTNfleuves%,adr(txt$))
'  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,0,0)
  fill% = 1
  return                 
             
affMT:
  ' *** visualisation
  if MT%=0 then return
  res% = dll_call1("ClearTreeView",TV%)
  res% = dll_call2("GetMemoryTreeText",MT%,handle(20))
  res% = dll_call2("LoadTreeViewFromText",TV%,handle(20))
  if count(20)>0
    for i%=1 to count(20)
      s$ = item_read$(20,i%)
      p% = instr(s$,",")
      s$ = string$(val(left$(s$,p%-1))*4+1," ") + mid$(s$,p%+1,len(s$))
      item_delete 20,i%
      item_insert 20,i%,s$
    next i%
  end_if
  res% = dll_call2("ExpandTreeView",TV%,1)
  return     
                   
foldMT:
  ' *** visualisation
  res% = dll_call2("ExpandTreeView",TV%,0)
  return

expMT:
  ' *** visualisation
  res% = dll_call2("ExpandTreeView",TV%,1)
  return

frMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,0,0)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
 
nrMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,rootMT%,1)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
 
prMT:
  rootMT% = dll_call3("GetMemoryTreeRootNode",MT%,rootMT%,2)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,rootMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  nodeMT% = rootMT%
  return
 
parMT:
  nodeMT% = dll_call2("GetMemoryTreeNodeParent",MT%,nodeMT%)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
cldMT:
  nodeMT% = dll_call2("GetMemoryTreeFirstChildNode",MT%,nodeMT%)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
fsMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,0)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
nsMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,1)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
psMT:
  nodeMT% = dll_call3("GetMemoryTreeSiblingNode",MT%,nodeMT%,2)
  ' *** visualisation
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
insMT:
  if nodeMT%=0 then return
  txt$ = text$(72)
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  nodeMT% = dll_call3("InsertMemoryTreeNode",MT%,nodeMT%,adr(txt$))
  ' *** visualisation
  gosub affMT
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
chgMT:
  if nodeMT%=0 then return
  txt$ = text$(72)
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("ChangeMemoTreeNodeText",MT%,nodeMT%,adr(txt$))
  ' *** visualisation
  gosub affMT
  ind% = dll_call2("GetMemoryTreeNodeIndex",MT%,nodeMT%)
  res% = dll_call3("SelectTreeViewNode",TV%,ind%,1)
  return
 
chgMS:
  if nodeMT%=0 then return
  txt$ = text$(92)
  res% = dll_call3("ChangeMemoryTreeNodeStringData",MT%,nodeMT%,adr(txt$))
  return 
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyJeu 14 Jan 2021 - 1:17

Merci Klaus !  cheers

C‘est impressionnant !

J’ai relevé deux petites coquilles dans la documentation :

- Fonction AddTreeViewRootNode : un dll_call3(…) au lieu de dll_call4(…)
Spoiler:

- La documentation de LoadTreeViewFromText affiche celle de LoadTreeViewFromFile lorsque l'on passe par "Index > Objet Tree View > LoadTreeViewFromText".
Spoiler:

Autre sujet :
Sous windows 10, la fonction ShowFormScrollBars semble inactive. Elle renvoie bien 0 en retour, mais les scrollbars ne s’affichent pas.

Bonne continuation !
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyJeu 14 Jan 2021 - 2:52

Merci pour tes remarques, Marc !

Les "coquilles" seront corrigées dans la prochaine version.

Je vais approfondir le problème de ShowFormScrollBars - j'ai Windows 10, pas autre chose...
En plus, je viens de voir que la doc de ShowFormScrollBars n'est pas correcte - le copier/coller n'a pas été corrigé jusqu'au bout. Je vais revoir tout ça.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyJeu 14 Jan 2021 - 9:49

Je n'arrive pas à faire marcher FormScrollBars. Je vais retirer cette fonction. Voici comment régler le problème, avec les moyens actuels de KGF.dll:
Code:
' test_ShowFormScrollBars.bas

dim res%, SP1%

dll_on "KGF.dll"

memo 10 : top 10,10 : left 10,width_client(0)-20
font_names_load 10

SP1% = dll_call1("CreateScrollPanel",handle(0))
res% = dll_call5("LocateScrollPanel",SP1%,0,0,width_client(0),height_client(0))
res% = dll_call4("AttachToScrollPanel",SP1%,handle(10),width_client(0)-50,height_client(0)-40)

end

Si tu as plusieurs objets dans la form, ou s'il y a des objets sans handle (ALPHA, ...), alors place-les dans un PANEL et attache le PANEL au ScrollPanel, et le tour est joué.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyJeu 14 Jan 2021 - 15:11

Ok pour tout !

Merci Klaus !
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 19 Jan 2021 - 14:40

KGF.dll V9.45 du 19/01/2021

Nouveautés:
- KGF.ilb: nouvelles icônes 382 à 393 (figures du jeu d'échecs en icônes 16x16)
- nouvelle ilb: Chess_48.ilb = 12 icônes 48x48 des figures du jeu d'échecs
- nouvel objet: ChessBoard et ses fonctions de support
- nouvelles fonctions: CreateChessBoard, SetChessBoardTrace, MoveChessBoardPiece, PopulateChessBoard


Modules modifiés:
KGF.dll
KGF.chm


La doc est à jour.

Cet objet réalise un plateau de jeu d'echecs, avec toutes les pièces qui vont avec. Les pièces sont jouales en les "tirant" par la souris pour les "lâcher" dans la case cible. Mais ces mouvements sont soumis au contrôle des règles de déplacements des pièces pour un jeu d'échecs. Ma prise des pièces est gérée, les movements non autorisés sont rejetés et la victoire (prise du roi adverse) est détectée. Les blancs commencent, ensuite les couleurs jouent alternativement. On peut choisir les couleurs pour les cases "sombres" et "claires".

Voici le programme de démo, très simple. En fait, tout est géré dans la DLL. A titre d'exemple, un bouton permet de changer la configuration par une configuration imposée et de la jouer - c'est le cas des problèmes d'échecs publiés dans les journaux.

Voici le code:
Code:
' test_jeu_echecs.bas

label close0, peupler

dim res%, w%, h%, hc%, x1%, y1%, row1%, col1%, x2%, y2%, row2%, col2%, CB%

w% = 1 + 8*(48+1)
h% = w%
width 0,w%+50
height 0,h%+200
button 101 : top 101,50+h%+10 : left 101,10 : width 101,w% : caption 101,"Peupler l'échiquer avec un exemple"
  on_click 101,peupler
edit 102 : top 102,top(101)+30 : left 102,10 : width 102,w%
memo 103 : hide 103 : bar_both 103

dll_on "KGF.dll"

CB% = dll_call6("CreateChessBoard",handle(0),48,10,50,hex("8080FF"),hex("FFF0F0"))
res% = dll_call2("SetChessBoardTrace",CB%,handle(102))

end
  
peupler:
  clear 103
  item_add 103,"*****k**"
  item_add 103,"**b*****"
  item_add 103,"******r*"
  item_add 103,"********"
  item_add 103,"********"
  item_add 103,"**Q*****"
  item_add 103,"*****K**"
  item_add 103,"********"
  res% = dll_call3("PopulateChessBoard",CB%,handle(103),1)
  if res%<0 then message "Echec du peublement"
  return


Et voici le plateau au départ:
KGF_dll - nouvelles versions - Page 39 Echiqu10
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 19 Jan 2021 - 17:59

KGF.dll V9.46 du 19/01/2021

Nouveautés:
- ChessBoard: la prise "en passant" est implémentée

Modules modifiés:
KGF.dll

La doc est inchangée.

Petit ajout de fonctionnalité: la prise "en passant" d'un pion par un autre est implémentée, selon les règles du jeu d'échecs.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyJeu 21 Jan 2021 - 17:00

KGF.dll V9.47 du 21/01/2021

Nouveautés:
- ChessBoard: le roque est soumis aux contrôles complets de validité

Modules modifiés:
KGF.dll

La doc est inchangée.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyLun 8 Fév 2021 - 13:38

KGF.dll V9.48 du 03/02/2021

Nouveautés:
- ChessBoard: possiblité de jouer en double-plateau synchronisé
- nouvel objet: SharedMemory
- nouvel objet: BitmapList


Modules modifiés:
KGF.dll
KGF.chm


La doc est à jour.

Mise à jour majeure !

ChessBoard:
On peut maintenant générer le programme en EXE et le lancer deux fois. En déplaçant les fenêtres côte à côte pour qu'elle ne se recouvrent pas, on découvre deux plateaux identiques. Mais ces plateaux sont maintenant synchronisés. La première pièce blanche jouée que n'importe quel plateau affecte la couleur blanche à ce plateau et la couleur noire à l'autre. A partir de ce moment, sur les deux plateaux, on ne peut plus bouger que les pièces de la couleur affectée. Chaque coup joué sur un plateau est automatiquement reporté sur l'autre plateau. Sinon, tout reste inchangé, y compris l'annulation, possible sur chacun des plateaux.

Voici le programme de démo adapté à cette version:
Code:
' test_BitmapList.bas

label close0, exit, new, open, add, close, save, saveas, SelectBitmap
label insert, remove, apropos

dim res%, BL%,ListName$, modif$, s$, w%, h%, w0%, h0%, dw%, dh%
dim ImageFile$, ImageCount%, index%

modif$ = ""
w0% = width(0)
h0% = height(0)
dw% = width(0) - width_client(0)
dh% = height(0) - height_client(0)

caption 0,"BmpLibrary"
main_menu 1
  sub_menu 11 : parent 11,1 : caption 11,"Files"
    sub_menu 111 : parent 111,11 : caption 111,"New    - create newlibrary" : on_click 111,new
    sub_menu 112 : parent 112,11 : caption 112,"Open   - open existing library" : on_click 112,open
    sub_menu 113 : parent 113,11 : caption 113,"Save     - save to current library" : on_click 113,save
    sub_menu 114 : parent 114,11 : caption 114,"SaveAs - save to other library" : on_click 114,saveas
    sub_menu 115 : parent 115,11 : caption 115,"Close    - close current library" : on_click 115,close
    sub_menu 116 : parent 116,11 : caption 116,"-"
    sub_menu 117 : parent 117,11 : caption 117,"Exit" : on_click 117,exit

  sub_menu 12 : parent 12,1 : caption 12,"Bitmaps"
    sub_menu 121 : parent 121,12 : caption 121,"Add        - append Bitmap to current library" : on_click 121,add
    sub_menu 122 : parent 122,12 : caption 122,"Insert      - insert Bitmap before the selected item" : on_click 122,insert
    sub_menu 123 : parent 123,12 : caption 123,"Remove - remove the selected Bitmap item" : on_click 123,remove
  sub_menu 13 : parent 13,1 : caption 13,"Apropos" : on_click 13,apropos
  
save_dialog 1000
open_dialog 1001


list 1002 : top 1002,10 : left 1002,10 : height 1002,height_client(0)-20 : width 1002,200
  on_click 1002,SelectBitmap
picture 1003 : top 1003,10 : left 1003,left(1002)+width(1002)+10
width 1003,width_client(0)-left(1003)-10 : height 1003,height(1002)
image 1004

form 2000 : hide 2000 : top 2000,top(0)+100 : left 2000,left(0)+100 : width 2000,400
  font_name 2000,"Lucida sans Typewriter"
alpha 2001 : parent 2001,2000 : left 2001,20 : top 2001,20 : caption 2001,"BmpLibrary - Bitmap Library Utility"
  font_size 2001,12
alpha 2002 : parent 2002,2000 : left 2002,20 : top 2002,50 :  caption 2002,"Author:           Klaus"
alpha 2003 : parent 2003,2000 : left 2003,20 : top 2003,80 :  caption 2003,"Created:          05/02/2021"
alpha 2004 : parent 2004,2000 : left 2004,20 : top 2004,110 : caption 2004,"KGF.dll minimum:  V09.48 03/02/2021"

dll_on "KGF.dll"


end

close0:
  if BL%<>0 then BL% = dll_call1("DeleteBitmapList",BL%)
  return
  
exit:
  if BL%<>0
    if message_confirmation_yes_no("Library actually open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
  end_if
  terminate
  
new:
  if BL%<>0
    if message_confirmation_yes_no("Library already open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
    ImageCount% = 0
    modif$ = ""
  end_if
  BL% = dll_call0("CreateBitmapList")
  ListName$ = "<noname>"
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
  return
  
open:
  if BL%<>0
    if message_confirmation_yes_no("Library already open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
  end_if
  filter 1001,"Bitmap library file (blb)|*.blb"
  s$ = file_name$(1001)
  if s$="_" then return
  BL% = dll_call0("CreateBitmapList")
  ListName$ = "<noname>"
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
  res% = dll_call2("LoadBitmapListFromFile",BL%,adr(s$))
  if res%<0
    message "Error"
  else
    ListName$ = file_extract_name$(s$)
    ImageCount% = res%
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    res% = dll_call2("GetBitmapListContents",BL%,handle(1002))
  end_if
  return
  
save:
  if listname$="<noname>" then gosub saveas
  res% = dll_call2("SaveBitmapListToFile",BL%,adr(ListName$))
  if res%=0
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
saveas:
  if BL%=0 then return
  filter 1000,"Bitmap library file (blb)|*.blb"
  s$ = file_name$(1000)
  if s$="_" then return
  res% = dll_call2("SaveBitmapListToFile",BL%,adr(s$))
  if res%=0
    ListName$ = s$
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
close:
  if BL%=0 then return
  if modif$="*"
    if message_confirmation_yes_no("Library is modified. Discard it ?")<>1 then return
  end_if
  BL% = dll_call1("DeleteBitmapList",BL%)
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary"
  return
  
SelectBitmap:
  index% = item_index(1002)
  res% = dll_call2("GetBitmapListImage",BL%,index%)
  w% = dll_call0("GetClipboardPictureWidth")
  h% = dll_call0("GetClipboardPictureHeight")
  width 0,w0%
  height 0,h0%
  if (w%+left(1003)+10)>width_client(0)
    width 0,left(1003)+w%+10 + dw%
  else
    width 0,w0%
  end_if
  if (h%+top(1003)+10)>height_client(0)
    height 0,top(1003)+h%+10 + dh%
  else
    height 0,h0%
  end_if
  width 1003,w%
  height 1003,h%
  clipboard_paste 1003
  clipboard_string_copy "*"
  return
    
add:
  if BL%=0 then return
  filter 1001,"Image file (bmp,jpg,gif,ico)|*.bmp;*.jpg;*.gif;*.ico)"
  ImageFile$ = file_name$(1001)
  if ImageFile$="_" then return
  res% = dll_call2("AddImageToBitmapList",BL%,adr(ImageFile$))
  if res%>=0
    ImageCount% = res%
    res% = dll_call4("GetDimensionOfBitmapListItem",BL%,count(1002)+1,adr(w%),adr(h%))
    modif$ = "*"
    s$ = file_extract_name$(ImageFile$)
    item_add 1002,str$(w%)+"x"+str$(h%)+"  "+s$
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
insert:
  if BL%=0 then return
  index% = item_index(1002)
  if index%=0 then return
  filter 1001,"Image file (bmp,jpg,gif,ico)|*.bmp;*.jpg;*.gif;*.ico)"
  ImageFile$ = file_name$(1001)
  if ImageFile$="_" then return
  res% = dll_call3("InsertImageToBitmapList",BL%,adr(ImageFile$),index%)
  if res%>=0
    ImageCount% = res%
    res% = dll_call4("GetDimensionOfBitmapListItem",BL%,count(1002)+1,adr(w%),adr(h%))
    modif$ = "*"
    s$ = file_extract_name$(ImageFile$)
    item_insert 1002,index%,str$(w%)+"x"+str$(h%)+"  "+s$
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
remove:
  index% = item_index(1002)
  if index%=0 then return
  res% = dll_call2("RemoveBitmapListImage",BL%,index%)
  if res%>0
    item_delete 1002,index%
    ImageCount% = res%
    modif$ = "*"
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
apropos:
  show 2000
  return

SharedMemory:
Cet objet réalise un de mes vieux rêves; une zone mémoire partagée entre plusieurs programmmes ! Et ce de fçon synchronisée et sécurisée, avec les verrouillages qui vont bien. Le programme de démo montre une zone partagée de 4096 octets (1 page de mémoire virtuelle), dans laquelle je place l'image d'une chaîne de caractères, d'un nombre entier, d'un nombre flottant et du contenu d'un mémo. Un autre mémo montre le "dump" du début le la mémoire partagée.
- Générez ce programme en EXE et lancez-le 3 fois.
- Déplacez les fenêtres de sorte que les champs soient visibles en même temps.
- Puis, fenêtre après fenêtre, dans n'importe quel ordre, cliquez sur le bouton "Connect". On voit que le nombre d'utilisateurs et le contenu de l'adresse 0 change au fur et à mesure.
- Lorsque les 3 programmes sont connectés, rentrez des données dans un ou plusieurs champs d'une des 3 fenêtres, puis cliquez sur "Change". On voit que le contenu de la mémoire partagée a changé et que les champs des deux autres fenêtres sont automatiquement mis à jour.
- Changez des données dans une autre fenêtre et cliquez sur "Change" de cette fenêtre pour voir, là encore, les changements reportés automatiquement dans les deux autres fenêtres.
- Cliquez sur "Disconnext" dans une des fenêtres, on voit que le nombre d'utilisateurs a changé dans les deux autres fenêtres.
- Changez le données dans une des deux fenêtres restantes et cliquez sur "Change". L'autre fenêtre est actualisée mais pas la fenêtre déconnectée.
- Cliquez sur "Connect" de la fenêtre déconnectée et les données sont actialisées immédiatement.

Voici le code:
Code:
' test_SharedMemory.bas

label close0, UserEvent, displayarray, displayvariables, connect, change, disconnect

dim res%, array%(1023), s$, i%, integer%, float, SM%, SMName$, SMID%, usercount%, n%
usercount% = 0
float = 0
integer% = 0
s$ = ""
SMName$ = "MySharedMemory"
SMID% = 1

dll_on "KGF.dll"

button 1 : top 1,10 : left 1,310 : caption 1,"Connect" : on_click 1,connect
button 2 : top 2,10 : left 2,400 : caption 2,"Change" : on_click 2,change : inactive 2
button 3 : top 3,10 : left 3,490 : caption 3,"Disconnect" : on_click 3,disconnect : inactive 3

alpha 10 : top 10,50 : left 10,310 : caption 10,"User count:"
alpha 11 : top 11,50 : left 11,380 : font_bold 11 : caption 11,str$(usercount%)

alpha 20 : top 20,80 : left 20,310 : caption 20,"Float value:"
edit 21 : top 21,80 : left 21,380 : font_bold 21 : text 21,str$(float)

alpha 30 : top 30,110 : left 30,310 : caption 30,"Integer value:"
edit 31 : top 31,110 : left 31,380 : font_bold 31 : text 31,str$(integer%)

alpha 40 : top 40,140 : left 40,310 : caption 40,"String value:"
edit 41 : top 41,140 : left 41,380 : font_bold 41 : text 41,s$

alpha 50 : top 50,170 : left 50,310 : caption 50,"Memo:"
memo 51 : top 51,170 : left 51,380 : font_bold 51 : bar_both 51 : height 51,200

memo 100 : width 100,300 : height 100,height_client(0) : bar_both 100

on_close 0,close0

end


displayarray:
  clear 100
  for i%=0 to 30
    s$ = str$(i%*4)+"  "+hex$(array%(i%))
    item_add 100,s$
  next i%
  return
  
displayvariables:
  usercount% = array%(0)
  caption 11,str$(usercount%)
  res% = dll_call3("CopyFloatFromIntegerArray",adr(float),adr(array%),1)
  text 21,str$(float)
  res% = dll_call3("CopyIntegerFromIntegerArray",adr(integer%),adr(array%),3)
  text 31,str$(integer%)
  s$ = GetString$(4)
  text 41,s$
  s$ = GetString$(100)
  text 51,s$
  return

connect:                
  SM% = dll_call3("CreateSharedMemory",adr(SMName$),SMID%,1)
  on_user_event UserEvent
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
  gosub displayvariables
  gosub displayarray
  inactive 1
  active 2
  active 3
  return
  
change:  
  float = val(text$(21))
  res% = dll_call3("CopyFloatToSharedMemory",SM%,adr(float),1)
  integer% = val(text$(31))
  res% = dll_call3("CopyIntegerToSharedMemory",SM%,adr(integer%),3)
  s$ = text$(41)  
  res% = dll_call3("CopyStringToSharedMemory",SM%,adr(s$),4)
  s$ = text$(51)
  res% = dll_call3("CopyStringToSharedMemory",SM%,adr(s$),100)
                              
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
  gosub displayarray
  return
  
disconnect:
  off_user_event
  active 1
  inactive 2
  inactive 3
  SM% = dll_call1("DeleteSharedMemory",SM%)
  usercount% = usercount% - 1
  caption 11,str$(usercount%)
  clear 100
  return

close0:
  off_user_event
  SM% = dll_call1("DeleteSharedMemory",SM%)
'  res% = dll_call1("SharedMemoryContext",0)
  res% = dll_call1("KillProcessByHandle",handle(0))
  return

UserEvent:
  if SM%=0 then return
  if USER_EVENT_WPARAM<>hex("12010000") then return
  if USER_EVENT_LPARAM<>SMID% then return
  off_user_event
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
  gosub displayvariables
  gosub displayarray
  on_user_event UserEvent
  return
  
fnc GetStringFromSharedMemory$(offset%)
  s$ = ""
  res% = dll_call2("CopyStringLengthFromSharedMemory",SM%,offset%)
  if res%>0
    s$ = string$(res%," ")
    res% = dll_call3("CopyStringFromSharedMemory",SM%,adr(s$),offset%)
    result s$
  end_if
end_fnc
 
fnc GetString$(offset%)
  if array%(offset%)=0
    s$ = ""
  else
    n% = array%(offset%)
    s$ = string$(n%," ")
    res% = dll_call3("CopyStringFromIntegerArray",adr(s$),adr(array%),offset%)
  end_if
  result s$
end_fnc

Ceci ouvre la voie vers une architecture client-serveur.
Imaginez un programme Panoramic dont la form 0 ext cachée par HIDE et qui tourne donc en arrière-plan. Il sera lancé en premier, au démarrage de l'ordinateur, par exemple. et il ne s'arrête jamais. C'est le serveur. Les autres programmes partagent a zone mémoire pour lui soumettre des requêtes et reçoivent la réponse également dans la mémoire partagée. Tout le secret réside alors dans le design et l'organisation de l mémoire partagée. Techniquement, tout est là.

BitmapList:
Cet objet est similaire à l'objet ImageList, mais il peut contenir des images quelconques, de dimensions différentrs. Voici le programme de démo - un gestionnaire complet de bibliothèque d'images:
Code:
' test_BitmapList.bas

label close0, exit, new, open, add, close, save, saveas, SelectBitmap
label insert, remove, apropos

dim res%, BL%,ListName$, modif$, s$, w%, h%, w0%, h0%, dw%, dh%
dim ImageFile$, ImageCount%, index%

modif$ = ""
w0% = width(0)
h0% = height(0)
dw% = width(0) - width_client(0)
dh% = height(0) - height_client(0)

caption 0,"BmpLibrary"
main_menu 1
  sub_menu 11 : parent 11,1 : caption 11,"Files"
    sub_menu 111 : parent 111,11 : caption 111,"New    - create newlibrary" : on_click 111,new
    sub_menu 112 : parent 112,11 : caption 112,"Open   - open existing library" : on_click 112,open
    sub_menu 113 : parent 113,11 : caption 113,"Save     - save to current library" : on_click 113,save
    sub_menu 114 : parent 114,11 : caption 114,"SaveAs - save to other library" : on_click 114,saveas
    sub_menu 115 : parent 115,11 : caption 115,"Close    - close current library" : on_click 115,close
    sub_menu 116 : parent 116,11 : caption 116,"-"
    sub_menu 117 : parent 117,11 : caption 117,"Exit" : on_click 117,exit

  sub_menu 12 : parent 12,1 : caption 12,"Bitmaps"
    sub_menu 121 : parent 121,12 : caption 121,"Add        - append Bitmap to current library" : on_click 121,add
    sub_menu 122 : parent 122,12 : caption 122,"Insert      - insert Bitmap before the selected item" : on_click 122,insert
    sub_menu 123 : parent 123,12 : caption 123,"Remove - remove the selected Bitmap item" : on_click 123,remove
  sub_menu 13 : parent 13,1 : caption 13,"Apropos" : on_click 13,apropos
  
save_dialog 1000
open_dialog 1001


list 1002 : top 1002,10 : left 1002,10 : height 1002,height_client(0)-20 : width 1002,200
  on_click 1002,SelectBitmap
picture 1003 : top 1003,10 : left 1003,left(1002)+width(1002)+10
width 1003,width_client(0)-left(1003)-10 : height 1003,height(1002)
image 1004

form 2000 : hide 2000 : top 2000,top(0)+100 : left 2000,left(0)+100 : width 2000,400
  font_name 2000,"Lucida sans Typewriter"
alpha 2001 : parent 2001,2000 : left 2001,20 : top 2001,20 : caption 2001,"BmpLibrary - Bitmap Library Utility"
  font_size 2001,12
alpha 2002 : parent 2002,2000 : left 2002,20 : top 2002,50 :  caption 2002,"Author:           Klaus"
alpha 2003 : parent 2003,2000 : left 2003,20 : top 2003,80 :  caption 2003,"Created:          05/02/2021"
alpha 2004 : parent 2004,2000 : left 2004,20 : top 2004,110 : caption 2004,"KGF.dll minimum:  V09.48 03/02/2021"

dll_on "KGF.dll"


end

close0:
  if BL%<>0 then BL% = dll_call1("DeleteBitmapList",BL%)
  return
  
exit:
  if BL%<>0
    if message_confirmation_yes_no("Library actually open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
  end_if
  terminate
  
new:
  if BL%<>0
    if message_confirmation_yes_no("Library already open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
    ImageCount% = 0
    modif$ = ""
  end_if
  BL% = dll_call0("CreateBitmapList")
  ListName$ = "<noname>"
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
  return
  
open:
  if BL%<>0
    if message_confirmation_yes_no("Library already open. Discard it ?")<>1 then return
    BL% = dll_call1("DeleteBitmapList",BL%)
  end_if
  filter 1001,"Bitmap library file (blb)|*.blb"
  s$ = file_name$(1001)
  if s$="_" then return
  BL% = dll_call0("CreateBitmapList")
  ListName$ = "<noname>"
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
  res% = dll_call2("LoadBitmapListFromFile",BL%,adr(s$))
  if res%<0
    message "Error"
  else
    ListName$ = file_extract_name$(s$)
    ImageCount% = res%
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    res% = dll_call2("GetBitmapListContents",BL%,handle(1002))
  end_if
  return
  
save:
  if listname$="<noname>" then gosub saveas
  res% = dll_call2("SaveBitmapListToFile",BL%,adr(ListName$))
  if res%=0
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
saveas:
  if BL%=0 then return
  filter 1000,"Bitmap library file (blb)|*.blb"
  s$ = file_name$(1000)
  if s$="_" then return
  res% = dll_call2("SaveBitmapListToFile",BL%,adr(s$))
  if res%=0
    ListName$ = s$
    modif$ = ""
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
close:
  if BL%=0 then return
  if modif$="*"
    if message_confirmation_yes_no("Library is modified. Discard it ?")<>1 then return
  end_if
  BL% = dll_call1("DeleteBitmapList",BL%)
  ImageCount% = 0
  modif$ = ""
  clear 1002
  caption 0,"BmpLibrary"
  return
  
SelectBitmap:
  index% = item_index(1002)
  res% = dll_call2("GetBitmapListImage",BL%,index%)
  w% = dll_call0("GetClipboardPictureWidth")
  h% = dll_call0("GetClipboardPictureHeight")
  width 0,w0%
  height 0,h0%
  if (w%+left(1003)+10)>width_client(0)
    width 0,left(1003)+w%+10 + dw%
  else
    width 0,w0%
  end_if
  if (h%+top(1003)+10)>height_client(0)
    height 0,top(1003)+h%+10 + dh%
  else
    height 0,h0%
  end_if
  width 1003,w%
  height 1003,h%
  clipboard_paste 1003
  clipboard_string_copy "*"
  return
    
add:
  if BL%=0 then return
  filter 1001,"Image file (bmp,jpg,gif,ico)|*.bmp;*.jpg;*.gif;*.ico)"
  ImageFile$ = file_name$(1001)
  if ImageFile$="_" then return
  res% = dll_call2("AddImageToBitmapList",BL%,adr(ImageFile$))
  if res%>=0
    ImageCount% = res%
    res% = dll_call4("GetDimensionOfBitmapListItem",BL%,count(1002)+1,adr(w%),adr(h%))
    modif$ = "*"
    s$ = file_extract_name$(ImageFile$)
    item_add 1002,str$(w%)+"x"+str$(h%)+"  "+s$
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
insert:
  if BL%=0 then return
  index% = item_index(1002)
  if index%=0 then return
  filter 1001,"Image file (bmp,jpg,gif,ico)|*.bmp;*.jpg;*.gif;*.ico)"
  ImageFile$ = file_name$(1001)
  if ImageFile$="_" then return
  res% = dll_call3("InsertImageToBitmapList",BL%,adr(ImageFile$),index%)
  if res%>=0
    ImageCount% = res%
    res% = dll_call4("GetDimensionOfBitmapListItem",BL%,count(1002)+1,adr(w%),adr(h%))
    modif$ = "*"
    s$ = file_extract_name$(ImageFile$)
    item_insert 1002,index%,str$(w%)+"x"+str$(h%)+"  "+s$
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
remove:
  index% = item_index(1002)
  if index%=0 then return
  res% = dll_call2("RemoveBitmapListImage",BL%,index%)
  if res%>0
    item_delete 1002,index%
    ImageCount% = res%
    modif$ = "*"
    caption 0,"BmpLibrary - "+ListName$ + " "+modif$ + "   " + str$(ImageCount%)+" bitmaps"
    message "Ok"
  else
    message "Error"
  end_if
  return
  
apropos:
  show 2000
  return

Yannick aime ce message

Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMar 9 Fév 2021 - 18:59

Bravo et merci Klaus !

J’ai testé BitmapList (uniquement avec des JPG et des BMP), tout fonctionne bien ! cheers

J’ai testé SharedMemory avec 5 exe. Pas de problème, la synchro fonctionne parfaitement, aucun conflit. Connexion, déconnection, reconnexion, mise à jour des données partagées etc, R.A.S. cheers

KGF_dll - nouvelles versions - Page 39 Appsl10


Il ne me reste plus qu’à essayer ChessBoard.
Revenir en haut Aller en bas
lepetitmarocain




Nombre de messages : 341
Age : 82
Localisation : Région Parisienne (à mon grand désespoir)
Date d'inscription : 04/07/2018

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyDim 14 Fév 2021 - 20:33

Bonjour Klaus. Bonjour à tous

Je viens de tester SharedMemory, et je constate que rien ne se passe.

Par exemple User Count ne bouge pas après que les 3 exe aient été connectés.

J' ecris quelque chose dans String Value, et en cliquent sur change, rien ne se passe.

Par contre si j'ai saisi quelque chose dans un exe dans String value (je clique sur Change) , et que je clique sur un autre exe dans

change, ce que j'avais saisi dans la premier disparait.

Bonne soirée à tous
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 16 Fév 2021 - 9:08

J'ai testé, mais je constate ue tout fonctionne:
KGF_dll - nouvelles versions - Page 39 Aa156

Je pense que tu as tout simplement oublié de cliquer sur le bouton "Connect" après le lancement de chaque programme. Tant que ce clic n'est pas fait, le programme n'est pas connecté sur la mémoire partagée et, évidemment, rien ne se passe.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
lepetitmarocain




Nombre de messages : 341
Age : 82
Localisation : Région Parisienne (à mon grand désespoir)
Date d'inscription : 04/07/2018

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMar 16 Fév 2021 - 16:45

Bonjour Klaus.

Je suis désolé, mais j'ai bien fait connect, et j'ai toujours la meme chose, cad  users=0.

Je ne sais pas ajouter une image comme tu l'as fait

Bonne journée à tous
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 16 Fév 2021 - 17:16

Chez moi, je procède comme suit:
- je génère l'exécutable à partir du source du programme de démo, par Panoramc_Editor, menu Fichiers, option Executable.
- je lance cet EXE 3 fois, en double-cliquant dessus dans l'explorateur.
- je place les 3 fenêtres de sorte à les voir toutes les 3, simultanément
- puis, fenêtre par fenêtre, je clique sur le bouton "Connect".
Lors du clic sur ce bouton dans la première fenêtre, rien ne se passe dans les deux autres fenêtres, mais celle dont le bouton Connect a été cliqué, montre bien un nombre d'utilisateurs égal à 1, et dans le mémo de gauche contenant le dump du début de la mémoire partagée, la cellule 0 montre bien la valeur 1.
- je clique maintenant sur le bouton Connect d'une des deux autres fenêtres. Dans cette deuxième fenêtre, tout comme dans la première, le nombre d'utilisateur s"affiche comme 2, et le dump de la mémoire partagée montre la valeur 2 dans la cellule 0.

Et ainsi de suite. Je ne constate aucun disfonctionnement.

Dis-moi sous quel système tu travailles, quelle version de Windows ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 16 Fév 2021 - 17:25

Voici l'état après le lancement des 3 programmes:
KGF_dll - nouvelles versions - Page 39 Aa157




Connect dans la première fenêtre:
KGF_dll - nouvelles versions - Page 39 Aa222




Connect dans la deuxième fenêtre:
KGF_dll - nouvelles versions - Page 39 Aa312




Connect dans la troisième fenêtre:
KGF_dll - nouvelles versions - Page 39 Aa411




Je ne vois pas ce que je pourrais te dire d'autre...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
lepetitmarocain




Nombre de messages : 341
Age : 82
Localisation : Région Parisienne (à mon grand désespoir)
Date d'inscription : 04/07/2018

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMar 16 Fév 2021 - 18:31

Bonsoir Klaus

Je travaille sur W7 Professionnel.

Je compile le programme avec Elip.

Et j'ai toujours rien.

Par contre si je deconnect, il y a de noté sur le premier connect   Userscount -1.

Désolé

Bonne soirée
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMar 16 Fév 2021 - 18:56

Bonsoir à tous !

Je viens de remettre un PC en route sous Windows 7 pour faire l'essai de SharedMemory.

Effectivement, sous Windows 7 la connexion ne s'effectue pas.  Crying or Very sad

Voici une capture d'écran après avoir connecté les trois exe :

KGF_dll - nouvelles versions - Page 39 Klaus112

User Count reste à 0.

Lors de la déconnexion d'un exe, User count de l'exe déconnecté passe à -1. Les autres restent à 0 :

KGF_dll - nouvelles versions - Page 39 Klaus215


Alors que tout cela fonctionne admirablement bien sous Windows 10.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMar 16 Fév 2021 - 20:53

Parfait ! On avance ! Merci à vous deux pour les tests et ces diagnostics.

Il s'agit dont d'un problème de version de Windows.

Je vais regarder si je trouve des différences entre W7 et W10 qui expliqueraient ce qui se passe.
Peut-être y arriverai-je avec un effort raisonnable.
Cependant, je vous alerte sur la "fin de vie" de W7, plus précisément la fin du support MicroSoft pour W7:
https://www.microsoft.com/fr-fr/windows/windows-7-end-of-life-support-information

Donc, si je trouve "prochainement" un moyen de régler ce problème sous W7, je vais le mettre en place.

Peut-être pourrait-on envisager, à moyen terme, de migrer vers un W10 afin de bénéficier du support de MicroSoft ? Les mises à jour de sécurité, ce n'est pas rien...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMer 17 Fév 2021 - 1:28

Code:
' test_SharedMemory.bas

label close0, UserEvent, displayarray, displayvariables, connect, change, disconnect

dim res%, array%(1023), s$, i%, integer%, float, SM%, SMName$, SMID%, usercount%, n%, log%
log% = 0              : ' <================= activer cette ligne pour obtenir un log
' log% = 2              : ' <================= désactiver cette ligne pour obtenir un log
usercount% = 0
float = 0
integer% = 0
s$ = ""
SMName$ = "MySharedMemory"
SMID% = 1

dll_on "KGF.dll"

button 1 : top 1,10 : left 1,310 : caption 1,"Connect" : on_click 1,connect
button 2 : top 2,10 : left 2,400 : caption 2,"Change" : on_click 2,change : inactive 2
button 3 : top 3,10 : left 3,490 : caption 3,"Disconnect" : on_click 3,disconnect : inactive 3

alpha 10 : top 10,50 : left 10,310 : caption 10,"User count:"
alpha 11 : top 11,50 : left 11,380 : font_bold 11 : caption 11,str$(usercount%)

alpha 20 : top 20,80 : left 20,310 : caption 20,"Float value:"
edit 21 : top 21,80 : left 21,380 : font_bold 21 : text 21,str$(float)

alpha 30 : top 30,110 : left 30,310 : caption 30,"Integer value:"
edit 31 : top 31,110 : left 31,380 : font_bold 31 : text 31,str$(integer%)

alpha 40 : top 40,140 : left 40,310 : caption 40,"String value:"
edit 41 : top 41,140 : left 41,380 : font_bold 41 : text 41,s$

alpha 50 : top 50,170 : left 50,310 : caption 50,"Memo:"
memo 51 : top 51,170 : left 51,380 : font_bold 51 : bar_both 51 : height 51,200

memo 100 : width 100,300 : height 100,height_client(0) : bar_both 100

on_close 0,close0

end


displayarray:
  clear 100
  for i%=0 to 30
    s$ = str$(i%*4)+"  "+hex$(array%(i%))
    item_add 100,s$
  next i%
  return
 
displayvariables:
  usercount% = array%(0)
  caption 11,str$(usercount%)
  res% = dll_call3("CopyFloatFromIntegerArray",adr(float),adr(array%),1)
  text 21,str$(float)
  res% = dll_call3("CopyIntegerFromIntegerArray",adr(integer%),adr(array%),3)
  text 31,str$(integer%)
  s$ = GetString$(4)
  text 41,s$
  s$ = GetString$(100)
  text 51,s$
  return

connect:
if log%=0 then log% = 1             
if log%=1 then file_open_write 1,"SharedMemory_"+str$(handle(0))+".log"
  SM% = dll_call3("CreateSharedMemory",adr(SMName$),SMID%,1)
if log%=1 then file_writeln 1,date$+"  "+time$+"  "+str$(handle(0))+"  connect: CreateSharedMemory: SM%="+str$(SM%)
  on_user_event UserEvent
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
if log%=1 then file_writeln 1,date$+"  "+time$+"  "+str$(handle(0))+"  connect: GetSharedMemoryArray: res%="+str$(res%)
  gosub displayvariables
  gosub displayarray
  inactive 1
  active 2
  active 3
 
change: 
  float = val(text$(21))
  res% = dll_call3("CopyFloatToSharedMemory",SM%,adr(float),1)
  integer% = val(text$(31))
  res% = dll_call3("CopyIntegerToSharedMemory",SM%,adr(integer%),3)
  s$ = text$(41) 
  res% = dll_call3("CopyStringToSharedMemory",SM%,adr(s$),4)
  s$ = text$(51)
  res% = dll_call3("CopyStringToSharedMemory",SM%,adr(s$),100)
                             
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
  gosub displayarray
  return
 
disconnect:
  off_user_event
  active 1
  inactive 2
  inactive 3
  SM% = dll_call1("DeleteSharedMemory",SM%)
if log%=1 then file_writeln 1,date$+"  "+time$+"  "+str$(handle(0))+"  close0: DeleteSharedMemory: SM%="+str$(SM%)
if log%=1 then file_close 1
log% = 0
  usercount% = usercount% - 1
  caption 11,str$(usercount%)
  clear 100
  return

close0:
  off_user_event
  SM% = dll_call1("DeleteSharedMemory",SM%)
if log%=1 then file_writeln 1,date$+"  "+time$+"  "+str$(handle(0))+"  close0: DeleteSharedMemory: SM%="+str$(SM%)
if log%=1 then file_close 1
'  res% = dll_call1("SharedMemoryContext",0)
  res% = dll_call1("KillProcessByHandle",handle(0))
  return
 
UserEvent:
  if SM%=0 then return
if log%=1 then file_writeln 1,date$+"  "+time$+"  "+str$(handle(0))+"  USER_EVENT_WPARAM="+right$("0000000"+hex$(USER_EVENT_LPARAM),8)+"  USER_EVENT_LPARAM="+right$("0000000"+hex$(USER_EVENT_WPARAM),8)
  if USER_EVENT_WPARAM<>hex("12010000") then return
  if USER_EVENT_LPARAM<>SMID% then return
  off_user_event
  res% = dll_call2("GetSharedMemoryArray",SM%,adr(array%))
  gosub displayvariables
  gosub displayarray
  on_user_event UserEvent
  return
 
fnc GetStringFromSharedMemory$(offset%)
  s$ = ""
  res% = dll_call2("CopyStringLengthFromSharedMemory",SM%,offset%)
  if res%>0
    s$ = string$(res%," ")
    res% = dll_call3("CopyStringFromSharedMemory",SM%,adr(s$),offset%)
    result s$
  end_if
end_fnc
 
fnc GetString$(offset%)
  if array%(offset%)=0
    s$ = ""
  else
    n% = array%(offset%)
    s$ = string$(n%," ")
    res% = dll_call3("CopyStringFromIntegerArray",adr(s$),adr(array%),offset%)
  end_if
  result s$
end_fnc

Prends cette version du programme de démo.

Tu obtiendra des fichiers logs différents pour chaque programme, avec le handle de la form 0 pour les identifier.
Alors, fais la manipulation que j'ai indiquée ci-dessus,
puis ferme chaque fenêtre par un clic sur la croix rouge
et poste le contenu de ces 3 petits fichiers.

En voici un exemple:

Log issu du premier programme lance:
Code:
17/02/2021  09:51:15  7211596   connect: CreateSharedMemory: SM%=85990800
17/02/2021  09:51:15  7211596   connect: GetSharedMemoryArray: res%=0
17/02/2021  09:51:16  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:16  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:17  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:17  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:17  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:17  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  7211596   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:25  7211596   close0: DeleteSharedMemory: SM%=0

Log issu du deuxième programme lancé:
Code:
17/02/2021  09:51:16  2362348   connect: CreateSharedMemory: SM%=61474956
17/02/2021  09:51:16  2362348   connect: GetSharedMemoryArray: res%=0
17/02/2021  09:51:17  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:18  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:25  2362348   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:26  2362348   close0: DeleteSharedMemory: SM%=0

Log issu du troisième programme lancé:
Code:
17/02/2021  09:51:17  1117124   connect: CreateSharedMemory: SM%=61933708
17/02/2021  09:51:17  1117124   connect: GetSharedMemoryArray: res%=0
17/02/2021  09:51:25  1117124   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:26  1117124   USER_EVENT_WPARAM=00000001   USER_EVENT_LPARAM=12010000
17/02/2021  09:51:27  1117124   close0: DeleteSharedMemory: SM%=0

En comparant les heures dans les différents logs, on voit bien que la connexion du deuxième programme à 09:51:15 provoque des USER_EVENT dans le premier programme, qui, à son tour provoque un USER_EVENT dans le deuxième programme. Et idem pour le lancement du troisième qui provque des USER-EVENT dans le premier et le deuxième, qui, à leur tour, provoquent des USER_EVENT dans les autres programmes afin de se synchroniser.

Les logs montrent les actions pour:
- activation successive du premier, puis deuxième, et finalement troisième programme
- arrêt par la croix rouge des programmes dans le ùême ordre

Voici l'image des 3 programmes. Après ajustement des tailles des fenêtres en remontant le bord inférieur de chaque fenêtre et en déplaçant ces fenêtres. On obtient ceci:
KGF_dll - nouvelles versions - Page 39 Aa158

Je te conseille de recharger KGF.dll avant ce test - j'ai changé le code retour de la fonction GetSharedMemoryArray qui retourne maintenant -1 en cas d'erreur et 0 en cas de succès.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMer 17 Fév 2021 - 10:57

Bonjour à tous !

Après avoir téléchargé la dernière version de KGF, voici ce que j'obtiens sur mon vieux W7 que j'ai remis en route pour la cause :

Capture d'écran des 3 exe en mode "connecté" :

KGF_dll - nouvelles versions - Page 39 Klaus113


Déconnexion des 3 exe :

KGF_dll - nouvelles versions - Page 39 Klaus216


Après fermeture des 3 exe, copie des 3 logs :

KGF_dll - nouvelles versions - Page 39 Klaus310
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMer 17 Fév 2021 - 11:11

Bien. Je vois que le mécanisme des messages de synchrnisation fonctionne. C'est l'écriture dans la mémoire partagée qui ne marche pas. Ou, peut-être la relecture... Je vais voir si je trouve des infos sur les réseaux, dans ce contexte.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
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 EmptyMer 17 Fév 2021 - 16:11

J'ai fait une modification pour la mémoire partagée. En rechargeant KGF.dll, il y a peut-être une chance pour que ça marche en W7. A voir...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

KGF_dll - nouvelles versions - Page 39 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 39 EmptyMer 17 Fév 2021 - 18:24

Pour moi, c'est tout bon !

KGF_dll - nouvelles versions - Page 39 Klaus114
Revenir en haut Aller en bas
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
-
» KGF_dll - nouvelles versions
» KGF_dll - nouvelles versions
» KGF_dll - nouvelles versions
» Synedit_Editor - nouvelles versions
» version instantanée PANORAMIC V 0.9.25i6 du 14/12/2013

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: