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
» Gestion d'un système client-serveur.
KGF_dll - nouvelles versions - Page 10 Emptypar Klaus Ven 17 Mai 2024 - 14:02

» item_index(résolu)
KGF_dll - nouvelles versions - Page 10 Emptypar jjn4 Mar 14 Mai 2024 - 19:38

» Bataille terrestre
KGF_dll - nouvelles versions - Page 10 Emptypar jjn4 Lun 13 Mai 2024 - 15:01

» SineCube
KGF_dll - nouvelles versions - Page 10 Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
KGF_dll - nouvelles versions - Page 10 Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
KGF_dll - nouvelles versions - Page 10 Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
KGF_dll - nouvelles versions - Page 10 Emptypar papydall Jeu 9 Mai 2024 - 3:22

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

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

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

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

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

» bouton dans autre form que 0(résolu)
KGF_dll - nouvelles versions - Page 10 Emptypar leclode Lun 6 Mai 2024 - 13:59

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

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

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier

 

 KGF_dll - nouvelles versions

Aller en bas 
+6
papydall
Marc
jean_debord
Minibug
JP06
Klaus
10 participants
Aller à la page : Précédent  1 ... 6 ... 9, 10, 11, 12, 13, 14  Suivant
AuteurMessage
Minibug

Minibug


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyDim 15 Mai 2022 - 17:38

Merci Klaus. Je viens d'intégrer les modifications dans Duo Panoramic. sunny
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
JP06




Nombre de messages : 20
Age : 73
Date d'inscription : 01/01/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyJeu 19 Mai 2022 - 18:59

Bonjour Klaus.
Je rencontre deux problèmes avec KGF.DLL et la gestion du Treeview
la fonction = dll_call2("FindTreeViewNodeByName",TV%,adr(nom$),start%) semble demander 3 paramètres et non 2..

la fonction =  dll_call3("SelectTreeViewNode",treeview%,indice%,indice%) renvoi une boite de dialogue parasite avec a1,a2,a3, selon le nombre de nodes
rencontrés dans le Treeview.
la version de KGF est la dernière.
Pourrais tu voir cela ?
Merci beaucoup pour ton travail.
Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyJeu 19 Mai 2022 - 23:32

Tu as raison sur les deux points, JP06.

En effet, FindTreeViewNodeByName a changé et la doc n'a pas encore suivi complètement:
Code:
res% = dll_call3("FindTreeViewNodeByName",TV%,adr(nom$),start%)
Le paramètre start% donne l'indice à partir duquel la recherche est effectuée.

La fonction SelectTreeViewNode contenait bien des messages de diagnostic. Je les ai supprimées.
Recjarge KGF.dll à partir de ma signature et le problème sera réglé.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JP06




Nombre de messages : 20
Age : 73
Date d'inscription : 01/01/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyVen 3 Juin 2022 - 17:50

Bonjour Klaus,
Je poursuis mes essais divers avec KGF.DLL.
Dans l'exemple fourni dont voici un petit extrait :
res% = dll_call6("FontSelector",handle_application,adr(R%),adr(G%),adr(B%),adr(clr%),handle(6))
if res%=0
font_name 7,item_read$(6,1)
font_size 7,val(item_read$(6,2))
font_color 7,R%,G%,B% : ' la ligne 3 du mémo contient la couleur de la police en hexa
font_bold_off 7 : if item_read$(6,4)="1" then font_bold 7
font_italic_off 7 : if item_read$(6,5)="1" then font_italic 7
font_underline_off 7 : if item_read$(6,6)="1" then font_underline 7
font_strike_off 7 : if item_read$(6,7)="1" then font_strike 7
end_if

La sous_fonction "font_bold" renvoie toujours 0 dans le MEMO associé,alors que les autres fonctionnent correctement.
C'est la ligne 4 du MEMO 6 dans l'exemple
Pourrais tu regarder cela ?
Merci encore pour tout ce que tu fais
Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptySam 4 Juin 2022 - 10:02

Oui, je vais regarder cela. Ce ne doit pas être bien difficile...

Mais je prendrai un peu plus de temps que d'habitude. Je reprends tout juste, après un petit détour par l'hôpital, suite à un problème cardiaque. Je vais mieux, mais je me ménage...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JP06




Nombre de messages : 20
Age : 73
Date d'inscription : 01/01/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptySam 4 Juin 2022 - 10:49

Bonjour Klaus,
Désolé de t'avoir dérangé dans ces circonstances. Prends soin de ta santé avant tout.
Ce n'est effectivement pas urgent, tant s'en faut.
Bon courage et merci encore.
Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyDim 19 Juin 2022 - 22:37

@JP06:
Le problème que tu as soulevé a été corrigé.
Tu peux recharger KGF.dll et ça marchera.
Désolé pour le retard.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JP06




Nombre de messages : 20
Age : 73
Date d'inscription : 01/01/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyLun 20 Juin 2022 - 6:44

Bonjour Klaus
Merci d'avoir corrigé ce petit soucis. Prends soin de ta santé avant tout.
Merci encore.
Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyDim 13 Nov 2022 - 18:43

KGF.dll V9.81 du 13/11/2022

Nouveautés:
- Nouevl objet:NumericMatrix

Modules modifiés:
KGF.dll
KGF.chm


La doc en version KGF.chm est à jour. La doc en ligne suivra.

Ceci est un objet permettant de gérer mes matrices numériques en deux dimensions (valeurs flottantes) et d'y effectuer des opérations:
- mise à zéro
- création de matrice unitaire
- remplire une matrice par des valeurs aléatoires
- calcul de déterminante
- multiplier par un scalaire
- transposition
- inversion
- addition de deux matrices
- soustraction de deux matrices
- multiplication de deux matrices
- lecture de toutes les données d'une matrice
- remplacement de toutes les données d'une matrice

Ceci est géré par un ensemble de 14 nouvelles fonctions, documentées dans la section "Objets" de KGF.chm, sus la rubrique "NumericMatrix". Il y a aussi un programme de démo, le même que celui ci-après.

Le programme de démo a un menu avec deux lignes. Il gère simultanément 3 matrices, chacun pouvant être créée et configurée séparément, par la première ligne du menu. La seconde ligne permet d'effectuer les différentes opérations sur les matrices. Leur contenu est systématiquement affiché dans des mémos. La première ligne affiche les données de la matrice sélectionné par l'option en haut à gauche. La seconde ligne affiche les 3 matrices simutanément, mais dans des onglets séparés pour des raisons de place (onglets A, B et C).

Voici la démo:
Code:
' test_Matrix_JnBiz.bas

labels()
variables()
menu()
GUI()

dir_change "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF"
dll_on "KGF.dll"
end

sub labels()
  label sortir, ouvrir_1000, fermer_1000
  label click_1009, click_1002, click_1003, click_1004
  label creer_matrice, supprimer_matrice, mettre_a_jour
  label mise_a_zero, matrice_unitaire, matrice_aleatoire, multiplication_scalaire, error_ms
  label operations_matrices, fermer_1100, executer_operation
  label click_1512, click_1513, click_1514
  label click_1522, click_1523, click_1524
  label click_1532, click_1533, click_1534
  label click_grid, change_1542, hide_1542
 
end_sub                         

sub variables()
  dim res%, matrix%(3), nLig%(3),  nCol%(3), matrix_index%
  dim M1_index%, oper_index%, M2_index%, m3_index%
  dim GridRow%, GridCol% 
    matrix%(1) = 0
    matrix%(2) = 0
    matrix%(3) = 0
    matrix_index% = 0
  dim n%, s$, nl%, nc%, fmt$, i%, v
    fmt$ = "%e"

end_sub

sub menu()
  main_menu 1
    sub_menu 10 : parent 10,1 : caption 10,"Matrices"
      sub_menu 11 : parent 11,10 : caption 11,"Ouvrir une matrice" : on_click 11,ouvrir_1000 
      sub_menu 12 : parent 12,10 : caption 12,"Opérations entre matrices" : on_click 12,operations_matrices
      sub_menu 18 : parent 18,10 : caption 18,"-"
      sub_menu 19 : parent 19,10 : caption 19,"Sortir" : on_click 19,sortir
       
end_sub

sub GUI()
  full_space 0
  caption 0,"Matrice sélectionnée: <aucune>"
 
  form 1000 : hide 1000 : width 1000,screen_x-30 : height 1000,screen_y-30
    top 1000,10 : left 1000,10 : on_close 1000,fermer_1000
    caption 1000,"Paramétrage des matrices"
  container_option 1001 : parent 1001,1000 : top 1001,10 : left 1001,10
    height 1001,90 : width 1001,60
    caption 1001,"Matrice:"
  option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
    width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
    on_click 1009,click_1009
  option 1002 : parent 1002,1001 : top 1002,20 : left 1002,20 : caption 1002,"A"
    width 1002,30 : on_click 1002,click_1002
  option 1003 : parent 1003,1001 : top 1003,40 : left 1003,20 : caption 1003,"B"
    width 1003,30 : on_click 1003,click_1003
  option 1004 : parent 1004,1001 : top 1004,60 : left 1004,20 : caption 1004,"C"
    width 1004,30 : on_click 1004,click_1004


  container 1010 : parent 1010,1000 : top 1010,10 : left 1010,100
    width 1010,650 : height 1010,110 : caption 1010,"Propriétés:"   
  alpha 1011 : parent 1011,1010 : top 1011,20 : left 1011,20 : caption 1011,"Lignes:"
  alpha 1012 : parent 1012,1010 : top 1012,50 : left 1012,20 : caption 1012,"Colonnes:"
  spin 1013 :parent 1013,1010 : top 1013,20 : left 1013,80 : width 1013,50
    min 1013,0 : max 1013,50 : position 1013,0
  spin 1014 :parent 1014,1010 : top 1014,50 : left 1014,80 : width 1014,50
    min 1014,0 : max 1014,50 : position 1014,0
  check 1015 : parent 1015,1010 : top 1015,20 : left 1015,160
    caption 1015,"Matrice carrée"
  check 1016 : parent 1016,1010 : top 1016,40 : left 1016,160 : width 1016,110
    caption 1016,"Matrice symétrique"
  check 1017 : parent 1017,1010 : top 1017,60 : left 1017,160 : width 1017,150
    caption 1017,"Matrice tri. inférieure"
  check 1018 : parent 1018,1010 : top 1018,20 : left 1018,330 : width 1018,150
    caption 1018,"Matrice diagonale"
  check 1019 : parent 1019,1010 : top 1019,40 : left 1019,330 : width 1019,150
    caption 1019,"Matrice tridiagonale"
  check 1020 : parent 1020,1010 : top 1020,60 : left 1020,330 : width 1020,150
    caption 1020,"Matrice de Hessenberg"
  alpha 1021 : parent 1021,1010 : top 1021,20 : left 1021,500
    caption 1021,"Format numérique:"
  edit 1022 : parent 1022,1010 : top 1022,40 : left 1022,500
    text 1022,fmt$
  alpha 1023 : parent 1023,1010 : top 1023,60 : left 1023,500
    caption 1023,"Déterminante:"
  edit 1024 : parent 1024,1010 : top 1024,80 : left 1024,500
    text 1024,"0"
   
  container 1030 : hide 1030 : parent 1030,1000 

  memo 1031 : parent 1031,1030 : hide 1031 : bar_both 1031
    ' mémo caché pour l'état d'une matrice:
    '  ligne 1: nombre de lignes
    '  ligne 2: nombre de colonnes
    '  ligne 3: flag "square"
    '  ligne 4: flag "sym"
    '  ligne 5: flag "lo"
    '  ligne 6: flag "diag"
    '  ligne 7: flag "tridiag"
    '  ligne 8: flag "hess"
   
  container 1050 : parent 1050,1000 : top 1050,120 : left 1050,20
    width 1050,width_client(1000)-40 : height 1050,height_client(1000)-200
    caption 1050,"Eléments:"   
  memo 1051 : parent 1051,1050 : top 1051,20 : left 1051,20
    width 1051,width_client(1050)-40 : height 1051,height_client(1050)-80
    bar_both 1051 : font_name 1051,"Courier"
  button 1052 : parent 1052,1050 : top 1052,top(1051)+height(1051)+10 : left 1052,30
    width 1052,200 : caption 1052,"Mettre à jour" : on_click 1052,mettre_a_jour
 
  form 1100 : hide 1100 : width 1100,screen_x-30 : height 1100,screen_y-30
    top 1100,10 : left 1100,10 : on_close 1100,fermer_1100
    caption 1100,"Opérations entre matrices: M1 x M2 => M3"
   
  container_option 1101 : parent 1101,1100 : top 1101,10 : left 1101,10
    height 1101,90 : width 1101,60
    caption 1101,"M1:"
'    option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
'      width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
'      on_click 1009,click_1009
    option 1102 : parent 1102,1101 : top 1102,20 : left 1102,20 : caption 1102,"A"
      width 1102,30
    option 1103 : parent 1103,1101 : top 1103,40 : left 1103,20 : caption 1103,"B"
      width 1103,30
    option 1104 : parent 1104,1101 : top 1104,60 : left 1104,20 : caption 1104,"C"
      width 1104,30

  container_option 1201 : parent 1201,1100 : top 1201,10 : left 1201,100
      height 1201,210 : width 1201,260
      caption 1201,"Opération:"

    option 1202 : parent 1202,1201 : top 1202,20 : left 1202,20 : caption 1202,"Mise à zéro"
        on_click 1202,mise_a_zero
    option 1203 : parent 1203,1201 : top 1203,40 : left 1203,20 : caption 1203,"Matrice unitaire"
        on_click 1203,matrice_unitaire
    option 1204 : parent 1204,1201 : top 1204,60 : left 1204,20 : caption 1204,"Matrice aléatoire"
        on_click 1204,matrice_aleatoire
    option 1205 : parent 1205,1201 : top 1205,80 : left 1205,20 : caption 1205,"Multiplication par un scalaire"
        on_click 1205,multiplication_scalaire : width 1205,200     
    option 1206 : parent 1206,1201 : top 1206,100 : left 1206,20 : caption 1206,"Transposition"
      width 1206,130
    option 1207 : parent 1207,1201 : top 1207,120 : left 1207,20 : caption 1207,"Inversion"
      width 1207,130
    option 1208 : parent 1208,1201 : top 1208,140 : left 1208,20 : caption 1208,"Addition"
      width 1208,130
    option 1209 : parent 1209,1201 : top 1209,160 : left 1209,20 : caption 1209,"Soustraction"
      width 1209,130
    option 1210 : parent 1210,1201 : top 1210,180 : left 1210,20 : caption 1210,"Multiplication"
      width 1210,130

  container_option 1301 : parent 1301,1100 : top 1301,10 : left 1301,400
    height 1301,90 : width 1301,60
    caption 1301,"M2:"
'    option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
'      width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
'      on_click 1009,click_1009
    option 1302 : parent 1302,1301 : top 1302,20 : left 1302,20 : caption 1302,"A"
      width 1302,30
    option 1303 : parent 1303,1301 : top 1303,40 : left 1303,20 : caption 1303,"B"
      width 1303,30
    option 1304 : parent 1304,1301 : top 1304,60 : left 1304,20 : caption 1304,"C"
      width 1304,30

  container_option 1401 : parent 1401,1100 : top 1401,10 : left 1401,500
      height 1401,90 : width 1401,60
      caption 1401,"M3:"
    option 1402 : parent 1402,1401 : top 1402,20 : left 1402,20 : caption 1402,"A"
      width 1402,30
    option 1403 : parent 1403,1401 : top 1403,40 : left 1403,20 : caption 1403,"B"
      width 1403,30
    option 1404 : parent 1404,1401 : top 1404,60 : left 1404,20 : caption 1404,"C"
      width 1404,30
 
  button 1121 : parent 1121,1100 : top 1121,30 : left 1121,600
    width 1121,200 : caption 1121,"Exécuter l'opération"
    on_click 1121,executer_operation 
   
  container_tab 1500 : parent 1500,1100 : top 1500,220 : left 1500,10
      width 1500,width_client(1100)-20 : height 1500,height_client(1100)-220 
      on_mouse_down 1500,hide_1542 
    tab 1510 : parent 1510,1500 : caption 1510,"A"
      memo 1511 : parent 1511,1510 : top 1511,10 : left 1511,10 : bar_both 1511
        width 1511,width_client(1500)-20 : height 1511,height_client(1500)-80
        font_name 1511,"Courier"
      button 1512 : parent 1512,1510 : caption 1512,"Mise à jour matrice A"
        top 1512,top(1511)+height(1511)+10 : left 1512,100 : width 1512,200
        on_click 1512,click_1512
      button 1513 : parent 1513,1510 : caption 1513,"Copier dans GRID"
        top 1513,top(1511)+height(1511)+10 : left 1513,350 : width 1513,200
        on_click 1513,click_1513
      button 1514 : parent 1514,1510 : caption 1514,"Récupérer du GRID"
        top 1514,top(1511)+height(1511)+10 : left 1514,600 : width 1514,200
        on_click 1514,click_1514
    tab 1520 : parent 1520,1500 : caption 1520,"B" 
      memo 1521 : parent 1521,1520 : top 1521,10 : left 1521,10 : bar_both 1521
        width 1521,width_client(1500)-20 : height 1521,height_client(1500)-80
        font_name 1521,"Courier"
      button 1522 : parent 1522,1520 : caption 1522,"Mise à jour matrice B"
        top 1522,top(1521)+height(1521)+10 : left 1522,100 : width 1522,200
        on_click 1522,click_1522
      button 1523 : parent 1523,1520 : caption 1523,"Copier dans GRID"
        top 1523,top(1521)+height(1521)+10 : left 1523,350 : width 1523,200
        on_click 1523,click_1523
      button 1524 : parent 1524,1520 : caption 1524,"Récupérer du GRID"
        top 1524,top(1521)+height(1521)+10 : left 1524,600 : width 1524,200
        on_click 1524,click_1524
    tab 1530 : parent 1530,1500 : caption 1530,"C" 
      memo 1531 : parent 1531,1530 : top 1531,10 : left 1531,10 : bar_both 1531
        width 1531,width_client(1500)-20 : height 1531,height_client(1500)-80
        font_name 1531,"Courier"
      button 1532 : parent 1532,1530 : caption 1532,"Mise à jour matrice C"
        top 1532,top(1531)+height(1531)+10 : left 1532,100 : width 1532,200
        on_click 1532,click_1532
      button 1533 : parent 1533,1530 : caption 1533,"Copier dans GRID"
        top 1533,top(1531)+height(1531)+10 : left 1533,350 : width 1533,200
        on_click 1533,click_1533
      button 1534 : parent 1534,1530 : caption 1534,"Récupérer du GRID"
        top 1534,top(1531)+height(1531)+10 : left 1534,600 : width 1534,200
        on_click 1534,click_1534
    tab 1540 : parent 1540,1500 : caption 1540,"Grid" 
      grid 1541 : parent 1541,1540 : top 1541,10 : left 1541,10
        width 1541,width_client(1500)-20 : height 1541,height_client(1500)-80
        font_name 1541,"Courier" : on_click 1541,click_grid

  button 1991 : parent 1991,1000 : top 1991,height_client(1000)-40 : left 1991,200
    width 1991,200 : caption 1991,"Créer la matrice" : font_bold 1991
    on_click 1991,creer_matrice
  button 1992 : parent 1992,1000 : top 1992,height_client(1000)-40 : left 1992,420
    width 1992,200 : caption 1992,"Supprimer la matrice" : font_bold 1992
    on_click 1992,supprimer_matrice
 
end_sub

sortir:
  terminate
 
ouvrir_1000:
  show 1000
  if matrix_index%=0
    mark_on 1009
  else
    mark_on 1001+matrix_index%
  end_if
  inactive 0
  afficher_etat()
  return
 
fermer_1000:
  hide 1000
  active 0
  to_foreground 0
  return
 
fermer_1100: 
  hide 1100
  active 0
  to_foreground 0
  return
 
click_1009:
  position 1013,0 : position 1014,0
  return
 
click_1002:
  matrix_index% = 1
  caption 0,"Matrice sélectionnée: A"
  afficher_etat()
  return

click_1003:
  matrix_index% = 2
  caption 0,"Matrice sélectionnée: B"
  afficher_etat()
  return

click_1004:
  matrix_index% = 3
  caption 0,"Matrice sélectionnée: C"
  afficher_etat()
  return

creer_matrice:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)<>0
    matrix%(matrix_index%) = dll_call1("DeleteNumericMatrix",matrix%(matrix_index%))
  end_if
  matrix%(matrix_index%) = dll_call2("CreateNumericMatrix",position(1013),position(1014))
  if matrix%(matrix_index%)=0
    message "Erreur en création de matrice !"
    return
  end_if
  afficher_etat() 
  return
 
supprimer_matrice:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)<>0
    res% = dll_call1("DeleteNumericMatrix",matrix%(matrix_index%))
    matrix%(matrix_index%) = res%
    afficher_etat()
  end_if
  return
 
mettre_a_jour:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "La matrice n'est pas créée !"
    return
  end_if
 
  s$ = ""
  for i%=1 to count(1051)
    s$ = s$ + chr$(34)+item_read$(1051,i%)+chr$(34)+chr$(13)+chr$(10)
  next i%
   
  res% = dll_call2("SetNumericMatrixContents",matrix%(matrix_index%),adr(s$))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à jour !"
  else
    message "Opération en échec !"
  end_if
 
  return

mise_a_zero:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = dll_call1("ZeroNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à zéro !"
  else
    message "Opération en échec !"
  end_if
  return
 
matrice_unitaire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  if nl%<>nc%
    message "La matrice doit être carrée !"
    return
  end_if
  res% = dll_call1("UnityNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat() 
    message "La matrice a été transformée en matrice unitaire !"
  else
    message "Opération en échec !"
  end_if
  return
 
matrice_aleatoire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = dll_call1("RandomNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat()
    message "La matrice a été chargée avec des valeurs aléatoires !"
  else
    message "Opération en échec !"
  end_if
 return
 
multiplication_scalaire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = message_input("Saisie du scalaire","Valeur du scalaire:","1")
  if res%<>1 then return
  s$ = message_text$
  on_error_goto error_ms
  v = val(s$)
  off_error_goto
  res% = dll_call2("MultiplyNumericArrayByScalar",matrix%(matrix_index%),adr(v))
  if res%=0
    afficher_etat() 
    message "La matrice a été multipliée par le scalaire !"
  else
    message "Opération en échec !"
  end_if
  return
error_ms:
  off_error_goto
  message "Ce n'est pas une valeur scalaire valide :!"
  return
 
operations_matrices:
  show 1100
  inactive 0
  return
 
executer_operation:
  M1_index% = 0
  oper_index% = 0
  M2_index% = 0
  M3_index% = 0
 
  if checked(1102)=1 then M1_index% = 1
  if checked(1103)=1 then M1_index% = 2
  if checked(1104)=1 then M1_index% = 3
 
  if checked(1202)=1 then oper_index% = 1
  if checked(1203)=1 then oper_index% = 2
  if checked(1204)=1 then oper_index% = 3
  if checked(1205)=1 then oper_index% = 4
  if checked(1206)=1 then oper_index% = 5
 
  if checked(1302)=1 then M2_index% = 1
  if checked(1303)=1 then M2_index% = 2
  if checked(1304)=1 then M2_index% = 3
 
  if checked(1402)=1 then M3_index% = 1
  if checked(1403)=1 then M3_index% = 2
  if checked(1404)=1 then M3_index% = 3
 
  select oper_index%
    case 0: ' opération non choisie
      message "Veuillez choisir une opération !"
      return
    case 1: ' transposition
            transposition()
    case 2: ' inversion
            inversion()
    case 3: ' addition
            addition()
    case 4: ' soustraction
            soustraction()
    case 5: ' multiplication
            multiplication()
  end_select
  return
 
click_1512:
  mettre_a_jour(1)
  return
 
click_1513:
  LoadGridFromMemo(1541,1511)
  return
 
click_1514:
  LoadMemoFromGrid(1541,1511)
  return
 
click_1522:
  mettre_a_jour(2)
  return
 
click_1523:
  LoadGridFromMemo(1541,1521)
  return
 
click_1524:
  LoadMemoFromGrid(1541,1521)
  return
 
click_1532: 
  mettre_a_jour(3)
  return

click_1533:
  LoadGridFromMemo(1541,1531)
  return
 
click_1534:
  LoadMemoFromGrid(1541,1531)
  return
 
sub afficher_etat()
  clear 1051
  fmt$ = text$(1022)
 
  if matrix%(matrix_index%)=0
    position 1013,0 : position 1014,0
    mark_off 1015
    mark_off 1016
    mark_off 1017
    mark_off 1018
    mark_off 1019
    mark_off 1020
    text 1024,"0"
  else
    res% = dll_call2("GetNumericMatrixStatus",matrix%(matrix_index%),handle(1031))
    if res%<0
      message "La matrice est invalide ou non définie !"
      return
    end_if
    s$ = item_read$(1031,1)  : ' nombre de lignes
    nl% = val(s$)
    position 1013,nl%
    s$ = item_read$(1031,2)  : ' nombre de colonnes
    nc% = val(s$)
    position 1014,nc%
    s$ = item_read$(1031,3)  : ' flag "square"
    if s$="1"
      mark_on 1015
    else
      mark_off 1015
    end_if
    s$ = item_read$(1031,4)  : ' flag "sym"
    if s$="1"
      mark_on 1016
    else
      mark_off 1016
    end_if
    s$ = item_read$(1031,5)  : ' flag "lo"
    if s$="1"
      mark_on 1017
    else
      mark_off 1017
    end_if
    s$ = item_read$(1031,6)  : ' flag "diag"
    if s$="1"
      mark_on 1018
    else
      mark_off 1018
    end_if
    s$ = item_read$(1031,7)  : ' flag "tridiag"
    if s$="1"
      mark_on 1019
    else
      mark_off 1019
    end_if
    s$ = item_read$(1031,8)  : ' flag "hess"
    if s$="1"
      mark_on 1020
    else
      mark_off 1020
    end_if
    text 1024,item_read$(1031,9) : ' déterminante
    res% = dll_call3("GetNumericMatrixContents",matrix%(matrix_index%),adr(fmt$),handle(1051))
    select matrix_index%
      case 1: text 1511,text$(1051)
      case 2: text 1521,text$(1051)
      case 3: text 1531,text$(1051)
    end_select
  end_if
end_sub

sub transposition()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call1("TransposeNumericMatrix",matrix%(M1_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La transposition est effectuée !"
  else
    message "Opération en échec !"
  end_if
end_sub

sub inversion()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call1("InvertNumericMatrix",matrix%(M1_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "L'inversion est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub addition()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("AddNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "L'addition est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub soustraction()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("SubtractNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La soustraction est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub multiplication()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("MultiplyNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La multiplication est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub mettre_a_jour(n%)
  dim_local n_memo%
  matrix_index% = n%
  select matrix_index%
    case 1: n_memo% = 1511
    case 2: n_memo% = 1521
    case 3: n_memo% = 1531
  end_select
  text 1051,text$(n_memo%)
   
  if matrix%(matrix_index%)=0
    message "La matrice n'est pas créée !"
    return
  end_if
 
  s$ = ""
  for i%=1 to count(n_memo%)
    s$ = s$ + chr$(34)+item_read$(n_memo%,i%)+chr$(34)+chr$(13)+chr$(10)
  next i%
   
  res% = dll_call2("SetNumericMatrixContents",matrix%(matrix_index%),adr(s$))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à jour !"
  else
    message "Opération en échec !"
  end_if
end_sub

sub LoadGridFromMemo(nGrid%,nMemo%)
  dim_local nRow%, nCol%, s$, p%, lig%, col%
  memo 9999 : hide 9999
  nRow% = count(nMemo%)
  if nRow%<2
    message "Le memo ne contient pas une matrice valide !"
    delete 9999
    exit_sub
  end_if
  s$ = trim$(item_read$(nMemo%,1)) 
  s$ = prepar$(s$)
  text 9999,s$
  nCol% = count(9999)
  if nCol%<1
    message "Le memo ne contient pas une matrice valide !"
    delete 9999
    exit_sub
  end_if
  grid_row nGrid%,nRow%
  grid_column nGrid%,nCol%+1
  grid_column_width ngrid%,180
  grid_one_column_width nGrid%,1,60
  for col%=2 to nCol%+1
    grid_write nGrid%,1,col%,str$(col%-1)
  next col%
  for lig%=2 to nRow%
    grid_write nGrid%,lig%,1,str$(lig%-1)
    s$ = trim$(item_read$(nMemo%,lig%))
    s$ = prepar$(s$)
    text 9999,s$
    for col%=1 to nCol%
      grid_write nGrid%,lig%,col%+1,item_read$(9999,col%+1)
    next col%
  next lig% 

  delete 9999
end_sub

sub LoadMemoFromGrid(nGrid%,nMemo%)
  dim_local nCol%, nRow%, col%, row%, s$
  nCol% = grid_column(nGrid%)
  nRow% = grid_Row(nGrid%)
  clear nMemo%
  s$ = ""
  for col%=2 to ncol%
    s$ = s$ + "  "+str$(col%-1)
  next col%
  item_add nMemo%,s$
  for row%=2 to nRow%
    s$ = "  "+str$(row%-1)+": "
    for col%=2 to ncol%
      s$ = s$ + "  "+grid_read$(nGrid%,row%,col%)
    next col%
    item_add nMemo%,s$
  next row%
end_sub

fnc prepar$(sx$)
  dim_local s$, p%
  p% = instr(s$,"  ")
  while p%>0
    s$ = left$(s$,p%-1)+" "+mid$(s$,p%+2,len(s$))
    p% = instr(s$,"  ")
  end_while
  p% = instr(s$," ")
  while p%>0
    s$ = left$(s$,p%-1)+chr$(13)+chr$(10)+mid$(s$,p%+1,len(s$))
    p% = instr(s$," ")
  end_while
  result s$
end_fnc

click_grid:
  saisie_cellule(1541)
  return
 
change_1542:
  grid_write 1541,GridRow%,GridCol%,text$(1542)
  return
 
hide_1542:
  if object_exists(1542)=1 then delete 1542
  return
 
sub saisie_cellule(nGrid%)
  dim_local row%, col%
  row% = grid_y_to_row(nGrid%, mouse_y_left_down(1541))
  col% = grid_x_to_column(nGrid%, mouse_x_left_down(1541))
  if object_exists(1542)=0
    edit 1542 : parent 1542,1540 : hide 1542 : width 1542,180 : height 1542,35
      font_color 1542,255,0,0 : font_italic 1542 : on_change 1542,change_1542
      font_size 1542,10
  end_if
  GridRow% = row%
  GridCol% = col%
  top  1542, top(1541)+grid_row_height(1541)*(row%-1)+3
  left 1542,left(1541)+grid_column_width(1541)*(col%-2)+grid_one_column_width(1541,1)+3
  text 1542,grid_read$(1541,row%,col%)
  show 1542
  set_focus 1542
end_sub


Dernière édition par Klaus le Mar 15 Nov 2022 - 11:58, édité 5 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyDim 13 Nov 2022 - 19:12

Re-bienvenue sur le forum, ami Klaus.
Ta longue absence nous a inquiété.
Vraiment, je suis content de ton retour.
Bon, ok
J’ai téléchargé la nouvelle version de KGF.DLL et j’ai lancé la démo très vite fait.
Je n’ai pas pu comprendre comment je m’y prends pour tester.(J’y reviendrai sans doute).
Je remarque que tu as utilisé le vocable  déterminante.
A ma connaissance, on dit le  déterminant.
De toute les façons, bravo !
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyLun 14 Nov 2022 - 0:26

"déterminant" à la place de "déterminat=nte" ? Ok, je vais changer cela. C'est la déformation de mes origines allemandes - dans ma langue maternelle, on dit "die Determinante", et j'ai donc intuitivement utilisé le genre féminin... j'aurais dû vérifier !

Merci pour tes compliments ! Ceci dit, j'ai utilisé une unité Delphi trouvé ici:
https://codes-sources.commentcamarche.net/source/37616-class-de-calcul-matriciel-diagonalisation-de-matrices-symetriques-reelles
avec la licence Creative Commons. J'ai donné le lien ainsi que les conditions de la licence dans la documentation CHM de ces fonctions, ainsi que dans le source que j'ai écrit. J'ai juste fait le wrapper pour Panoramic autour de cette unité, afin de la rendre accessible à tout le monde. Cette unité va d'ailleurs beaucoup plus loin, mais je n'ai pas tout rendu accessible...


Dernière édition par Klaus le Mar 15 Nov 2022 - 10:56, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyLun 14 Nov 2022 - 7:34

Bonjour Klaus,

La bibliothèque DMath que je développe contient de nombreuses unités de calcul matriciel pour Delphi :

https://sourceforge.net/projects/dmath/

Entre autres, la diagonalisation des matrices non symétriques.
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyLun 14 Nov 2022 - 17:44

La doc en ligne de KGF.dll est actualisée. Elle est au même niveau que KGF.chm. Elle est accessible via mon site, ou par le lien suivant:
http://klauspanoramic.infinityfreeapp.com/SommaireIndex.html
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyLun 14 Nov 2022 - 21:30

@Klaus
Une petite erreur de frappe:

Dans Objet NumericMatrix
Note importante:
Un objet NumericMatrix occupe de l'espace mémoire dans KGF.dll, pas dans le programme Paoramic Panoramic. Laughing
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyMar 15 Nov 2022 - 13:11

J'ai affiné un peu le programme de démo, j'ai corrigé de petites anomalies et j'ai surtout ajouté un onglet "Grid" accessible par la deuxième ligne du menu. Dans chacun des 3 onglets A, B et C, il y a maintenant 3 boutons;
- Mettre à jour ==> on peut modifier les données la le mémo, puis actualiser le contenu de la matrice par ces données
- Copier dans GRID ==> le GRID de l'onglet "Grid" sera chargé par les données du mémo
- Récupérer du GRID ==> reconstitue le mémo à partir des données du GRID

On peut ainsi aisément modifier une ou plusieurs cellules, puis mettre la matrice à jour.

J'ai mis en place un mécanisme simulant la saisie directe dans le GRID:
un clic dans une cellule fait apparaître unn EDIT couvrant la cellule et montrant comme données initiales le contenu de la cellule. On peut alors modifier la cellule aisément, cliquer sur une autre et continuer, etc. Un clic sur un des autres onglets fait "disparaître" le champ EDIT de saisie pour laisser la vue normale du GRID. On peut alors récupérer les données du GRID par le bouton correspondant, puis mettre la matrice à jour.

Voici le code actualisé:
Code:
' test_Matrix_JnBiz.bas

labels()
variables()
menu()
GUI()

dir_change "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF"
dll_on "KGF.dll"
end

sub labels()
  label sortir, ouvrir_1000, fermer_1000
  label click_1009, click_1002, click_1003, click_1004
  label creer_matrice, supprimer_matrice, mettre_a_jour
  label mise_a_zero, matrice_unitaire, matrice_aleatoire, multiplication_scalaire, error_ms
  label operations_matrices, fermer_1100, executer_operation
  label click_1512, click_1513, click_1514
  label click_1522, click_1523, click_1524
  label click_1532, click_1533, click_1534
  label click_grid, change_1542, hide_1542
 
end_sub                         

sub variables()
  dim res%, matrix%(3), nLig%(3),  nCol%(3), matrix_index%
  dim M1_index%, oper_index%, M2_index%, m3_index%
  dim GridRow%, GridCol% 
    matrix%(1) = 0
    matrix%(2) = 0
    matrix%(3) = 0
    matrix_index% = 0
  dim n%, s$, nl%, nc%, fmt$, i%, v
    fmt$ = "%e"

end_sub

sub menu()
  main_menu 1
    sub_menu 10 : parent 10,1 : caption 10,"Matrices"
      sub_menu 11 : parent 11,10 : caption 11,"Ouvrir une matrice" : on_click 11,ouvrir_1000 
      sub_menu 12 : parent 12,10 : caption 12,"Opérations entre matrices" : on_click 12,operations_matrices
      sub_menu 18 : parent 18,10 : caption 18,"-"
      sub_menu 19 : parent 19,10 : caption 19,"Sortir" : on_click 19,sortir
       
end_sub

sub GUI()
  full_space 0
  caption 0,"Matrice sélectionnée: <aucune>"
 
  form 1000 : hide 1000 : width 1000,screen_x-30 : height 1000,screen_y-30
    top 1000,10 : left 1000,10 : on_close 1000,fermer_1000
    caption 1000,"Paramétrage des matrices"
  container_option 1001 : parent 1001,1000 : top 1001,10 : left 1001,10
    height 1001,90 : width 1001,60
    caption 1001,"Matrice:"
  option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
    width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
    on_click 1009,click_1009
  option 1002 : parent 1002,1001 : top 1002,20 : left 1002,20 : caption 1002,"A"
    width 1002,30 : on_click 1002,click_1002
  option 1003 : parent 1003,1001 : top 1003,40 : left 1003,20 : caption 1003,"B"
    width 1003,30 : on_click 1003,click_1003
  option 1004 : parent 1004,1001 : top 1004,60 : left 1004,20 : caption 1004,"C"
    width 1004,30 : on_click 1004,click_1004


  container 1010 : parent 1010,1000 : top 1010,10 : left 1010,100
    width 1010,650 : height 1010,110 : caption 1010,"Propriétés:"   
  alpha 1011 : parent 1011,1010 : top 1011,20 : left 1011,20 : caption 1011,"Lignes:"
  alpha 1012 : parent 1012,1010 : top 1012,50 : left 1012,20 : caption 1012,"Colonnes:"
  spin 1013 :parent 1013,1010 : top 1013,20 : left 1013,80 : width 1013,50
    min 1013,0 : max 1013,50 : position 1013,0
  spin 1014 :parent 1014,1010 : top 1014,50 : left 1014,80 : width 1014,50
    min 1014,0 : max 1014,50 : position 1014,0
  check 1015 : parent 1015,1010 : top 1015,20 : left 1015,160
    caption 1015,"Matrice carrée"
  check 1016 : parent 1016,1010 : top 1016,40 : left 1016,160 : width 1016,110
    caption 1016,"Matrice symétrique"
  check 1017 : parent 1017,1010 : top 1017,60 : left 1017,160 : width 1017,150
    caption 1017,"Matrice tri. inférieure"
  check 1018 : parent 1018,1010 : top 1018,20 : left 1018,330 : width 1018,150
    caption 1018,"Matrice diagonale"
  check 1019 : parent 1019,1010 : top 1019,40 : left 1019,330 : width 1019,150
    caption 1019,"Matrice tridiagonale"
  check 1020 : parent 1020,1010 : top 1020,60 : left 1020,330 : width 1020,150
    caption 1020,"Matrice de Hessenberg"
  alpha 1021 : parent 1021,1010 : top 1021,20 : left 1021,500
    caption 1021,"Format numérique:"
  edit 1022 : parent 1022,1010 : top 1022,40 : left 1022,500
    text 1022,fmt$
  alpha 1023 : parent 1023,1010 : top 1023,60 : left 1023,500
    caption 1023,"Déterminante:"
  edit 1024 : parent 1024,1010 : top 1024,80 : left 1024,500
    text 1024,"0"
   
  container 1030 : hide 1030 : parent 1030,1000 

  memo 1031 : parent 1031,1030 : hide 1031 : bar_both 1031
    ' mémo caché pour l'état d'une matrice:
    '  ligne 1: nombre de lignes
    '  ligne 2: nombre de colonnes
    '  ligne 3: flag "square"
    '  ligne 4: flag "sym"
    '  ligne 5: flag "lo"
    '  ligne 6: flag "diag"
    '  ligne 7: flag "tridiag"
    '  ligne 8: flag "hess"
   
  container 1050 : parent 1050,1000 : top 1050,120 : left 1050,20
    width 1050,width_client(1000)-40 : height 1050,height_client(1000)-200
    caption 1050,"Eléments:"   
  memo 1051 : parent 1051,1050 : top 1051,20 : left 1051,20
    width 1051,width_client(1050)-40 : height 1051,height_client(1050)-80
    bar_both 1051 : font_name 1051,"Courier"
  button 1052 : parent 1052,1050 : top 1052,top(1051)+height(1051)+10 : left 1052,30
    width 1052,200 : caption 1052,"Mettre à jour" : on_click 1052,mettre_a_jour
 
  form 1100 : hide 1100 : width 1100,screen_x-30 : height 1100,screen_y-30
    top 1100,10 : left 1100,10 : on_close 1100,fermer_1100
    caption 1100,"Opérations entre matrices: M1 x M2 => M3"
   
  container_option 1101 : parent 1101,1100 : top 1101,10 : left 1101,10
    height 1101,90 : width 1101,60
    caption 1101,"M1:"
'    option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
'      width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
'      on_click 1009,click_1009
    option 1102 : parent 1102,1101 : top 1102,20 : left 1102,20 : caption 1102,"A"
      width 1102,30
    option 1103 : parent 1103,1101 : top 1103,40 : left 1103,20 : caption 1103,"B"
      width 1103,30
    option 1104 : parent 1104,1101 : top 1104,60 : left 1104,20 : caption 1104,"C"
      width 1104,30

  container_option 1201 : parent 1201,1100 : top 1201,10 : left 1201,100
      height 1201,210 : width 1201,260
      caption 1201,"Opération:"

    option 1202 : parent 1202,1201 : top 1202,20 : left 1202,20 : caption 1202,"Mise à zéro"
        on_click 1202,mise_a_zero
    option 1203 : parent 1203,1201 : top 1203,40 : left 1203,20 : caption 1203,"Matrice unitaire"
        on_click 1203,matrice_unitaire
    option 1204 : parent 1204,1201 : top 1204,60 : left 1204,20 : caption 1204,"Matrice aléatoire"
        on_click 1204,matrice_aleatoire
    option 1205 : parent 1205,1201 : top 1205,80 : left 1205,20 : caption 1205,"Multiplication par un scalaire"
        on_click 1205,multiplication_scalaire : width 1205,200     
    option 1206 : parent 1206,1201 : top 1206,100 : left 1206,20 : caption 1206,"Transposition"
      width 1206,130
    option 1207 : parent 1207,1201 : top 1207,120 : left 1207,20 : caption 1207,"Inversion"
      width 1207,130
    option 1208 : parent 1208,1201 : top 1208,140 : left 1208,20 : caption 1208,"Addition"
      width 1208,130
    option 1209 : parent 1209,1201 : top 1209,160 : left 1209,20 : caption 1209,"Soustraction"
      width 1209,130
    option 1210 : parent 1210,1201 : top 1210,180 : left 1210,20 : caption 1210,"Multiplication"
      width 1210,130

  container_option 1301 : parent 1301,1100 : top 1301,10 : left 1301,400
    height 1301,90 : width 1301,60
    caption 1301,"M2:"
'    option 1009 : parent 1009,1001 : top 1009,200 : left 1009,20 : caption 1009,"./."
'      width 1009,30  : ' !!!!!!!! cette option doit rester invisible !
'      on_click 1009,click_1009
    option 1302 : parent 1302,1301 : top 1302,20 : left 1302,20 : caption 1302,"A"
      width 1302,30
    option 1303 : parent 1303,1301 : top 1303,40 : left 1303,20 : caption 1303,"B"
      width 1303,30
    option 1304 : parent 1304,1301 : top 1304,60 : left 1304,20 : caption 1304,"C"
      width 1304,30

  container_option 1401 : parent 1401,1100 : top 1401,10 : left 1401,500
      height 1401,90 : width 1401,60
      caption 1401,"M3:"
    option 1402 : parent 1402,1401 : top 1402,20 : left 1402,20 : caption 1402,"A"
      width 1402,30
    option 1403 : parent 1403,1401 : top 1403,40 : left 1403,20 : caption 1403,"B"
      width 1403,30
    option 1404 : parent 1404,1401 : top 1404,60 : left 1404,20 : caption 1404,"C"
      width 1404,30
 
  button 1121 : parent 1121,1100 : top 1121,30 : left 1121,600
    width 1121,200 : caption 1121,"Exécuter l'opération"
    on_click 1121,executer_operation 
   
  container_tab 1500 : parent 1500,1100 : top 1500,220 : left 1500,10
      width 1500,width_client(1100)-20 : height 1500,height_client(1100)-220 
      on_mouse_down 1500,hide_1542 
    tab 1510 : parent 1510,1500 : caption 1510,"A"
      memo 1511 : parent 1511,1510 : top 1511,10 : left 1511,10 : bar_both 1511
        width 1511,width_client(1500)-20 : height 1511,height_client(1500)-80
        font_name 1511,"Courier"
      button 1512 : parent 1512,1510 : caption 1512,"Mise à jour matrice A"
        top 1512,top(1511)+height(1511)+10 : left 1512,100 : width 1512,200
        on_click 1512,click_1512
      button 1513 : parent 1513,1510 : caption 1513,"Copier dans GRID"
        top 1513,top(1511)+height(1511)+10 : left 1513,350 : width 1513,200
        on_click 1513,click_1513
      button 1514 : parent 1514,1510 : caption 1514,"Récupérer du GRID"
        top 1514,top(1511)+height(1511)+10 : left 1514,600 : width 1514,200
        on_click 1514,click_1514
    tab 1520 : parent 1520,1500 : caption 1520,"B" 
      memo 1521 : parent 1521,1520 : top 1521,10 : left 1521,10 : bar_both 1521
        width 1521,width_client(1500)-20 : height 1521,height_client(1500)-80
        font_name 1521,"Courier"
      button 1522 : parent 1522,1520 : caption 1522,"Mise à jour matrice B"
        top 1522,top(1521)+height(1521)+10 : left 1522,100 : width 1522,200
        on_click 1522,click_1522
      button 1523 : parent 1523,1520 : caption 1523,"Copier dans GRID"
        top 1523,top(1521)+height(1521)+10 : left 1523,350 : width 1523,200
        on_click 1523,click_1523
      button 1524 : parent 1524,1520 : caption 1524,"Récupérer du GRID"
        top 1524,top(1521)+height(1521)+10 : left 1524,600 : width 1524,200
        on_click 1524,click_1524
    tab 1530 : parent 1530,1500 : caption 1530,"C" 
      memo 1531 : parent 1531,1530 : top 1531,10 : left 1531,10 : bar_both 1531
        width 1531,width_client(1500)-20 : height 1531,height_client(1500)-80
        font_name 1531,"Courier"
      button 1532 : parent 1532,1530 : caption 1532,"Mise à jour matrice C"
        top 1532,top(1531)+height(1531)+10 : left 1532,100 : width 1532,200
        on_click 1532,click_1532
      button 1533 : parent 1533,1530 : caption 1533,"Copier dans GRID"
        top 1533,top(1531)+height(1531)+10 : left 1533,350 : width 1533,200
        on_click 1533,click_1533
      button 1534 : parent 1534,1530 : caption 1534,"Récupérer du GRID"
        top 1534,top(1531)+height(1531)+10 : left 1534,600 : width 1534,200
        on_click 1534,click_1534
    tab 1540 : parent 1540,1500 : caption 1540,"Grid" 
      grid 1541 : parent 1541,1540 : top 1541,10 : left 1541,10
        width 1541,width_client(1500)-20 : height 1541,height_client(1500)-80
        font_name 1541,"Courier" : on_click 1541,click_grid

  button 1991 : parent 1991,1000 : top 1991,height_client(1000)-40 : left 1991,200
    width 1991,200 : caption 1991,"Créer la matrice" : font_bold 1991
    on_click 1991,creer_matrice
  button 1992 : parent 1992,1000 : top 1992,height_client(1000)-40 : left 1992,420
    width 1992,200 : caption 1992,"Supprimer la matrice" : font_bold 1992
    on_click 1992,supprimer_matrice
 
end_sub

sortir:
  terminate
 
ouvrir_1000:
  show 1000
  if matrix_index%=0
    mark_on 1009
  else
    mark_on 1001+matrix_index%
  end_if
  inactive 0
  afficher_etat()
  return
 
fermer_1000:
  hide 1000
  active 0
  to_foreground 0
  return
 
fermer_1100: 
  hide 1100
  active 0
  to_foreground 0
  return
 
click_1009:
  position 1013,0 : position 1014,0
  return
 
click_1002:
  matrix_index% = 1
  caption 0,"Matrice sélectionnée: A"
  afficher_etat()
  return

click_1003:
  matrix_index% = 2
  caption 0,"Matrice sélectionnée: B"
  afficher_etat()
  return

click_1004:
  matrix_index% = 3
  caption 0,"Matrice sélectionnée: C"
  afficher_etat()
  return

creer_matrice:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)<>0
    matrix%(matrix_index%) = dll_call1("DeleteNumericMatrix",matrix%(matrix_index%))
  end_if
  matrix%(matrix_index%) = dll_call2("CreateNumericMatrix",position(1013),position(1014))
  if matrix%(matrix_index%)=0
    message "Erreur en création de matrice !"
    return
  end_if
  afficher_etat() 
  return
 
supprimer_matrice:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)<>0
    res% = dll_call1("DeleteNumericMatrix",matrix%(matrix_index%))
    matrix%(matrix_index%) = res%
    afficher_etat()
  end_if
  return
 
mettre_a_jour:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "La matrice n'est pas créée !"
    return
  end_if
 
  s$ = ""
  for i%=1 to count(1051)
    s$ = s$ + chr$(34)+item_read$(1051,i%)+chr$(34)+chr$(13)+chr$(10)
  next i%
   
  res% = dll_call2("SetNumericMatrixContents",matrix%(matrix_index%),adr(s$))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à jour !"
  else
    message "Opération en échec !"
  end_if
 
  return

mise_a_zero:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = dll_call1("ZeroNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à zéro !"
  else
    message "Opération en échec !"
  end_if
  return
 
matrice_unitaire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  if nl%<>nc%
    message "La matrice doit être carrée !"
    return
  end_if
  res% = dll_call1("UnityNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat() 
    message "La matrice a été transformée en matrice unitaire !"
  else
    message "Opération en échec !"
  end_if
  return
 
matrice_aleatoire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = dll_call1("RandomNumericMatrix",matrix%(matrix_index%))
  if res%=0
    afficher_etat()
    message "La matrice a été chargée avec des valeurs aléatoires !"
  else
    message "Opération en échec !"
  end_if
 return
 
multiplication_scalaire:
  if matrix_index%=0
    message "Veuillez sélectionner une matrice !"
    return
  end_if
  if matrix%(matrix_index%)=0
    message "Veuillez créer cette matrice !"
    return
  end_if
  res% = message_input("Saisie du scalaire","Valeur du scalaire:","1")
  if res%<>1 then return
  s$ = message_text$
  on_error_goto error_ms
  v = val(s$)
  off_error_goto
  res% = dll_call2("MultiplyNumericArrayByScalar",matrix%(matrix_index%),adr(v))
  if res%=0
    afficher_etat() 
    message "La matrice a été multipliée par le scalaire !"
  else
    message "Opération en échec !"
  end_if
  return
error_ms:
  off_error_goto
  message "Ce n'est pas une valeur scalaire valide :!"
  return
 
operations_matrices:
  show 1100
  inactive 0
  return
 
executer_operation:
  M1_index% = 0
  oper_index% = 0
  M2_index% = 0
  M3_index% = 0
 
  if checked(1102)=1 then M1_index% = 1
  if checked(1103)=1 then M1_index% = 2
  if checked(1104)=1 then M1_index% = 3
 
  if checked(1202)=1 then oper_index% = 1
  if checked(1203)=1 then oper_index% = 2
  if checked(1204)=1 then oper_index% = 3
  if checked(1205)=1 then oper_index% = 4
  if checked(1206)=1 then oper_index% = 5
 
  if checked(1302)=1 then M2_index% = 1
  if checked(1303)=1 then M2_index% = 2
  if checked(1304)=1 then M2_index% = 3
 
  if checked(1402)=1 then M3_index% = 1
  if checked(1403)=1 then M3_index% = 2
  if checked(1404)=1 then M3_index% = 3
 
  select oper_index%
    case 0: ' opération non choisie
      message "Veuillez choisir une opération !"
      return
    case 1: ' transposition
            transposition()
    case 2: ' inversion
            inversion()
    case 3: ' addition
            addition()
    case 4: ' soustraction
            soustraction()
    case 5: ' multiplication
            multiplication()
  end_select
  return
 
click_1512:
  mettre_a_jour(1)
  return
 
click_1513:
  LoadGridFromMemo(1541,1511)
  return
 
click_1514:
  LoadMemoFromGrid(1541,1511)
  return
 
click_1522:
  mettre_a_jour(2)
  return
 
click_1523:
  LoadGridFromMemo(1541,1521)
  return
 
click_1524:
  LoadMemoFromGrid(1541,1521)
  return
 
click_1532: 
  mettre_a_jour(3)
  return

click_1533:
  LoadGridFromMemo(1541,1531)
  return
 
click_1534:
  LoadMemoFromGrid(1541,1531)
  return
 
sub afficher_etat()
  clear 1051
  fmt$ = text$(1022)
 
  if matrix%(matrix_index%)=0
    position 1013,0 : position 1014,0
    mark_off 1015
    mark_off 1016
    mark_off 1017
    mark_off 1018
    mark_off 1019
    mark_off 1020
    text 1024,"0"
  else
    res% = dll_call2("GetNumericMatrixStatus",matrix%(matrix_index%),handle(1031))
    if res%<0
      message "La matrice est invalide ou non définie !"
      return
    end_if
    s$ = item_read$(1031,1)  : ' nombre de lignes
    nl% = val(s$)
    position 1013,nl%
    s$ = item_read$(1031,2)  : ' nombre de colonnes
    nc% = val(s$)
    position 1014,nc%
    s$ = item_read$(1031,3)  : ' flag "square"
    if s$="1"
      mark_on 1015
    else
      mark_off 1015
    end_if
    s$ = item_read$(1031,4)  : ' flag "sym"
    if s$="1"
      mark_on 1016
    else
      mark_off 1016
    end_if
    s$ = item_read$(1031,5)  : ' flag "lo"
    if s$="1"
      mark_on 1017
    else
      mark_off 1017
    end_if
    s$ = item_read$(1031,6)  : ' flag "diag"
    if s$="1"
      mark_on 1018
    else
      mark_off 1018
    end_if
    s$ = item_read$(1031,7)  : ' flag "tridiag"
    if s$="1"
      mark_on 1019
    else
      mark_off 1019
    end_if
    s$ = item_read$(1031,8)  : ' flag "hess"
    if s$="1"
      mark_on 1020
    else
      mark_off 1020
    end_if
    text 1024,item_read$(1031,9) : ' déterminante
    res% = dll_call3("GetNumericMatrixContents",matrix%(matrix_index%),adr(fmt$),handle(1051))
    select matrix_index%
      case 1: text 1511,text$(1051)
      case 2: text 1521,text$(1051)
      case 3: text 1531,text$(1051)
    end_select
  end_if
end_sub

sub transposition()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call1("TransposeNumericMatrix",matrix%(M1_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La transposition est effectuée !"
  else
    message "Opération en échec !"
  end_if
end_sub

sub inversion()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call1("InvertNumericMatrix",matrix%(M1_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "L'inversion est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub addition()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("AddNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "L'addition est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub soustraction()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("SubtractNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La soustraction est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub multiplication()
  if M1_index%=0
    message "Veuillez choisir une matrice M1 !"
    exit_sub
  end_if
  if M2_index%=0
    message "Veuillez choisir une matrice M2 !"
    exit_sub
  end_if
  if M3_index%=0
    message "Veuillez choisir une matrice M3 !"
    exit_sub
  end_if
  if matrix%(M3_index%)<>0 then matrix%(M3_index%) = dll_call1("DeleteNumericMatrix",matrix%(M3_index%))
  matrix%(M3_index%) = dll_call2("MultiplyNumericMatrix",matrix%(M1_index%),matrix%(M2_index%))
  if matrix%(M3_index%)<>0
    afficher_etat() 
    message "La multiplication est effectuée !"
  else
    message "Opération en échec !"
  end_if 
end_sub

sub mettre_a_jour(n%)
  dim_local n_memo%
  matrix_index% = n%
  select matrix_index%
    case 1: n_memo% = 1511
    case 2: n_memo% = 1521
    case 3: n_memo% = 1531
  end_select
  text 1051,text$(n_memo%)
   
  if matrix%(matrix_index%)=0
    message "La matrice n'est pas créée !"
    return
  end_if
 
  s$ = ""
  for i%=1 to count(n_memo%)
    s$ = s$ + chr$(34)+item_read$(n_memo%,i%)+chr$(34)+chr$(13)+chr$(10)
  next i%
   
  res% = dll_call2("SetNumericMatrixContents",matrix%(matrix_index%),adr(s$))
  if res%=0
    afficher_etat() 
    message "La matrice a été mise à jour !"
  else
    message "Opération en échec !"
  end_if
end_sub

sub LoadGridFromMemo(nGrid%,nMemo%)
  dim_local nRow%, nCol%, s$, p%, lig%, col%
  memo 9999 : hide 9999
  nRow% = count(nMemo%)
  if nRow%<2
    message "Le memo ne contient pas une matrice valide !"
    delete 9999
    exit_sub
  end_if
  s$ = trim$(item_read$(nMemo%,1)) 
  s$ = prepar$(s$)
  text 9999,s$
  nCol% = count(9999)
  if nCol%<1
    message "Le memo ne contient pas une matrice valide !"
    delete 9999
    exit_sub
  end_if
  grid_row nGrid%,nRow%
  grid_column nGrid%,nCol%+1
  grid_column_width ngrid%,180
  grid_one_column_width nGrid%,1,60
  for col%=2 to nCol%+1
    grid_write nGrid%,1,col%,str$(col%-1)
  next col%
  for lig%=2 to nRow%
    grid_write nGrid%,lig%,1,str$(lig%-1)
    s$ = trim$(item_read$(nMemo%,lig%))
    s$ = prepar$(s$)
    text 9999,s$
    for col%=1 to nCol%
      grid_write nGrid%,lig%,col%+1,item_read$(9999,col%+1)
    next col%
  next lig% 

  delete 9999
end_sub

sub LoadMemoFromGrid(nGrid%,nMemo%)
  dim_local nCol%, nRow%, col%, row%, s$
  nCol% = grid_column(nGrid%)
  nRow% = grid_Row(nGrid%)
  clear nMemo%
  s$ = ""
  for col%=2 to ncol%
    s$ = s$ + "  "+str$(col%-1)
  next col%
  item_add nMemo%,s$
  for row%=2 to nRow%
    s$ = "  "+str$(row%-1)+": "
    for col%=2 to ncol%
      s$ = s$ + "  "+grid_read$(nGrid%,row%,col%)
    next col%
    item_add nMemo%,s$
  next row%
end_sub

fnc prepar$(sx$)
  dim_local s$, p%
  p% = instr(s$,"  ")
  while p%>0
    s$ = left$(s$,p%-1)+" "+mid$(s$,p%+2,len(s$))
    p% = instr(s$,"  ")
  end_while
  p% = instr(s$," ")
  while p%>0
    s$ = left$(s$,p%-1)+chr$(13)+chr$(10)+mid$(s$,p%+1,len(s$))
    p% = instr(s$," ")
  end_while
  result s$
end_fnc

click_grid:
  saisie_cellule(1541)
  return
 
change_1542:
  grid_write 1541,GridRow%,GridCol%,text$(1542)
  return
 
hide_1542:
  if object_exists(1542)=1 then delete 1542
  return
 
sub saisie_cellule(nGrid%)
  dim_local row%, col%
  row% = grid_y_to_row(nGrid%, mouse_y_left_down(1541))
  col% = grid_x_to_column(nGrid%, mouse_x_left_down(1541))
  if object_exists(1542)=0
    edit 1542 : parent 1542,1540 : hide 1542 : width 1542,180 : height 1542,35
      font_color 1542,255,0,0 : font_italic 1542 : on_change 1542,change_1542
      font_size 1542,10
  end_if
  GridRow% = row%
  GridCol% = col%
  top  1542, top(1541)+grid_row_height(1541)*(row%-1)+3
  left 1542,left(1541)+grid_column_width(1541)*(col%-2)+grid_one_column_width(1541,1)+3
  text 1542,grid_read$(1541,row%,col%)
  show 1542
  set_focus 1542
end_sub
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
topmozika

topmozika


Nombre de messages : 79
Age : 62
Localisation : Antananarivo - Madagascar
Date d'inscription : 09/06/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Bonjour papydall   KGF_dll - nouvelles versions - Page 10 EmptyJeu 17 Nov 2022 - 14:03

Je suis revenu car je suis toujours fan du Panoramic et le Basic en générale.
J'étais absent pendant quelques années pour raison de temps libre, mais ne vous en faites pas car je suis le forum de temps en temps. Bravo à vous car le Basic est vivant grâce à vous
Revenir en haut Aller en bas
topmozika

topmozika


Nombre de messages : 79
Age : 62
Localisation : Antananarivo - Madagascar
Date d'inscription : 09/06/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Bonjour Klaus   KGF_dll - nouvelles versions - Page 10 EmptyJeu 17 Nov 2022 - 14:12

J'ai uilisé le KGF.dll avec Liberty Basic et ça fonctionne très bien. C'est un dll universel et merci à vous. Bon courage
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyVen 18 Nov 2022 - 5:24

Salut topmozika !
Je suis content  Laughing de ton retour après une si longue absence.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyJeu 1 Déc 2022 - 17:39

KGF.dll V9.82 du 26/11/2022

Nouveautés:
- Nouvel objet: ObjectGrid

Modules modifiés:
KGF.dll
KGF.chm


La doc en version KGF.chm est à jour, ainsi que la doc en ligne.


Ce nouvel objet s'ajoute à ma grande collection d'objets spéciaux, et en particulier ajoute une nouvelle façon de voir un objet GRID. Il s'agit réellement d'un GRID, mais un GRID un peu spécial. Chaque cellule de cet objet ObjectGrid est un objet indépendant par lui-même !

On a bien la notion de lignes et colonnes, avec même hauteur de toutes les cellules d'une même ligne et même margeur de toutes les cellules d'une même colonne. Mais chaque cellule peut (et pas DOIT !) contenir un objet visuel qui sera automatiquement adapté aux contraintes géométriques de la cellule l'hébergeant. Une cellule "vide" 'sans objet associé) n'affiche rien à l'écran.

On peut définir de très grandes grilles, largement au-delà des capacités d'une fenêtre ou de l'écran. C'est pourquoi un tel objet crée une zone de visualisation qui est placée dans un objet ScrollPanel (un autre objet de KGF.dll...) qui a ses propres ascenseurs, permettant de faire défiler les cellules de la grille horizontalement et verticalement.

Actuellement, une cellule peut contenir un des objets suivants:
EDIT, MEMO, BUTTON ou CHECK
Oui, on peut avoir un MEMO comme cellule d'une grille ! Ca ouvre des possibilités, non ? Imaginez une facture dont chaque ligne de produit contient une zone "libelle" qui est en fait un MEMO et contient un texte descriptif multi-lignes... On peut avoir des cases à cocher (CHECK), des boutons, ...

Un clic dans un objet d'une cellule génère un USER_EVENT indiquant le numéro de ligne et de colonne ainsi que le type de l'objet dans la cellule. Ceci est par défaut activé pour chaque cellule, mais globalement désactivé pour l'objet ObjectGrid. On peut évidemment modifier tout cela dynamiquement.

On peut saisir des données directement dans les cellules de type EDIT, MEMO ou CHECK, sans passer par une astuce de programmation compliquée. Cette possibilité est activée par défaut, mais peut être désactivée individuellement pour certaines cellules. On obtient ainsi des cellules protégées en écrirure.

On peut modifier la hauteur de certaines lignes, la largeur de certaines colonnes, et modifier les caractéristiques de certaines cellules comme la police, sa couleur, sa taille et ses attributs graphiques. On peut évidemment charger des données dans les objets des cellules et relire ces données. Tout cela peut se faire induviduellement, cellule par cellule, ou d'une façon plus large en spécifiant des fourchettes de numéros de ligne et/ou de numéros de colonne, ou en definissant un rectangle de cellules. On peut récupérer uen description textuelle de la structure de la grille, avec le nombre de lignes et colonnes, puis une ligne contenant des E, M, B ou C pour chaque cellule objet et * pour unen cellule vide. Ces lettres sont mises en minuscules si la cellule est protégée en écriture...

Vous voulez faire un panneau de contrôle avec une grille de 10 lignes de 5 boutons ? Pas de problème !
Solution: une grille de 11 lignes et 6 colonnes.
Première ligne: les titres des colonnes (optionnel).
Première colonne: les titres des lignes (optionnel).
Toutes les autres cellules sont des boutons, créés par un seul appel d'une fonction de KGF.dll et organisés en grille.

Vous voulez faire un écran de paramétrage avec de multiples options à sélectionner ? Pas de problème !
Solution: comme ci-dessus, éventuellement définir des libellés, mais surtout créer une grille d'objets CHECK représentant chacun une case à cocher. Visuellement très clair et facile à utiliser.

Que reste-t-il à dire ? Le choix des 4 objets EDIT, MEMO, BUTTON et CHECK était arbitraire de ma part. CEtte liste peut aisément être allongé selon les (vos) besoins (PICTURE pour avoir des icônes, SPIN, PROGRESS_BAR, ...). Il n'y a pas de limites, ni de principe ni de nombre.

Alors, voici une petite démo (la même que celle qui est incluse dans la doc). Le programme s'ouvre sur une fenêtre ayant deux boutons: "Liste de contacts" et "Démo technique". Cliquez sur l'un ou l'autre et jouez avec les champs. A tout momemt, on peut cliquer sur l'autre bouton et le visuel change - à volonté. Dans les deux versions, certaines cellules sont protégées contre la saisie directe, d'autres contre la génération d'un USER_EVENT - à essayer. Toute la démo tient en 170 lignes...

Code:
' test_ObjectGrid.bas

label user_event, contacts, technique
dim res%, OG%, wp%, lp%, r%, c%, s$, s1$, clr%, M1%

dir_change "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF"
dll_on "KGF.dll"

on_user_event user_event

caption 0,"Démo de l'objet ObjectGrid"
height 0,600 : width 0,700
button 10 : top 10,10 : left 10,10 : width 10,200 : caption 10,"Liste de contacts"
  on_click 10,contacts
button 11 : top 11,10 : left 11,220 : width 11,200 : caption 11,"Démo technique"
  on_click 11,technique
alpha 1 : top 1,450 : left 1,10 : font_size 1,16
memo 2 : bar_both 2 : top 2,10 : left 2,450 : width 2,150 : height 2,400
  font_name 2,"Courier"
  
end


contacts:
caption 0,"ObjectGrid avec une liste de contacts"
' supprimer un ObjectGrid éventuellement préexistant
OG% = dll_call1("DeleteObjectGrid",OG%)  

' créer un ObjectGrid avec 30 lignes de 4 colonnes
OG% = dll_call5("CreateObjectGrid",handle(0),30,4,400,300)
' déplacer l'objet sans toucher aux dimensions
M1% = 0 - 1
res% = dll_call5("LocateObjectGrid",OG%,10,50,M1%,M1%)

' créer des objets EDIT dans toutes les cellules sauf dans la colonne 3
res% = dll_call6("CreateObjectGridCell",OG%,0,0,0,29,2)
' créer un objet EDIT dans la ligne 0 colonne 3
res% = dll_call6("CreateObjectGridCell",OG%,0,0,0,0,3)
' créer des objets BUTTON dans toutes les cellules de la colonne 3 sauf ligne 0
res% = dll_call6("CreateObjectGridCell",OG%,2,1,3,29,3)
' réduire la largeur de la colonne 0 à 40 pixels
res% = dll_call4("SetObjectGridColumnWidth",OG%,40,0,0)
 
' installer les libellés dans la ligne 0
s$ = "Numéro"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,0,0,0)
s$ = "Nom"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,1,0,1)
s$ = "Prénom"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,2,0,2)
s$ = "Action"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,3,0,3)
s$ = "Appeler"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),1,3,29,3)
' protéger la ligne 0 en écriture
res% = dll_call6("SetObjectGridActivateCell",OG%,0,0,0,0,3)

' installer des libellés dans la colonne 0
for r%=1 to 29
  s$ = str$(r%)
  res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),r%,0,r%,0)
next r%
' protéger la colonne 0 en écriture
' les cellules des colonnes 1 (Nom) et 2 (Prénom) peuvent être saisies
res% = dll_call6("SetObjectGridActivateCell",OG%,0,1,0,29,0)
  
' autoriser globalement les USER_EVENT
res% = dll_call2("ActivateObjectGridUserEvent",OG%,1)

' affichier la structure du tableau (cellules en minuscules sont protégées)
res% = dll_call2("GetObjectGridLayout",OG%,handle(2))

return


technique:
caption 0,"ObjectGrid avec toutes les possibilités"
' supprimer un ObjectGrid éventuellement préexistant
OG% = dll_call1("DeleteObjectGrid",OG%)  

OG% = dll_call5("CreateObjectGrid",handle(0),4,4,400,300)
M1% = 0 - 1
res% = dll_call5("LocateObjectGrid",OG%,10,50,M1%,M1%)

res% = dll_call6("CreateObjectGridCell",OG%,0,0,0,0,1)
res% = dll_call6("CreateObjectGridCell",OG%,0,1,2,1,2)
res% = dll_call6("CreateObjectGridCell",OG%,0,2,1,2,1)

res% = dll_call6("CreateObjectGridCell",OG%,1,1,1,1,1)
res% = dll_call6("CreateObjectGridCell",OG%,1,2,0,2,0)
res% = dll_call6("CreateObjectGridCell",OG%,1,3,0,3,0)
  
res% = dll_call6("CreateObjectGridCell",OG%,2,0,2,0,2)
res% = dll_call6("CreateObjectGridCell",OG%,2,1,0,1,0)
  
res% = dll_call6("CreateObjectGridCell",OG%,3,0,3,0,3)
res% = dll_call6("CreateObjectGridCell",OG%,3,3,1,3,1)

res% = dll_call4("SetObjectGridColumnWidth",OG%,50,1,1)

res% = dll_call4("SetObjectGridRowHeight",OG%,100,1,1)
res% = dll_call4("SetObjectGridRowHeight",OG%,300,2,2)

s$ = "E1"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,0,0,0)
  clr% = 255
  res% = dll_call6("SetObjectGridCellFontColor",OG%,clr%,0,0,0,0)
  res% = dll_call6("SetObjectGridActivateCell",OG%,0,0,0,0,0)

s$ = "E2"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,1,0,1)
  s$ = "BI"
  res% = dll_call6("SetObjectGridCellFontStyle",OG%,adr(s$),0,1,0,1)

s$ = "E3"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),1,2,1,2)
s$ = "E4"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),2,1,2,1)
s$ = "M1"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),1,1,1,1)
s$ = "M2"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),2,0,2,0)
  clr% = 255*256*256
  res% = dll_call6("SetObjectGridCellFontColor",OG%,clr%,2,0,2,0)
  s$ = "BI"
  res% = dll_call6("SetObjectGridCellFontStyle",OG%,adr(s$),2,0,2,0)
  s$ = "BI"
  res% = dll_call6("SetObjectGridCellFontSize",OG%,16,2,0,2,0)
  res% = dll_call6("SetObjectGridActivateCell",OG%,0,2,0,2,0)


s$ = "M3"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),3,0,3,0)
s$ = "B1"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,2,0,2)
s$ = "B2"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),1,0,1,0)
  s$ = "BI"
  res% = dll_call6("SetObjectGridCellFontStyle",OG%,adr(s$),1,0,1,0)
s$ = "CHK1"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),0,3,0,3)
  res% = dll_call6("SetObjectGridActivateCell",OG%,0,0,3,0,3)
s$ = "CHK2"
res% = dll_call6("SetObjectGridCellText",OG%,adr(s$),3,1,3,1)

res% = dll_call2("ActivateObjectGridUserEvent",OG%,1)

res% = dll_call2("GetObjectGridLayout",OG%,handle(2))

return




user_event:
  wp% = user_event_wparam
  lp% = user_event_lparam
  r% = bin_and(lp%,hex("FFFF0000"))/65536
  c% = bin_and(lp%,hex("0000FFFF"))
  res% = bin_and(wp%,hex("00FF0000"))/65536
  select res%
    case 0: s$ = "EDIT"
    case 1: s$ = "MEMO"
    case 2: s$ = "BUTTON"
    case 3: s$ = "CHECK"
  end_select
  s1$ = string$(255," ")
  res% = dll_call4("GetObjectGridCellContent",OG%,adr(s1$),r%,c%)
  caption 1,"Clic dans cellule ("+str$(r%)+","+str$(c%)+")  "+s$+" = ["+trim$(s1$)+"]"
  return

Voici une première capture:
KGF_dll - nouvelles versions - Page 10 Aa1119

Et une autre:
KGF_dll - nouvelles versions - Page 10 Aa228


Dernière édition par Klaus le Ven 2 Déc 2022 - 11:05, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyJeu 1 Déc 2022 - 21:48

Bonjour et MERCI Klaus !

Sujet :  Nouvel objet: ObjectGrid

J'ai besoin de ton aide : je suis en panne...

J'ai cliqué sur le bouton "Liste de contacts".

Copie d'écran:

Copie d'écran:


Et pour le bouton "Démo technique" :

Copie d'écran:


Edit : fichiers KGF.DLL et KGF.chm téléchargés ce jour à 21h30.

Copie d'écran:
Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyJeu 1 Déc 2022 - 23:46

J'ai redépose KGF.zip sur mon site. Il y a sûrement eu une confusion lors du upload du fichier. Là, c'est la bonne version. Désolé pour l'anomalie.

EDIT

Tu avais sûrement remarqué la ligne 6 avec le DIR_CHANGE ?

EDIT 2/12/2022 à 2:47:
La page avec le programme de démo a été corrigé. Tout est à jour sur le site.


Dernière édition par Klaus le Ven 2 Déc 2022 - 2:48, édité 1 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyVen 2 Déc 2022 - 0:08

Merci Klaus !

Le nouvel ObjectGRID est opérationnel !

Merci pour ce bel outil !

Quant à la ligne 6, oui, je l'avais modifiée.
Revenir en haut Aller en bas
Marc

Marc


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyVen 2 Déc 2022 - 0:25

Désolé Klaus, encore une petite chose.

Dans la doc KGF.chm, pour le programme de démo de l'objectGrid, il y a une référence à SQLite3 qu'il faudrait supprimer.

Copie d'écran:

Revenir en haut Aller en bas
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyVen 2 Déc 2022 - 1:14

Oups... je vais corriger de suite.
Le lance la génération des deux versions d'aide cette nuit et je pourrai mettre à jour demain - il faut 2 heures de génération...

EDIT 2/12/2022 à 2:47:
La page avec le programme de démo est corrigée.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

KGF_dll - nouvelles versions - Page 10 Empty
MessageSujet: Re: KGF_dll - nouvelles versions   KGF_dll - nouvelles versions - Page 10 EmptyDim 5 Nov 2023 - 11:14

KGF.dll V9.85 du 05/11/2023

Nouveautés:
- DTP: code f%=8: le paramètre p5% (jusqu'alors inutilisé) impose la nouvelle largeur du DTP

Modules modifiés:
KGF.dll

La doc suivra.

La nouvelle largeur sera imposée si p5% est plus grand que zéro.
Sinon, ce paramètre est ignoré.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
KGF_dll - nouvelles versions
Revenir en haut 
Page 10 sur 14Aller à la page : Précédent  1 ... 6 ... 9, 10, 11, 12, 13, 14  Suivant
 Sujets similaires
-
» KGF_dll - nouvelles versions
» Nouvelles versions
» KGF_dll - nouvelles versions
» KGF_dll - nouvelles versions
» Synedit_Editor - 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: