Vieux Forum

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 09 février 2006

Rebol pour E/S industrielles sur Modbus/TCP

Rebol pour E/S industrielles sur Modbus/TCP

Liste des forums > Forum Core

abourgeo | 17:35 09/02/2006
Bonjour à tous ;-)
Je souhaiterai utiliser Rebol pour gérer (Lecture/Ecriture) des Entrées/Sorties industrielles sur réseau Modbus/TCP (port 502).
N'étant pas un spécialiste des réseaux, je me suis contenté de reprendre des exemples du bouquin d'Olivier Auverlot, jusqu'à ....... buter sur un Pb :-(
Au début, tout va bien. Le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  OUVERTURE PORTS 502 MODULE TCP/MODBUS + LOCAL  ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
if not error? try [p_trame: open/write tcp://192.168.00.17:502] [print "le port 502 vient d'etre ouvert en écriture sur IP  distante (17)"]
if not error? try [p_reponse: open/read tcp://:502] [print "le port 502 vient d'etre ouvert en lecture sur IP locale (13)"]
print ""

me permet d'ouvrir le port 502 distant des E/S indus en écriture et le port 502 local de ma machine en lecture, avec dans la console :
le port 502 vient d'etre ouvert en écriture sur IP distante (17)
le port 502 vient d'etre ouvert en lecture sur IP locale (13)

Ensuite, c'est toujours OK à priori. Le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;	ECRITURE SORTIES VERS MODULE TCP/MODBUS     ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mot_ecriture_sortie: copy [ 5 0 0 255 0 ]
foreach valeur mot_ecriture_sortie [
	envoi: join (pick (to-hex valeur) 7) (pick (to-hex valeur) 8)
	insert p_trame envoi
	prin envoi		]
print ""

permet d'envoyer la reqête en Hexa vers les E/S indus, avec dans la console :
050000FF00
Pour la réponse, cela se gâte puisque :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;	ATTENTE DE REPONSE DU MODULE TCP/MODBUS     ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reponse: copy ""
read-io p_reponse reponse 255
wait p_reponse
reponse: copy p_reponse
print reponse

produit le message d'erreur suivant sur l'instruction "read-io" :
** Script Error: Cannot use read on this type port
** Near: read-io p_reponse reponse 255

Merci de me donner vos avis et conseils ;-)
DideC | 18:45 09/02/2006
Le port que tu ouvre avec open/read est un port "serveur". C'est à dire qu'il ne sert pas à recevoir des données, mais seulement à accepter des connexions clients. Lors d'une de ces connexion, un sous-port est créé pour permettre l'échange de données. C'est ce sous-port qu'il faut récupérer et sur lequel tu pourra lire les données.
Mais je ne me suis jamais collé pratiquement aux ports Rebol pour te donner un exemple de code qui marche.
D'autres vont s'en charger, j'en suis sûre.
DideC
Philippe | 21:46 09/02/2006
Salut,
Ne faut-il pas que ton serveur soit dans une boucle d'écoute ?
Et ce n'est pas p_reponse mais "first p_reponse" .
Essaye cela ?
[code=rebol]
forever [
print "attente connexion"
wait p_reponse
print "connexion OK"
connexion: first p_reponse
reponse: copy ""
read-io connexion reponse 255
print reponse
close connexion
]
[/code]
===Philippe
Philippe | 21:51 09/02/2006
PS: Tu peux tester ton serveur p_response avec un "telnet localhost 500", par exemple.
===Philippe
Philippe | 21:52 09/02/2006
Philippe a dit :
PS: Tu peux tester ton serveur p_response avec un "telnet localhost 500", par exemple.
500 502 dans ton cas.
===Philippe

abourgeo | 00:33 12/02/2006
Merci de vos réponses ;-)
Je teste tout cela Lundi de retour ...... à mon boulot !
Encore merci ;-)
abourgeo | 17:38 14/02/2006
bon, pas eu le temps Lundi pour les tests :-( Ce fut donc pour aujourd'hui ;-)
j'ai fait un "mixe" de vos propositions jusqu'à ne plus obtenir d'erreurs, ce qui donne pour le code :
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;	ATTENTE DE REPONSE DU MODULE TCP/MODBUS     ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
print "attente connexion"
wait p_reponse
print "connexion OK"
connexion: first p_reponse
reponse: copy ""
read-io connexion reponse 255
print join "longueur reponse : " length? reponse
prin "reponse : " 
print reponse
if not error? try [close p_trame] [print "le port 502 est fermé sur IP distante 17"]
if not error? try [close p_reponse] [print "le port 502 est fermé sur IP locale 13"]
print ""

qui affiche dans la console :
trame (12 bytes) : 00000000000600050000FF00
attente connexion
connexion OK
longueur reponse : 0
reponse :
le port 502 est fermé sur IP distante 17
le port 502 est fermé sur IP locale 13

Comme vous le voyez, plus d'erreurs mais toujours pas la moindre réponse du serveur TCP/modbus distant à destination de ma machine. Je suis certain du format de la trame de 12 bytes envoyée en requête (2 documents concordant en ma possession). De plus comme le serveur TCP/modbus posséde un mini-serveur Web me donnant quelques infos, il semble que le nombre de paquets émis et reçus augmentent à chacun de mes tests !
Mais alors, pourquoi toujours un réponse "nulle" avec le script ???
Merci de vos idées ......

mardi 07 février 2006

REBOL au sein de la Dèfense Belge

REBOL au sein de la Défense Belge



reboltof | 17:57 07/02/2006
Le Défense Belge a mis en production sa seconde version de "Système de Testing Psychotechnique assisté par ordinateur", HERMES.
Ce système est, contrairement à son prédécesseur, entièrement basé sur REBOL/View et le stockage des données s'effectue en XML.
En production depuis le 09 janvier 2006, le système a déjà permis l'évaluation et la sélection des candidats militaires grâce à l'exécution de plus de 2000 sessions de tests.
Dois-je préciser que le noyau du système est un petit script REBOL encapsulé de quelques 700 KB ... REBOL RULES !
N'hésitez pas à me contacter ici ou en privé si vous souhaitez plus d'informations sur le projet.
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net
PL | 13:53 08/02/2006
Pourquoi un stockage en XML ?
- Pour utiliser les données à partir d'autres applications ?
- Parce que RebDB n' a pas donné satisfaction ?
. . .
PL
reboltof | 14:44 08/02/2006
XML ... parce que ce projet cadre dans un contexte international, où il nous est nécessaire de pouvoir échanger nos données avec d'autres pays, notamment l'Autriche et l'Angleterre.
Pour ceux qui sont intéressés par les dialectes XML employés:
PsyML : http://www.idun.be/PsyML/Default.aspx
TREXL : http://www.trexl.org/
--xtof
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net
coccinelle | 15:18 08/02/2006
P'tite question,
La doc. de PsyML n'a-t-elle pas été générée par un script REBOL. Cà me fait furieusement penser à la doc générée avec RAPID.
Marco.
Fugit tempus irreparabile (Virgile)
reboltof | 16:08 08/02/2006
coccinelle a dit :
La doc. de PsyML n'a-t-elle pas été générée par un script REBOL. Cà me fait furieusement penser à la doc générée avec RAPID.

:-)
Tu utilises RAPID ? J'ignorai que quelqu'un le connaissait en dehors de Karim et de moi-même...
Non, la doc a été (en partie) générée par SpyXML.
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net
coccinelle | 20:55 08/02/2006
Christophe,
Non, je n'utilise pas RAPID, mais ce n'est pas une raison de ne pas le connaitre. Je l'avais essayé autour du 27 septembre 2004 pour sql-protocol mais j'avais abandonné car je n'en avait pas vraiment besoin pour ce script.
C'est un bon outil, cela ne fait aucun.
Marco.
Fugit tempus irreparabile (Virgile)

Rèsultats du concours de RT

Résultats du concours de RT



jipé | 13:53 07/02/2006
>reboltof:
Les résultats sont publiés et les scripts téléchargeables ! http://www.rebol.net/demos/download.html
---xtof
Jipé
dubman | 14:41 07/02/2006
>Jipé:
Bon... Chez moi plus de la moitié des scripts plantent, notamment pitch-green qui n'arrive pas à télécharger ses données...
Difficile de se faire une idée :(
>dubman:
salut !
Jipé > Pas de problème avec la version REBOL/View 1.3.1.3.1 17-Jun-2005 Core 2.6.0
sous windows2000 + 512 mo de ram , le chargement est un peu long mais ça marche.
trés sympa Cross-Platform Rebol Code Editor ( cpcode ) de François , simple , efficace , bon boulot !
a+
Christophe
johnatemps | 17:16 07/02/2006
J'ai aussi vu des choses qui ne fonctionnaient pas...
Ce qui m'a permis de télécharger view 1.3.2 de décembre.
Il est bien indiqué qu'il vaut mieux utiliser cette version.
(grr, de nouveau ce bug, des commentaires qui passent en news)
---..--- JohnATemps ---..---
fabrice | 14:38 04/03/2006
Zut ! Depuis le Viewtop, quand je clique sur Contest j'ai cette erreur :
"Cannot open folder: http://www.rebol.net/demos/index.r"
--
Fabrice (^_^)

vendredi 03 février 2006

doc nouveaux styles VID

doc nouveaux styles VID

Liste des forums > Forum View

bab2607 | 17:22 03/02/2006
Est-ce que quelqu'un sait ou on peut avoir de la doc pour utiliser les nouveaux styles VID (view 1.3) comme btn, sensor, tog, check-mark ...
Merci
bab2607
bab2607 | 17:35 03/02/2006
J'ai trouvé ce lien qui peut aider
http://www.rebol.net/plugin/demos/new-demos/sources/style-browser.html
Philippe | 22:43 04/02/2006
Salut,
Juste une remarque : btn, tog ne sont pas de nouveaux styles. Ils existaient déjà !
===Philipe
DideC | 10:54 05/02/2006
Les plus intéressants, pour moi, sont radio-line et check-line !
DideC

Existe-il ne version de rebol pour SmartPhone ?

Existe-il ne version de rebol pour SmartPhone ?



Anonyme | 17:20 03/02/2006
Cette question me vient en voyant ce qui existe pour les Symbian. En effet
C++ ou Java ne sont pas trop abordables, et OPL n'est plus compatible pas exemple sur les 6680. Une bon plan pour RT, mais encore faut-il saisir l'occasion.
Merci
Wolf
reboltof | 17:21 05/02/2006
Non. il existe une version de /Core pour WinCE, mais son implémentation laisse à désirer...
J'ai posé récement à Carl la question de connaitre son planning d'implémentation pour le marché de PDA. Sa réponse a été : "soon...". Je pense qu'il a pour le moment d'autres priorités.
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net
Anonyme | 18:15 05/02/2006
merci Christophe pour cette précision.
Si "soon" c'est le m^me delai qu'il a fallu à view 1.3 pour sortir alors autant se mettre à Java J2ME ;-)
A+
Wolf

Tooltips amèliorès

Tooltips améliorés

Liste des forums > Forum View

Anonyme | 14:47 03/02/2006
Pour le projet Synapse Chat de Graham Chiu j'ai été amené à opérer quelques modification sur le code des tooltips afin de corriger certains bugs.
pour plus de détail http://rebol.dev.fr/view.php?sid=170
-- Shadwolf

vendredi 27 janvier 2006

Nouvelle gestion des fenêtres modales

Nouvelle gestion des fenêtres modales

Liste des forums > Forum View

reboltof | 09:11 27/01/2006
Dans le document énumèrant les changements apportés dans /View 1.3, Carl annonce une nouvelle gestion des fenêtres modales ( http://www.rebol.com/docs/view1300.html#section-2.5).
Qui peut m'expliquer les détails de ce changement ?
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net
DideC | 09:31 27/01/2006
Il s'agit de modification du code de gestion des fenêtres modales type 'show-popup et 'inform.
Tu sais qu'il y avait des bugs car certains styles des fenêtres normalement bloquées réagissaient quand même.
Un coup d'Anamonitor avec View1.3.2 et View1.2.8 (par exemple) pour examiner system/view et tu verra de suite les changements. Maintenant pour comprendre exactement comment ça marchait et comment ça marche, il faut y consacrer un peu de temps.
DideC
reboltof | 10:58 27/01/2006
merci DideC
Christophe Coussement
A la recherche de doc sur REBOL ? Visitez The REBOL Documentation Project sur http://rebdocproj.net

jeudi 26 janvier 2006

Magic! et View

Magic! et View

Liste des forums > Forum View

Philippe | 09:06 26/01/2006
Salut,
J'avais lu dans le forum qu'il était possible de gérer des images dynamiques avec Magic et View.
Le principe est grosso modo d'affecter un handler pour Apache pointant sur View en CGI, et de traiter les fichiers relatifs à ce handler par View, les autres en rhtml l'étant par Core.
Est-ce que quelqu'un a fait des essais avec la dernière version de View 1.3, sous XP ? Le traitement des images dynamiques impose, après la création de l'image, son enregistrement, d'où une définition de la sécurité un peu différente de celle pour Core.
===Philippe
coccinelle | 15:47 26/01/2006
Philippe, pourquoi dois-tu enregistrer l'image. Ne peux-tu pas la renvoyer dans la réponse.
Si c'est un problème de save, n'oublie pas que save peut sauver en mémoire.
Par exemple :
save/png y: make binary! 4098 to-image layout [button "coucou"]
te crée en mémoire l'équivalent du .png que tu aurais sauvé dans un fichier et qui peut être renvoyé sans autre dans la réponse.
Marco.
Fugit tempus irreparabile (Virgile)
Anonyme | 18:17 26/01/2006
Marco,
Le fichier appelé contient :
Image de test View pour Magic!
Voici le contenu du fichier image.vhtml, interprété en CGI par View :

header "Content-type: image/png"
save/png bin: make binary! 4098 to-image layout [
btn 120x30 255.255.255 "EASY REBOL"
]
]
;write-io system/ports/output bin length? bin

et voici un exemple dans le log access apache :
127.0.0.1 - - [26/Jan/2006:17:54:54 +0100] "GET /image.vhtml HTTP/1.1" 500 608
Donc une Internal Error Server.
et dans le log error
([Thu Jan 26 17:59:54 2006] [error] [client 127.0.0.1] Premature end of script headers: magic350.rcgi)
si je teste en Telnet direct : il n'y a quelque chose qui est renvoyé, mais invisible à l'écran et le serveur reste en boucle jusqu'à plus soif.
j'ai du rater quelque chose. Je continuerais demain.
===Philippe
johnatemps | 23:42 26/01/2006
c'est du rebol, ou du html ?
J'ai peur que lecode n'ai pas de sens.
Mais peut-être qu'avec le nouvelle version, c'est la mode... j'ai pas testé l'histoire de l'inclusion d'un script dans une page.
---..--- JohnATemps ---..---
coccinelle | 07:07 27/01/2006
Hello Philippe,
Je n'ai pas testé, mais il me semble qu'il manque un print du png sauvé en mémoire. Quelque chose comme ça:

header "Content-type: image/png"
save/png bin: make binary! 4098 to-image layout [
btn 120x30 255.255.255 "EASY REBOL"
]
print bin

D'un autre càté je remarque qu'il y a un ] de trop dans ton code, juste avant le ;write-io ... Il me semblait que Magic devait réagir correctement à ce genre d'erreur, mais peut-être que pas.
De toute façon, le print est nécessaire.
Marco.
Fugit tempus irreparabile (Virgile)
DideC | 09:15 27/01/2006
Johnatemps: c'est du Magic! , donc du Rebol dans du HTML ;-)
DideC
Philippe | 09:45 27/01/2006
Salut,
Johnatemps, c'est du Magic!
En CGI pur, le comportement est (bien sûr) identique.
Marco, avec Magic!, le print est modifié. Mis à part cela (et le crochet en trop), cela ne marche toujours pas. J'ai essayé plusieurs combinaisons, le serveur Web reste en boucle. (
Je jette l'éponge, il y a surement un truc bateau que j'ai raté, mais je suis trop dans le guidon. Je vais laisser reposer le truc.
===Philippe
coccinelle | 12:49 27/01/2006
Philippe,
Avec Magic, c'est le print modifié qui renvoie les données au browser, donc c'est bien ça qu'il faut utiliser. Mais comme tu dis, il y a surement un truc bateau qui cloche. Je vais essayer ça un de ces quatres sur mon PC. J'utilise ZMWS mais ça ne devrait pas poser de problème pour reproduire l'erreur.
Marco.
Fugit tempus irreparabile (Virgile)
johnatemps | 14:47 27/01/2006
(Oui, j'ai oublié le titre du thread, dans les posts il n'était question que de cgi. Je demandais cela à cause de l'erreur qui cherchait un header).
---..--- JohnATemps ---..---
coccinelle | 10:23 28/01/2006
Philippe,
Avec ZMWS, j'y suis arrivé en utilisant le code que je t'ai donné ci-dessus et en faisant quelques modifs dans magic350.cgi. Le problème vient de magic qui utilise la fonction print pour sortir la réponse et que cette fonction fait des substitions sur les caractères contràle. L'usage de la fonction write-io est impérative sinon on est mal.
Le changement est assez simple simple. J'ai modifié la fonction m-send-page ainsi :
m-send-page: func [ /local document ] [
document: join m-header/http-options [ m-header/mime-type "^M^/^M^/" ]
either m-debug = false [
document: join document m-html-page
] [
document: join document [
{
<div id="magicdebug" style="position:absolute;left:0;top:0;width:25%;height:100%;font-size:10px;background:#ffffff;color:blue;overflow:auto;">
} m-debug-buffer "<br />Execution time:" (now/time/precise - m-t1) {</div><div id="magicpage" style="position:absolute;left:25%;top:0;width:100%;height:auto;overflow:auto;">}
m-html-page {</div>}
]
]
;	m-print-page document
set-modes system/ports/output [binary: true]
write-io system/ports/output document length? document
if m-clean [ m-clean-sessions ]
m-quit
]
et j'ai fait un replace de toutes les "^/" par "^M^/" de manière à avoir des terminaison de ligne corrects.
Il y a surement des effets de bord (bug) que je n'ai pas étudié, mais c'est dans ce sens qui faut aller.
Marco.
Fugit tempus irreparabile (Virgile)
Philippe | 21:33 28/01/2006
Marco,
OK, je vais essayer cà. Le week-end est assez chargé, je te tiendrais au courant.
En fait, je pense que si on emploie View avec une version de Magic! modifiée, celle-ci n'aurait besoin que d'être réduite au strict minimum, puisque le code est supporté par rebol, et qu'on a n'a pas besoin des librairies. Il y aurait donc la version actuelle de Magic! avec Core, et une version super courte ou du CGI direct pour les images.
A suivre.
===Philippe

mercredi 25 janvier 2006

Variable locale et globale

Variable locale et globale

Liste des forums > Forum View

Anonyme | 20:47 25/01/2006
Bonsoir à tout le monde
J'aimerai savoir si il existe un moyen de creer des variables à l'intérieur d'une fonction et que celles-ci (les variables) puissent etre toujours utilisés àpres l'execution de la fonction
Ex:
FonctionTest: func [] [
test: "coucou"
print test ; aucun souci la variable test est connu
]
print test ; erreur car la variable n'est plus connu.
Peut faire que justement cette variable perdure apres la fin de l'éxécution ?
Zoif
fvzv | 20:53 25/01/2006
Salut,
As-tu seulement testé ton code?
Attention, il faut exécuter la function avant de faire
print test

François
coccinelle | 21:37 25/01/2006
Zoif,
Lorsque tu programmes en REBOL toutes les variables sont globales sauf si tu le précise dans la définition d'une fonction ou d'un objet.
Dans ton cas, comme tu n'as pas précisé que test est locale, elle est globale. Mais comme François te l'indique, il faut que le code de ta fonction soit exécuté sinon le mot test est inconnu.
Marco.
Fugit tempus irreparabile (Virgile)
Philippe | 10:46 26/01/2006
Zoif,
Voir sur le site du Rebol Documentation Project (RDP) http://rebdocproj.net/
la doc sur Rebol et en particulier celle sur les fonctions (rubrique Manuels, je crois). La portée locale et globale y est expliquée.
===Philippe

samedi 21 janvier 2006

RealBasic QuickStart appliquè à Rebol.

RealBasic QuickStart appliqué à Rebol.

Liste des forums > Forum View

fvzv | 13:35 21/01/2006
Bonjour,
J'ai découvert le language RealBasic hier. J'étais très enthousiaste en lisant le site, mais il est vite tombé face à la lourdeur de l'IDE: sur mon PC, doté de 1GB de RAM, l'IDE rame de manière allucinante... Au bout de 2 heures, j'ai abandonné l'idée de développer avec cette outil.
Ce qui m'avait séduit, c'était l'outils de conception d'interface graphique et l'aspect multi-platforme "natif". Malheureusement, ce-dernier point n'est pas très convainquant, particulièrement sous Linux...
Donc, retour sous Rebol.
Mais il faut reconnaître que les manuels de RealBasic sont excellents. J'ai donc repris le manuel QuickStart, mais en l'appliquant à Rebol. L'exemple du manuel se construit très simplement sous rebol, sauf pour le dernier point:

The TextChange event runs whenever the text in the EditField has changed. We
want to take action based on the EditField's state just after the text has changed. If
the EditField is now blank, we will disable these two buttons so the user can't use
them. And, if there is text in the EditField, we will enable the buttons and make the
Connect button the default button. The default button has an outline around it on
Windows, Linux, and Mac OS 'classic' and it 'throbs' on Mac OS X.

fvzv | 20:29 22/01/2006
Voici le code complet...
disabled?: func [face][flag-face? face 'disabled]
enabled?:  func [face][not disabled? face]
disable-face: func [
	"Disable a face. Change the appearence and the behaviour of the face."
	face "The face to disable"
	/no-show "Do not show change yet"
	/local access
][
	if all [
		access: get in face 'access
		in access 'disable-face*
	] [
		access/disable-face* face
	]
	if not no-show [show face]
	face
]
enable-face: func [
	"Enable a face. Change the appearence and the behaviour of the face."
	face "The face to enable"
	/no-show "Do not show change yet"
	/local access
][
	if all [
		access: get in face 'access
		in access 'enable-face*
	] [
		access/enable-face* face
	]
	if not no-show [show face]
	face
]
view/new/title layout [
	style button BUTTON with [
		access: make svv/vid-styles/button/access [
			disable-face*: func [face] [
				if disabled? face [exit]
				face/effect: [ grid 2x2 1x1]
				face/feel: none
				flag-face face 'disabled
			]
			enable-face*: func [face] [
				if enabled? face [exit]
				face/feel: system/view/vid/vid-feel/button
				deflag-face face 'disabled
			]
		]
	]
	vid_list-url: text-list 300x200 "
http://www.rebol.com" "
http://www.rebol.net" "
http://www.rebol.org" [
		vid_selected-url/text: copy first face/picked 	; 'copy is required to avoid sharing the same instance of
														; the series (string). Without 'copy, any update of the 
														; text field would impact the list!
		show vid_selected-url
		enable-face vid_add-url
		enable-face vid_connect-url
	]
	indent 200 vid_delete-url: button "Delete" [
		if empty? vid_list-url/picked [alert "Please select an item in the list." exit]
		foreach item vid_list-url/picked [
			remove find vid_list-url/data item
		]
		vid_list-url/picked: copy []
		show vid_list-url
	]
	indent -200	vid_selected-url: field 300 feel [
		engage: func [face act event] [
			; Put here the code to execute before calling the original 'engage
			; ...
			; Now, we call the original 'engage function
			ctx-text/edit/engage face act event
			; Put here the code to execute after calling the original 'engage
			if equal? event/type 'key  [
				either empty? trim copy face/text [
					disable-face vid_add-url
					disable-face vid_connect-url
				] [
					enable-face vid_add-url
					enable-face vid_connect-url
				]
			]
		]
	]
	across
	vid_add-url: button "Add" [
		; no empty line and no duplicate in the list
		if any [empty? trim vid_selected-url/text 
				found? find vid_list-url/data vid_selected-url/text
		] [alert "Please enter a different URL or email address." exit]
		append vid_list-url/data copy vid_selected-url/text
		vid_list-url/picked: reduce [vid_selected-url/text]
		show vid_selected-url
		show vid_list-url
	]
	indent 92 
	vid_connect-url: button "Connect" #"^r"[
		either empty? trim vid_selected-url/text 
			[alert "Please enter a URL or email address."]
			[browse vid_selected-url/text]
	]
	
	return
	indent 200 button "Quit" orange [quit]
] "Main"
; The text field vid_selected-url is empty.
disable-face vid_add-url
disable-face vid_connect-url 
do-events

- page 2 de 220 -