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.
Objet EDIT avec saisie filtrée Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
Objet EDIT avec saisie filtrée Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Objet EDIT avec saisie filtrée Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Objet EDIT avec saisie filtrée Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Objet EDIT avec saisie filtrée Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Objet EDIT avec saisie filtrée Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Objet EDIT avec saisie filtrée Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Objet EDIT avec saisie filtrée Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Objet EDIT avec saisie filtrée Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Objet EDIT avec saisie filtrée Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Objet EDIT avec saisie filtrée Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Objet EDIT avec saisie filtrée Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Objet EDIT avec saisie filtrée Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Objet EDIT avec saisie filtrée Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Objet EDIT avec saisie filtrée 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

 

 Objet EDIT avec saisie filtrée

Aller en bas 
2 participants
AuteurMessage
Klaus

Klaus


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

Objet EDIT avec saisie filtrée Empty
MessageSujet: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 12:31

J'aimerais pouvoir imposer à un objet EDIT de n'accepter que des caractères spécifiés dans une chaîne de caractères, imposant ainsi un filtrage sur la saisie.

Cela pourrait être fait par une commande du type:
EDIT_FILTER N,F$
n$ = numéro de l'objet EDIT
F$ = chaîne de caractères contenant les caractères autorisés

Exemple:
EDIT 13
EDIT_FILTER 13,"0123456789"

ne permettrait de saisir que des valeurs numériques entières.

On aurait également une fonction retournant le filtre actif sur un EDIT:
filtre$ = EDIT_FILTER(N)

En Delphi, ceci peut être fait par l'évènement OnKeyPress:
Code:
rocedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  // supposons que filtre est une variable string visible à cet endroit, et contenant le filtre
  if pos(Key,filtre)=0 then Key := chr(0);
end;
EDIT

On pourrait aussi autoriser l'application de la commande FILTER existante à l'objet EDIT, étant donné que la syntaxe est la même que celle de la commande proposée EDIT_FILTER. Dans ce cas, on pourrait faire la fonction FILTER(N) qui retournerait le filtre en vigueur pour l'objet N, que ce soit un OPEN_DIALOG, un SAVE_DIALOG ou un EDIT.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




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

Objet EDIT avec saisie filtrée Empty
MessageSujet: re   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 14:30

@ Klaus,

Cela doit être possible de faire une sub qui ,déclenchée par un "on_change N,...", vérifie la dernière entrée.
Pour un filtre sur des entiers par exemple on fera exclusion du caractere "," voir "." pour certains.
Code:

derniere_entree$=right$(text$(N),1)
if numeric(derniere_entree$)=1
 exit_sub
else
 if  dernier_entree$="," or derniere_entree$="."
    derniere_entree$=left$(derniere_entree$,len(derniere_entree$)-1)
    text N,derniere_entree$
    if message_warning_ok("Caractère Interdit !")<2
        exit_sub
    end_if
 end_if
end_if
un truc dans ce genre...Laughing
Revenir en haut Aller en bas
Klaus

Klaus


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

Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 14:36

Certes, YGeronimi. C'est comme ça que je fais actuellement.

Mais c'est très lourd à mettre en place. Il faut mettre une routine ON_CHANGE pour chaque champ, ou alors une seule, mais avec un test sur la variable ON_CHANGE. On pe peut pas placer un traitement général de numéricité dans un fichier INCLUDE de procédures partageables, car on ne peut pas paramétrer, ni les labels, ni les noms de variables nécessaires.

Ceci est donc la raison de ma suggestion.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




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

Objet EDIT avec saisie filtrée Empty
MessageSujet: re   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 14:44

Effectivement...
Revenir en haut Aller en bas
Invité
Invité




Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 15:45

Il y a une solution, mais je ne peux pas finir, et je m e dépêche:
Code:
label teste
edit 1 :on_key_up 1,teste

end
teste:
  teste(key_up_code):return
sub teste(key%)
    dim_local a$,i%
    a$ = text$(1)
    i% = caret_position(1)
    if key% > 57
        if key% < 96 or key% > 105
            a$ = left$(a$,i%-1) + mid$(a$,i%+1,len(a$)):text 1,a$ :caret_position 1,i%
        end_if
    else
        if key% < 48 then a$ = left$(a$,i%-1) + mid$(a$,i%+1,len(a$)):text 1,a$ :caret_position 1,i%
    end_if
end_sub
A vous de mettre les testes lorsque les paramètres ne sont pas bon.
@+ je pars
Revenir en haut Aller en bas
Klaus

Klaus


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

Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 16:14

Idée à priorité prometteuse, mais elle ne résoud pas tout. L'évènement on_key_up est déclenché quelque soit la touche, même shift etc. Donc, même après avoir réussi à saisir des chiffres, la simple frappe répétée de shift vide la zone !

Il faudrait utiliser scan_code pour exclure encore certaines touches du traitement. Une vraie usine à gaz !

J'avais essayé d'adapter ton astuce à 2 champs simultanément, et ça donne ça:
Code:
label teste
edit 1 : top 1,10 : on_key_up 1,teste
edit 2 : top 2,40 : on_key_up 2,teste

end
teste:
  teste(key_up_code):return
sub teste(key%)
    dim_local a$,i%
    display
    a$ = text$(number_key_up)
    i% = caret_position(number_key_up)
    if key% > 57
        if key% < 96 or key% > 105
            a$ = left$(a$,i%-1) + mid$(a$,i%+1,len(a$)):text number_key_up,a$ :caret_position number_key_up,i%
        end_if
    else
        if key% < 48 then a$ = left$(a$,i%-1) + mid$(a$,i%+1,len(a$)):text number_key_up,a$ :caret_position number_key_up,i%
    end_if
end_sub
Mais le problème est le même.

Pour le moment, je m'en sorts avec une routine ON_CHANGE qui compare le contenu du EDIT déclenchant l'évènement avec une variable de sauvegarde de l'objet concerné. Si ne nouveau contenu ne correspond pas à mon filtre, je remplace le contenu par la variable de sauvegarde, sinon je copie le contenu dans la variable de sauvegarde.

Ca marche très bien, et d'ailleurs SANS l'affichage temporaire du caractère rejeté. Mais il y a plusieurs points qui me paraissent très lourds:
1. pour chaque objet EDIT ainsi filtré, il faut une variable de sauvegarde spécifique (ou un tableau avec un élément pour chaque onjet EDIT)
2. il faut une routine évènement spécifique pour chaque EDIT filtré, ou une seule routine avec un test sur la variable NUMBER_CHANGE pour sélectionner le bon traitement. Et on ne peut pas faire un SELECT NUMBER_CLICK - CASE numero_de_ma_variable%, car CASE n'accepte que des constantes numériques.
Donc, impossible de paramétrer ces traitements, de les placer dans un module #INCLUDE etc.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Invité
Invité




Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 17:03

J'ai été très vite, je suis déjà rentré.

Je ne sais pas ce que tu veux faire exactement.  Ta demande est intéressante et j'espère qu'elle aboutira
Mais toi qui est fortiches en dll, Tu ne peux pas en faire une par exemple sur un edit hors champ, sur lequel tu mets le focus pour la saisie, et la dll traiter selon ta volonté?

Pour ma part, j'ai un vrai programme d'usine à gaz avec un edit. Dans mon cas il n'y a pas de filtre sur celui-ci (cette edit est hors champ, et on écrit sur un picture, sans s'apercevoir que c'est dans un edit), mais il y a un traitement avec un autre edit qui fait le nécessaire. Donc l'usine à gaz, je peux dire que je connais. Cela concerne le memo_color dont j'ai déjà parlé.

A propos pour le programme que j'ai mis en vitesse, il y a un filtre pour les touches du clavier en haut, et les touches de droite, c'est entre 96 et 105 sur mon clavier. Pourquoi les codes spéciaux tu ne les filtrs pas?
Revenir en haut Aller en bas
Klaus

Klaus


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

Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 17:25

Certes, Cosmos70. Je pourrais étendre les contrôles pour filtrer les autres touches. L'usine à gaz augmenterait, mais ce serait accessoire si la fonctionnalité éyait au rendez-vous.

Or, elle ne l'est pas, dès l'instant que je veux avoir, disons une dizaine ou une vingtaine de ces champs dans mon programme (ce qui sera le cas). Justement parce que je ne peux pas paramétrer les noms des variables ni ceux des labels. Donc, impossible de développer un module général à inclure dans mon source par un #INCLUDE.

Dans KGF.dll, j'ai donné accès à un objet Delphi particulier: l'objet MSKE qui utilise le MaskEdit de Delphi. Un objet fantastique qui sait faire ce que je veux, mais également beaucoup plus. Mais bien que mon implémentation de MSKE marche parfaitement, cela reste tout de même très lourd à mettre en oeuvre, et est destiné surtout à servir d'exemple. L'implémentation actuelle prévoit jusqu'à 10 de ces objets simultanément, ce qui est de toutes façons insuffisant.

Bien sûr,, si Jack ajoutait l'objet MaskEdit de Delphi (qui n'est d'ailleurs rien d'autre qu'un objet MaskedEdit de Windows), ce serait génial. Mais je pense que l'effort d'ajout d'un tel objet est plus important que celui requis pour faire EDIT_FILTER et EDIT_FILTER(), mais je peux me tromper. Seul Jack pourra avoir un avis qualifié à ce sujet.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Invité
Invité




Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 18:44

Je ne sais pas si vraiment mon intervention vaut quelque chose. Pour ma part j'ai utilisé scancode, et rien de ce qui est on_key_up, ou autre: zero événement. J'ai préféré faire une boucle while end_while, et tester scancode. Au résultat de celui-ci, tout est traité selon le cas.

Çà marche très bien, mais il y a un inconvénient: il faut désactiver par un filtre ou autre la lecture du clavier. Tant qu'on est dans le programme, c'est pas compliqué, mais si j'interviens dans un autre programme en ayant oublié de désactiver, je continu d'écrire dans mon edit, alors que je suis ailleurs. Tu vas certainement me dire qu'il y a une fonction dans ta dll, mais le but est de faire le programme sans intervention de celle-ci, car (même si une fois publié, cela restera aux oubliettes) il n'est pas facile, sinon impossible de savoir si une dll est active ou non, et cela peut-être autre chose que kgf. Un #include mis au départ de programme est sans connaissance de ce que l'on veut faire avec.
Revenir en haut Aller en bas
Klaus

Klaus


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

Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée EmptyMar 12 Nov 2013 - 23:23

Contrairement à ce que je pensais, j'ai réussi à produire une version 100 % Panoramic pour pouvoir gérer des objets EDIT filtrés, avec la possibilité de placer cette définition sous forme d'une SUB dans un fichier #INCLUDE, de façon à être totalement indépendant du programme lui-même. Ainsi, on peut l'utiliser dans n'importe quel programme.

Mais c'est lourd. Le coût en est:
- un label interne à la procédure
- gestion de OFF_CHANGE/ON_CHANGE à chaque caractère accepté
- création interne de 3 DLIST
- création de 6 variables globales

Voici le source, bien documenté:
Code:
dim no%

xedit(110,20,"abcde")
no% = no% + 1 : alpha no% : top no%,110 : left no%,150 : caption no%,"Lettres  (a,b,c,d,e)"
xedit(140,20,"12345")
no% = no% + 1 : alpha no% : top no%,140 : left no%,150 : caption no%,"Chiffres (1,2,3,4,5)"

end

' **************************
' le code suivant est à placer dans un fichier #INCLUDE
' **************************
sub xedit(t%,l%,f$)
  if f$<>""   : ' au premier appel, création de tout ce qu'il faut
    if variable("filter_list%")=0
      dim filter_list%(3),   filter_temp$, filter_n%
      dim filter_i%, filter_f$, filter_s$
      no% = no% + 1 : dlist no% : filter_list%(1) = no%  : ' liste des numéros d'objet
      no% = no% + 1 : dlist no% : filter_list%(2) = no%  : ' liste des filtres
      no% = no% + 1 : dlist no% : filter_list%(3) = no%  : ' liste des valeurs anciennes
    end_if
    if label("filter_change")=0 then label filter_change
  end_if      : ' ici, on a fini de créer tout ce qu'il faut
  no% = no% + 1 : edit no% : top no%,t% : left no%,l%  : ' créer l'objet Panoramic
  if f$<>""                             : ' si un filtre est demandé, alors
    on_change no%,filter_change         : ' on utilise l'évènement On_CHANGE
    item_add filter_list%(1),str$(no%)  : ' on ajoute le numéro d'objet dans une 1ère liste
    item_add filter_list%(2),f$         : ' on ajoute le filtre dans une 2ème liste
    item_add filter_list%(3),""         : ' on crée une ligne vide dans une 3ème liste
  end_if                                : ' fin du traitement du filtre
end_sub
filter_change:                          : ' évènement ON_CHANGE sur EDITs filtrés
  filter_temp$ = str$(number_change)    : ' prendre le numéro de l'objet
  for filter_n%=1 to count(filter_list%(1))           : ' chercher cet objet dans la liste '
    filter_s$ = item_read$(filter_list%(1),filter_n%)
    if filter_temp$=filter_s$ then exit_for           : ' est-ce que l'objet est trouvé ?
  next filter_n%                                      : ' fin de recherche
  filter_temp$ = trim$(text$(number_change))          : ' prendre le texte du EDIT
  if filter_temp$=""                                  : ' si le EDIT est vide:
    item_delete filter_list%(3),filter_n%             : ' alors vider la ligne de la 3ème liste
    item_insert filter_list%(3),""
    return                                            : ' on a fini
  end_if
  filter_s$ = item_read$(filter_list%(2),filter_n%)   : ' prendre le filtre
  for filter_i%=1 to len(filter_temp$)                : ' pour tous les caractères du EDIT:
    if instr(filter_s$,mid$(filter_temp$,filter_i%,1))=0    : ' est-ce que le car n'est pas dans le filtre ?
      filter_s$ = item_read$(filter_list%(3),filter_n%)     : ' alors reprendre l'état précédent
      off_change number_change                              : ' désactiver ON_CHANGE
      text number_change,item_read$(filter_list%(3),filter_n%)  : ' remplacer le contenu de l'EDIT
      on_change number_change,filter_change                 : ' réactiver le ON_CHANGE
      return                                                : ' et sortir
    end_if
  next filter_i%                                      : ' fin de la boucle sur le contenu de l'EDIT
  item_delete filter_list%(3),filter_n%               : ' ici, tous les caractères sont valides,
  item_insert filter_list%(3),filter_n%,filter_temp$  : ' donc on sauvegarde le contenu de l'EDIT
  return                                              : ' ouf !

Bon, c'est une version qui ne gère que TOP, LEFT et filtre pour un EDIT. Je vais inclure une version plus complète avec WIDTH, PARENT etc dans KGF_OBJ.bas.

Mais il est clair que c'est lourd, lent et pas élégant. Certes, ça fait exactement ce que je veux, et dans un premier temps, je vais donc m'en servir pour avancer dans ma programmation. Mais je pense que cela illustre l'utilité des commandes et fonctions que je suggère.

EDIT

J'ai appliqué ce principe à la partie existante du programme que je suie en train d'écrire, et ça marche merveilleusement. Il suffit, pour chaque champ, de passer la chaîne de caractères qui contient le filtre spécifique du champ, et c'est tout.

J'ai mis la version actualisée dans mon WebDav, dossier DLLs, sous-dossier KGF_SUB.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





Objet EDIT avec saisie filtrée Empty
MessageSujet: Re: Objet EDIT avec saisie filtrée   Objet EDIT avec saisie filtrée Empty

Revenir en haut Aller en bas
 
Objet EDIT avec saisie filtrée
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Comment terminer une saisie dans un objet par entrée
» Saisie en temps réel d'un EDIT
» comment contrôler la saisie d'un EDIT ?
» Saisie dans un objet GRID.
» problème avec edit ou bien avec combo?

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos souhaits d'amélioration de Panoramic-
Sauter vers: