{"id":3796,"date":"2019-11-25T20:41:57","date_gmt":"2019-11-25T20:41:57","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=3796"},"modified":"2019-11-25T20:41:57","modified_gmt":"2019-11-25T20:41:57","slug":"clb_messenger-la-nuova-interfaccia-di-messaggistica-fra-oggetti","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/framework\/clb_messenger-la-nuova-interfaccia-di-messaggistica-fra-oggetti\/admin\/2019\/11\/","title":{"rendered":"CLB_messenger :  la nuova interfaccia di messaggistica fra oggetti"},"content":{"rendered":"<p>In un articolo precedente abbiamo presentato la classe <a href=\"https:\/\/www.colorwave.it\/blog\/framework\/linterfaccia-operation_call\/admin\/2015\/05\/\">OPERATION_CALL <\/a>\u00a0, un&#8217;interfaccia utilizzata nel framework di Colibr\u00ec per la comunicazione fra gli oggetti. La classe, ereditata da Gui_Interface, quindi da EXTENDED_WIDGET, \u00e8 basata sul concetto di\u00a0 comando, inteso come una sequenza di stringhe che definiscono una frase, e di oggetti (puntatori )\u00a0 trasferiti alla classe attraverso una macro (<a href=\"https:\/\/www.colorwave.it\/blog\/framework\/comunicazione-fra-oggetti-con-interfaccia-operation_call\/admin\/2018\/09\/\" target=\"_blank\" rel=\"noopener noreferrer\">vedi questo articolo..<\/a>).<\/p>\n<p>Le istanze di questa classe possono ricevere un comando comando attraverso una macro, anche quando non direttamente accessibile attraverso il puntatore, esistendo una funzionalit\u00e0\u00a0 di registrazione (visibilit\u00e0 globale) che ne permettono l&#8217;accesso attraverso un nomo univoco.<\/p>\n<p>In origine il framework di Colibr\u00ec conteneva solo un modo di comunicazione fra gli oggetti basato sul criterio della\u00a0 funzione di ricezione di un\u00a0 messaggio, sul modello di Windows. Questa modalit\u00e0 \u00e8 conservata ancora, permettendo un&#8217;interfacciamento semplice con la messaggistica di windows verso i controlli (o widgets) dell&#8217;interfaccia grafica di Colibr\u00ec.\u00a0 in seguito l&#8217;introduzione di <a href=\"https:\/\/www.colorwave.it\/blog\/framework\/linterfaccia-operation_call\/admin\/2015\/05\/\">OPERATION_CALL\u00a0<\/a><\/p>\n<p>ha permesso di semplificare la messaggistica interna al framework, permettendo comandi molto pi\u00f9 complessi, non basati su id di comando come nelle API di Windows, ma su frasi di lunghezza qualunque, alle quali possono essere associati parametri. Questo permette, ad esempio, di mandare un comando del tipo<\/p>\n<pre class=\"lang:default decode:true\">__exec_global_fn(_$dock_recipe, _$display, _$recipe, color-&gt;get_recipe());<\/pre>\n<p>La macro significa: <em><span style=\"color: #0000ff;\">manda il comando &#8220;visualizza la ricetta che segue&#8221;\u00a0 all&#8217;oggetto di nome _$dock_recipe <\/span><\/em>\u00a0.\u00a0 In questo caso la ricetta \u00e8 definita dalla funzione color-&gt;get_recipe(), mentre le tre stringhe $dock_recipe, _$display, _$recipe sono definite in un vocabolario composto da una collezione di file di inclusione usati nel software. di seguito ne \u00e8 data una parte presente in &#8220;CLB_keyword.h&#8221;<\/p>\n<pre class=\"height-set:true height:200 lang:default decode:true\">#pragma once\r\n\r\n#pragma region CLB_keyword  standard keywords recognized from CLB_language \r\n\/\/--------------------------------------------------------------------------------------------------------------------\r\n\r\n\r\n#pragma region    --------------------------------&gt; A \r\n\r\n#define _$accept\t\t\tL\"accept\"\t\t\t\/\/ accettare (se successivo a _$query : accetti?)\r\n#define _$add\t\t\t\tL\"add\"\t\t\t\t\/\/ aggiungi alla lista dei selezionati un elemento\r\n#define _$all\t\t\t\tL\"all\"\r\n#define _$application\t\tL\"app\"\t\t\t\t\/\/ id dell'interfaccia APPLICATION\r\n#define _$area\t\t\t\tL\"area\"\t\t\t\t\/\/ collega un elemento con..\r\n#define _$attach\t\t\tL\"atch\"\t\t\t\t\/\/ collega un elemento con..\r\n#define _$average\t\t\tL\"avg\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; B\r\n\r\n#define _$background\t\tL\"backgrd\"\r\n#define _$bitmap\t\t\t\tL\"btmap\"\r\n#define _$book\t\t\t\tL\"book\"\t\r\n#define _$border\t\t\t\tL\"bord\"\r\n#define _$bottom\t\t\t\tL\"bottom\"\r\n#define _$brush\t\t\t\tL\"brush\"\r\n\r\n#pragma endregion \r\n#pragma region --------------------------------&gt; C\r\n\r\n#define _$call_back\t\t\tL\"callback\"\r\n#define _$canvas\t\t\tL\"canvas\"\t\t\t\/\/ widget di visualizzazione\/editin del documento\r\n#define _$captured\t\t\tL\"captured\"\r\n#define _$clear\t\t\t\tL\"clr\"\r\n#define _$color\t\t\t\tL\"color\"\t\t\t\/\/ oggetto colore\r\n#define _$color_table\t\tL\"col_tbl\"\t\t\t\/\/ tabella colori\r\n#define _$copy\t\t\t\tL\"cpy\"\t\t\t\t\/\/ verbo copiare\r\n#define _$connect\t\t\tL\"connect\"\t\t\t\/\/\/ richiesta di attivare una connessione per trasmissione automatica di un oggetto\r\n#define _$container\t\t\tL\"container\"\t\t\/\/ \r\n#define _$create\t\t\t\tL\"create\"\t\t\t\/\/ verbo creare\r\n#define _$croma\t\t\t\tL\"croma\"\t\t\t\/\/ croma\r\n#define _$curve\t\t\t\tL\"CURVE\"\t\t\/\/ oggetto curva\r\n#define _$cut\t\t\t\t\tL\"cut\"\t\t\t\t\/\/ verbo taglia\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; D\r\n\r\n#define _$delta\t\t\tL\"\u0394\"\t\t\t\t\/\/ delta colorimetrico\r\n#define _$deltaC\t\t\tL\"deltaC\"\r\n#define _$deltaE\t\t\tL\"deltaE\"\r\n#define _$deltaH\t\t\tL\"deltaH\"\r\n#define _$deltaL\t\t\tL\"deltaL\"\r\n#define _$destroy\t\tL\"destroy\"\t\t\t\/\/ verbo distruggere\r\n#define _$detach\t\t\tL\"detach\"\r\n#define _$display\t\t\tL\"display\"\r\n#define _$display_selected  L\"display_sel\"\t\t\/\/ visualizza elementi selezionati\r\n#define _$distance\t\t\tL\"dist\"\t\t\t\t\/\/ distanza\r\n#define _$document\t\t\tL\"document\"\t\t\t\/\/ documento\r\n#define _$down\t\t\t\tL\"down\"\t\t\t\/\/ documento\r\n#define _$draw\t\t\t\tL\"draw\"\t\t\t\t\/\/ verbo disegnare\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; E\r\n\r\n#define _$end\t\t\t\tL\"end\"\r\n#define _$ended\t\t\t\tL\"ended\"\r\n#define _$edit\t\t\t\tL\"edit\"\t\t\t\t\/\/ visualizza elementi selezionati\r\n#define _$effect\t\t\tL\"effect\"\t\t\t\/\/ effetto (filtraggio) \r\n#define _$error\t\t\tL\"error\"\t\t\r\n#define _$exec\t\t\t\tL\"exec\"\t\t\t\t\/\/ esecuzione di un comando\r\n#define _$exist\t\t\t\tL\"exist\"\r\n#define _$export\t\t\tL\"export\"\t\t\t\/\/ esportazione di\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; F\r\n\r\n#define _$false\t\t\t\tL\"0\"\r\n#define _$fault\t\t\t\t\tL\"fault\"\r\n#define _$file\t\t\t\t\tL\"file\"\r\n#define _$file_name\t\tL\"fname\"\r\n#define _$fill\t\t\t\t\tL\"fill\" \r\n#define _$filter\t\t\t\t\tL\"fltr\"\r\n#define _$float\t\t\t\t\tL\"float\"\r\n#define _$focus\t\t\t\tL\"focus\"\r\n#define _$foreground\t\tL\"foregrd\"\r\n#define _$from\t\t\t\tL\"from\"\t\t\t\t\/\/  preposizioni da, dal, dai..\r\n#define\t _$function\t\t\tL\"function\"\t\t\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; G\r\n\r\n\r\n#define _$gamut\t\t\t\tL\"gamut\"\r\n#define _$get\t\t\t\t\tL\"get\"\r\n#define _$get_preview\tL\"get_preview\"\r\n#define _$grid\t\t\t\t\tL\"gride\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; H\r\n\r\n\r\n#define _$hatch\t\t\tL\"hatch\"\r\n#define _$hide\t\t\t\tL\"hide\"\t\t\t\t\/\/ nascondere, contrario di _$show\r\n#define _$hlc\t\t\t\tL\"hlc\"\t\t\t\t\/\/ classe hlc\r\n#define _$hue\t\t\t\tL\"hue\"\t\t\t\t\/\/ hue\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; I\r\n\r\n\r\n#define _$illuminant \t\tL\"illum\"\r\n#define _$image\t\t\t\tL\"image\"\r\n#define _$int\t\t\t\tL\"int\"\r\n#define _$interval\t\t\tL\"itv\"\t\t\t\t\/\/ intervallo \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; J\r\n\r\n#define _$jump\t\t\t\t\"jmp\"\t\t\t\t\/\/ salta a \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; K\r\n\r\n#define _$keyword\t\t\t\"kword\"\t\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; L\r\n\r\n#define _$lab\t\t\t\tL\"lab\"\t\t\t\t\/\/ spazio colore Lab\r\n#define _$lab_a\t\t\t\tL\"a\"\r\n#define _$lab_b\t\t\t\tL\"b\"\r\n#define _$layer\t\t\tL\"layer\"\r\n#define _$layout\t\t\tL\"LY\"\t\t\t\t\/\/ id oggetti layout\r\n#define _$ly_img\t\t\tL\"lay_image\"\t\t\/\/ id sezione immagine \r\n#define _$ly_obj\t\t\tL\"LY_OBJECT\"\t\t\t\/\/ id sezione immagine \r\n#define _$ly_table\t\tL\"LY_table\"\t\t\t\/\/ id sezione tabella  \r\n\r\n#define _$ly_prt_mode\t\tL\"lay_prt_mode\"\t\t\/\/ modi di tracciamento di un layout\r\n\r\n#define _$ly_title\t\t\tL\"lay_tit\"\t\t\t\/\/ sezione titolo\t\r\n#define _$line_size\t\t\tL\"lnsize\"\t\t\t\/\/ spessore linea\r\n#define _$lum\t\t\t\tL\"lum\"\t\t\t\t\/\/ luminanza\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; M\r\n\r\n#define _$mask\t\t\t\tL\"msk\"\r\n#define _$menu\t\t\t\tL\"menu\"\r\n#define _$modified\t\t\tL\"modified\"\r\n#define _$move\t\t\t\tL\"move\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; N\r\n\r\n#define _$name\t\t\tL\"name\"\t\r\n#define _$new\t\t\t\tL\"new\"\t\t\t\/\/ crea nuovo\r\n\r\n#define _$not\t\t\t\t_$false\t\t\t\/\/ contrario di _$yes\r\n#define _$null\t\t\t\tL\"null\"\t\t\t\/\/\/ significato non definito, vuoto ecc; rimandato da  __exec_global_fn e __exec_obj_fn se la richiesta non \u00e8 soddisfatta\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; O\r\n\r\n#define _$object_3d\t\tL\"obj3d\"\t\t\t\/\/ oggetto 3d visualizzabile ed editabile in finestre 3d openGL\r\n#define _$object_db\t\tL\"objdb\"\t\t\t\/\/ oggetto derivato da DB_OBJECT\r\n#define _$obsserver\t\tL\"cie_obs\"\t\t\/\/ osservatore standard CIE\r\n#define _$offset\t\t\t\tL\"offset\"\t\t\t\/\/ offset\r\n#define _$only\t\t\t\t\tL\"only\"\t\t\t\t\/\/ solo.. \r\n#define _$open\t\t\t\tL\"open\"\t\t\t\/\/ apertura file,processo, finestra ecc..\r\n#define _$organize\t\t\tL\"organize\"\t\t\t\/\/ modalit\u00e0 di organizzazione\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; P\r\n\r\n#define _$page\t\t\tL\"page\"\r\n#define _$paste\t\t\tL\"paste\"\r\n#define _$pixels\t\t\tL\"pxl\"\t\t\r\n#define _$plot_obj\t\tL\"plot_obj\"\r\n#define _$points\t\t\tL\"points\"\t\t\t\t\t\/\/ lista di punti\r\n#define _$point\t\t\t\tL\"point\"\t\t\t\t\t\/\/ punto \r\n\r\n#define _$pop\t\t\t\tL\"pop\" \r\n#define _$print\t\t\t\tL\"print\"\t\r\n#define _$profile\t\t\tL\"profile\"\t\r\n#define _$program\t\tL\"program\"\t\t\r\n#define _$push\t\t\t\tL\"push\" \r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; Q\r\n\r\n#define _$query\t\t\t\tL\"query:\"\t\t\t\/\/ richiesta di informazioni, normalmente rispondere con _$yes o _$no\r\n#define _$queue\t\t\t\tL\"queue\"\t\t\t\/\/ coda generica, se necessario da specificare con successiva informazione\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; R\r\n\r\n#define _$random\t\t\tL\"random\"\r\n#define _$ready\t\t\t\tL\"ready\"\r\n#define _$receive\t\t\tL\"receive\"\t\t\t\/\/ ricezione di.. segue l'idi del tipo di oggetto\r\n#define _$redo\t\t\t\tL\"redo\"\t\t\t\t\/\/ comando annulla _$undo\r\n\r\n#define _$reflectance\t\tL\"refl\"\t\t\t\t\/\/ oggetto riflettanza\r\n\r\n#define _$remove\t\t\tL\"remove\"\r\n#define _$replace\t\t\tL\"replace\"\r\n#define _$resize\t\t\t\tL\"resize\"\r\n#define _$restore\t\t\tL\"restore\"\r\n#define _$return\t\t\t\tL\"return\"\t\t\t\/\/\/ richiesta di ritorno di un oggetto\r\n#define _$rgb\t\t\t\t\tL\"rgb\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; S\r\n\r\n#define _$select\t\t\t\t\t\tL\"select\"\t\t\t\/\/ elimina lista e aggiungi l'elemento..\r\n#define _$selected\t\t\t\t\tL\"selected\"\r\n#define _$selected_area\t\t\tL\"selarea\"\t\t\t\/\/ selezionata area\r\n#define _$selected_point\t\tL\"selpoint\"\t\t\t\/\/ selezionato un punto\r\n#define _$send\t\t\t\t\t\tL\"send\"\t\t\t\/\/ spedisci\r\n#define _$set\t\t\t\t\t\t\tL\"set\"\r\n#define _$size\t\t\t\t\t\t\tL\"size\"\r\n#define _$show\t\t\t\t\t\tL\"show\"\t\t\t\t\/\/visualizza , contrario di _$hide\r\n#define _$solid\t\t\t\t\t\tL\"solid\"\r\n#define _$spectrophotometer\tL\"sptf\"\t\t\t\t\t\/\/  spettrofotometro\r\n#define _$started\t\t\t\t\t\tL\"started\"\r\n#define _$status\t\t\t\t\t\tL\"status\"\r\n\r\n#define _$string_empty\t\t\tL\"\"\t\t\t\t\t\/\/ stringa vuota\r\n#define _$style\t\t\t\t\t\tL\"style\"\r\n\r\n#define  _$substrate\t\t\t\tL\"substrate\"\t\t\/\/ substrato in uso su..\r\n#define  _$suffix_lab\t\t\t\tL\"imglab\"\t\t\t\/\/ suffisso file lab di colibri\r\n#define  _$suffix_layout\t\t\tL\"LAYOUT_printing_page\"\t\t\/\/ suffisso file di layout\r\n#define\t _$suffix_moro\t\t\t\tL\"moro_doc\"\t\t\t\/\/ suffisso documenti moro e MAGIC di oggetti Moro_document\r\n#define  _$suffix_nuance\t\t\tL\"nuanceo_doc\"\t\t\/\/ suffisso documenti nuance e MAGIC di oggetti nuance_document\r\n#define  _$suffix_psd\t\t\t\tL\"psd\"\t\t\t\/\/ suffisso file psd\r\n#define  _$suffix_ref\t\t\t\tL\"ref\"\t\t\/\/ suffisso file ref\r\n#define  _$suffix_sif\t\t\t\t\tL\"sif\"\t\t\/\/ suffisso file sif\r\n#define  _$suffix_tif\t\t\t\t\tL\"tif\"\t\t\t\/\/ suffisso file sif\r\n\r\n\r\n#define _$supported\t\t\t\tL\"suptd\"\t\t\t\/\/ usato per richiedere se una classe di funzioni \u00e8 supportata (classe o funzione o altra richiesta riconosciuta dall'elemento)\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; T\r\n\r\n#define _$text_object\t\tL\"ctext\"\t\t\t\/\/ tipo di oggetto testo (class TextObject)\r\n#define _$tiff\t\t\t\t\tL\"tiff\"\r\n#define _$tiling\t\t\t\tL\"tiling\"\t\t\t\t\/\/ modello di tiling \/ step&amp;repeats\r\n#define _$thickness\t\t\tL\"thickn\"\t\t\/\/ spessore\r\n#define _$thumbnail\t\tL\"thumbnail\"\t\r\n#define _$to\t\t\t\t\t\tL\"to\"\t\t\t\/\/ preposizione \r\n#define _$tool\t\t\t\t\t\tL\"tool\"\t\t\t \r\n#define _$top\t\t\t\t\tL\"top\"\t\t\t\/\/ preposizione \r\n#define _$transmit\t\t\tL\"transmit\"\t\t\/\/ inizia trasmissione automatica\r\n#define _$true\t\t\t\t\tL\"1\"\t\t\t\/\/ vero, equivalente a _$yes\r\n#define _$type\t\t\t\t\tL\"type\"\t\t\t\t\/\/ tipo generico (interpretato dal contesto)\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; U\r\n\r\n#define _$undo\t\t\t\tL\"undo\"\t\t\t\/\/ comando undo, ripristina\r\n#define _$up\t\t\t\t\tL\"up\"\t\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; V\r\n\r\n#define _$view\t\t\t\t\t\tL\"view\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; W\r\n\r\n#define _$widget\t\t\tL\"widget\"\t\t\/\/ widget\r\n#define _$working\t\t\tL\"working\"\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; X\r\n\r\n#define _$xtract\t\t\tL\"xtract\"\t\t\/\/ verbo estrai\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; Y\r\n\r\n#define _$yes\t\t\t\t_$true\t\t\t\/\/ contrario di _$not\r\n\r\n#pragma endregion \r\n#pragma region  --------------------------------&gt; \r\n\r\n#define _$zoom\tL\"zoom\"\r\n\r\n#pragma endregion \r\n\r\n\r\n#pragma endregion \r\n<\/pre>\n<p>La nuova classe CLB_messenger non sostituisce la gestione precedente, ma la affianca come interfaccia pi\u00f9 agevole da programmare. la OPERATION_CALL sar\u00e0 in futuro non pi\u00f9 supportata all&#8217;interno di Colibr\u00ec, poich\u00e8 la nuova interfaccia CLB_messenger gi\u00e0 fornisce tutte le caratteristiche necessarie alla comunicazione bidirezionale fra gli oggetti. Attualmente le due interfacce sono entrambe disponibili per le classi derivare da EXTENDED_WIDGET (praticamente tutti i controlli costruiti nel framework).<\/p>\n<!--nextpage-->\n<p>Prima di descrivere le funzionalit\u00e0 della classe <em>CLB_messenger<\/em>, esponiamo le caratteristiche della classe <em>test_request<\/em>, usata per il parsing ed il trasferimento di comandi fra gli oggetti.<\/p>\n<p>Abbiamo gi\u00e0 indirettamente incontrato questa classe discutendo di OPERATION_CALL, avendola utilizzata nella dichiarazione della macro\u00a0 \u00a0<em>__register_global_object<\/em>.\u00a0 Ne daremo ora una descrizione dettagliata.<\/p>\n<p>Possiamo immaginare <span style=\"color: #000000;\"><strong>test_request <\/strong><\/span>come il mediatore che rende disponibili i comandi e parametri, individuando l&#8217;oggetto ricevente, chiamando la funzione di ricezione dello stesso e rendendo disponibile i dati in forma di comando analizzato. Ha come oggetti target quelli di tipo OPERATION_CALL\u00a0 e CLB_messenger<\/p>\n<pre class=\"lang:default decode:true\">class AFX_EXT_CLASS test_request\r\n{\r\npublic:\r\n\ttest_request(ARGPTR *p);\r\n\r\n\tbool is(__arg_value pars, ...);\r\n\r\n\tvoid *pop_param();\r\n\r\n\tstatic __arg_value exec_global_fn(__arg_value pars, ...);\r\n\tstatic __arg_value exec_obj_fn(__arg_value pars, ...);\r\n\r\n\tARGPTR * p = 0;\r\n\tint _np = 0;\r\n\r\n\t__arg_value ret_va = 0l;\r\n\tvoid *sender = 0;\r\n};<\/pre>\n<h4><strong>__arg_value\u00a0 exec_global_fn(__arg_value pars, &#8230;)<\/strong><\/h4>\n<p>Questa funzione \u00e8 di tipo VARIADIC, cio\u00e8 riceve un numero variabile di parametri, tutti di tipo <em>__arg_value (cio\u00e8 void *).<\/em> non viene mai usata direttamente, ma internamente alla macro <span style=\"color: #ff0000;\"><em>__exec_global_fn(..)\u00a0 <\/em><\/span>\u00a0la quale permette la trasmissione di un comando ad un oggetto riconoscibile attraverso il suo nome (id dell&#8217;istanza).<\/p>\n<p>In pratica non useremo mai questa funzione direttamente, ma attraverso le macro che preparano i parametri necessari.<\/p>\n<p>Le classi in grado di ricevere un messaggio attraverso la macro <span style=\"color: #ff0000;\"><em>__exec_global_fn <\/em><\/span>sono derivate da <em>OPERATION_CALL<\/em> e le loro istanze individuabili sono quelle registrate globalmente attraverso la macro <span style=\"color: #ff0000;\">__register_global_object\u00a0<\/span>. Analizziamo ora come lanciare un comando ad una classe OPERATION_CALL registrata globalmente; per farlo utilizziamo come esempio\u00a0 una partde di codice del framework di Colibr\u00ec:<\/p>\n<pre class=\"lang:default decode:true\">\t\t$_function(void, _inform_navigator)\r\n\t\t{\r\n\t\t\tif (GETBIT(NAVIGATOR))\r\n\t\t\t\t__exec_global_fn(_$dock_navigator, _$attach, _$view, $obj);\r\n\t\t}\r\n<\/pre>\n<p>la funzione\u00a0 _inform_navigator,\u00a0 scritta nella sintassi CLB_language, il linguaggio interno a Colibri, \u00e8 parte del codice della classe WIDGET_DOCUMENT, che visualizza un oggetto di classe DOCUMENT; analizziamo la funzione: essa\u00a0 verifica l&#8217;esistenza di una condizione (GETBIT(NAVIGATOR)) quindi esegue una macro, evidenziata in rosso nell&#8217;esempio:\u00a0\u00a0 <span style=\"color: #ff0000;\"><em>__exec_global_fn(_$dock_navigator, _$attach, _$view, $obj);<\/em><\/span><\/p>\n<p><strong>__exec_global_fn\u00a0<\/strong> \u00a0\u00e8 la macro che manda il comando ad un oggetto OPERATION_CALL definito attraverso il suo nome globale,\u00a0 <em><span style=\"color: #ff0000;\">_$dock_navigator <\/span><\/em>;<\/p>\n<p>il comando mandato \u00e8<em><span style=\"color: #ff0000;\"> _$attach, _$view\u00a0 \u00a0<\/span><\/em>interpretabile come <span style=\"color: #0000ff;\"><em>connettiti\u00a0 questo controllo di visualizzazione:<\/em><\/span>\u00a0 \u00a0<em><span style=\"color: #ff0000;\">$obj, <\/span><\/em>(\u00e8 il puntatore al controllo di visualizzazione da connettere)<\/p>\n<p>Vedremo fra poco come questo comando sar\u00e0 ricevuto dall&#8217;istanza della classe <em>DOCK_document_navigator<\/em>, destinataria dello stesso.<\/p>\n<p><span style=\"color: #000000;\">La macro <em>__exec_global_fn<\/em> definita nel file CLB_language.h ed \u00e8 visibile di seguito:<\/span><\/p>\n<pre class=\"lang:default decode:true \">#define __exec_global_fn(...)  test_request::exec_global_fn( __VA_ARGS__,_$end) \r\n<\/pre>\n<p>Come si pu\u00f2 notare, \u00e8 una macro che contiene un numero di argomenti variabili (variadic)\u00a0 e chiama la funzione statica <em><span style=\"color: #ff0000;\">test_request::exec_global_fn\u00a0<\/span><\/em>passando gli stessi argomenti pi\u00f9 un id di fine lista (<span style=\"color: #ff0000;\">_$end<\/span>)<\/p>\n<p>La funzione\u00a0 <span style=\"color: #ff0000;\">test_request::<\/span><em><span style=\"color: #ff0000;\">exec_global_fn\u00a0 <\/span><\/em>riceve cos\u00ec\u00a0 la lista di argomenti, aspettandosi che il primo sia il nome dell&#8217;istanza globale di tipo OPERATION_CALL (nel nostro caso sar\u00e0 l&#8217;istanza DOCK_document_navigator,\u00a0 che \u00e8 identificata dalla stringa\u00a0 _$dock_navigator) ne analizza il significato e manda il comando alla\u00a0 istanza riconosciuta. L&#8217;istanza era stata registrata all&#8217;atto della sua costruzione attraverso la macro\u00a0 <em><span style=\"color: #ff0000;\">__register_global_object\u00a0\u00a0<\/span><\/em>inserita nel costruttore, come si vede nel codice sotto riportato:<\/p>\n<pre class=\"lang:default decode:true\">DOCK_document_navigator::DOCK_document_navigator()\r\n{\r\n\t$_init\r\n\r\n\t__register_global_object(_$dock_navigator)\r\n\r\n\t__on_signal_create(__on_create_window)\r\n\t__on_signal_end_create(__on_end__create_window)\r\n\t__on_signal_paint(__on_paint_wnd)\r\n\t__on_signal_resize(__on_resize_window)\r\n\r\n}\r\n<\/pre>\n<p>Nel caso specifico, esiste un&#8217;unica istanza della classe DOCK_document_navigator creata nel software.<\/p>\n<h4><strong>la macro __register_global_object\u00a0<\/strong><\/h4>\n<ul>\n<li>Questa macro, che abbiamo dichiarato nel costruttore della classe, svolge pi\u00f9 funzioni:<\/li>\n<li>registra in una lista globale l&#8217;oggetto creato assegnandogli un nome (_$dock_navigator)<\/li>\n<li>dichiara lo <em>slot di ricezione<\/em> dei messaggi lanciati attraverso la macro <em><span style=\"color: #ff0000;\">__exec_global_fn\u00a0 \u00a0<\/span><\/em><\/li>\n<\/ul>\n<p>Lo slot di ricezione \u00e8 stato definito poco prima del costruttore ed \u00e8 visibile di seguito:<\/p>\n<pre class=\"lang:default decode:true\">__slot_function_parser\r\n{\r\n\r\n\t___exit_if_not_dock\r\n\r\n\r\n\r\n\t__is_request(_$attach,_$view)\r\n\t{\r\n\t\t__pop_param(w, WIDGET_DOCUMENT)\r\n\t\t$obj-&gt;send_to_obj(_$str-&gt;wdoc,_$attach, _$view,w,_$end);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t__is_request(_$hide)\r\n\t{\r\n\t\t$obj-&gt;Show(false);\r\n\t\treturn true;\r\n\t}\r\n\r\n}\r\n__end_slot\r\n\r\n__declare_slots\r\n__add_function_parser\r\n__end__declare_slots\r\n\r\nDOCK_document_navigator::DOCK_document_navigator()\r\n{\r\n\t$_init\r\n\r\n\t__register_global_object(_$dock_navigator)\r\n\r\n\t__on_signal_create(__on_create_window)\r\n\t__on_signal_end_create(__on_end__create_window)\r\n\t__on_signal_paint(__on_paint_wnd)\r\n\t__on_signal_resize(__on_resize_window)\r\n\r\n}\r\n<\/pre>\n<p><em><span style=\"color: #ff0000;\">__slot_function_parser ..<\/span> <span style=\"color: #ff0000;\">__end_slot<\/span><\/em><span style=\"color: #ff0000;\"> :\u00a0 <\/span>il blocco definisce il corpo della funzione slot di ricezione<\/p>\n<p><span style=\"color: #ff0000;\">__declare_slots\u00a0 __add_function_parser\u00a0 __end__declare_slots\u00a0 :\u00a0 <\/span>questa sequenza dichiara la struttura per l&#8217;accesso allo slot, che <span style=\"color: #ff0000;\">__register_global_object<\/span> user\u00e0 per la registrazione<\/p>\n<p>lo slot contiene un insieme di macro che individuano il tipo di comando:<\/p>\n<p><span style=\"color: #ff0000;\"><em>_is_request(_$attach,_$view)\u00a0<\/em><\/span> \u00a0\u00e8 il test che viene eseguito per verificare che il comando sia _$attach,_$view;<\/p>\n<p>in questo caso con la macro<em><span style=\"color: #ff0000;\"> __pop_param(w, WIDGET_DOCUMENT)<\/span> <\/em>viene estratto il puntatore all&#8217;oggetto <em>WIDGET_DOCUMENT<\/em> atteso con il comando (esattamente come descritto in precedenza);<\/p>\n<p>il comando successivo eseguito \u00e8<span style=\"color: #ff0000;\"> $obj-&gt;send_to_obj(_$str-&gt;wdoc,_$attach, _$view,w,_$end);\u00a0<\/span><\/p>\n<p><strong><em>La cosa si fa interessante<\/em><\/strong>:<\/p>\n<p>$obj, che individua l&#8217;istanza\u00a0 che sta ricevendo il comando \u00e8 DOCK_document_navigator, a sua volta derivata da EXTENDED_WIDGET, come tutti i controlli di Colibr\u00ec, quindi possiede l&#8217;interfaccia CLB_messenger.<\/p>\n<p>La funzione <span style=\"color: #ff0000;\">send_to_obj\u00a0\u00a0<\/span>chiamata manda un messaggio per informare il controllo figlio (<span style=\"color: #ff0000;\">_$str-&gt;wdoc<\/span>) con il comando <span style=\"color: #ff0000;\">_$attach, _$view, w <\/span>dove w \u00e8 il parametro WIDGET_DOCUMENT ricevuto.. <span style=\"color: #ff0000;\">_$str-&gt;wdoc <\/span>di cui non vogliamo esporre nulla se non che, essendo anch&#8217;esso derivato da EXTENDED_WIDGET, possedendo l&#8217;interfaccia CLB_messenger, sar\u00e0 in grado di ricevere il messaggio nella sua funzione virtuale<em><span style=\"color: #ff0000;\"><strong> slot_messenger(..)\u00a0 <\/strong><\/span><\/em>di cui scriveremo fra poco..<\/p>\n<p>Per concludere questa non brevissima analisi della classe test_request: abbiamo scoperto due diverse funzioni di messaggistica disponibili:<\/p>\n<p><span style=\"color: #0000ff;\"><em><strong>exec_global_fn<\/strong><\/em><\/span>: che comunica con oggetti registrati globalmente, derivati da OPERATION_CALL<\/p>\n<p><em><strong><span style=\"color: #0000ff;\">send_to_obj<\/span><\/strong><\/em>: che manda un messaggio ad un oggetto con interfaccia <em>CLB_messenger<\/em>, di cui \u00e8 noto il puntatore.<\/p>\n<p>le altre funzioni :<\/p>\n<p><strong>is(__arg_value pars, &#8230;)<\/strong><\/p>\n<p>\u00e8 una funzione di supporto per l&#8217;individuazione della sequenza di comandi ricevuti; la funzione \u00e8 usata all&#8217;interno della macro __is_request:<\/p>\n<pre class=\"lang:default decode:true\">#define __is_request(...) if (_requ_.is( __VA_ARGS__,0))<\/pre>\n<p>nel nostro esempio __is_request(_$attach,_$view) rimanda true se la sequenza \u00e8 quella sotto indicata. in questo caso, sempre analizzando l&#8217;esempio, viene eseguita la macro __pop_param:<\/p>\n<pre class=\"lang:default decode:true \">#define __pop_param(ptr,type) type *ptr=(type *)_A(_requ_._np++);<\/pre>\n<p>la macro genera una variabile inizializzandola con il contenuto attuale nello stack dei comandi della classe test_request di supporto.<\/p>\n<p><img decoding=\"async\" data-attachment-id=\"3285\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/?attachment_id=3285\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" data-orig-size=\"24,24\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"word-image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"alignleft size-full wp-image-3285\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?resize=24%2C24&#038;ssl=1\" alt=\"\" width=\"24\" height=\"24\" data-recalc-dims=\"1\" \/><strong>Nota<\/strong>: Osservare che la classe <strong><em><span style=\"color: #ff0000;\">test_request\u00a0 <\/span><\/em><\/strong>pur essendo il cuore di tutte le funzioni di comunicazione, non appare mai direttamente nel codice scritto dallo sviluppatore, ma \u00e8 sempre presente ed utilizzata all&#8217;interno delle macro di gestione dei messaggi!<\/p>\n<p>Non abbiamo ancora esaurito la descrizione delle caratteristiche di test_request, ma ne sappiamo a sufficienza per passare finalmente alla classe CLB_messenger<\/p>\n<!--nextpage-->\n<p>La classe appartiene al namespace CLB::Messaging; il namespace CLB, contenuto nella dll CLB_000 \u00e8 destinato a contenere tutte le classi di nuova generazione di Colibri, dalla versione 8 in poi.<\/p>\n<p>CLB_messenger\u00a0 permette la messaggistica bidirezionale fra oggetti; introdotta\u00a0 dalla data 20 febb 2019,\u00a0 ha lo scopo di facilitare la comunicazione fra oggetti.<\/p>\n<p>Il paradigma \u00e8 molto semplice:<\/p>\n<ul>\n<li>Tutte le classi che vengono connesse sono derivate da CLB_messenger;\u00a0 in pratica, attraverso la dichiarazione<span style=\"color: #0000ff;\"> public CLB_messenger<\/span> la classe\u00a0 eredita l&#8217;interfaccia che permetter\u00e0 la trasmissione diretta di comandi e parametri (vedremo come)<\/li>\n<li>Sono definite funzioni send(..) e send_to_obj(..)\u00a0 per la trasmissione di un messaggio ad oggetto di cui si conosce il nome globale, o nel secondo caso del quale si conosce l&#8217;indirizzo (puntatore).<\/li>\n<li>Viene\u00a0 riscritta per ogni classe derivata la funzione virtuale\u00a0 slot_messenger(..) che costituisce il parser dei comandi ricevuti;\u00a0 \u00e8 compito di questa funzione filtrare i comandi secondo le specifiche costruttive (vederemo che \u00e8 possibile interrogare le classi per ottenere una lista delle specifiche di comando, pi\u00f9 o meno\u00a0 come avviene con i servizi web..)<\/li>\n<li>Se una istanza CLB_messenger A\u00a0 viene registrata\u00a0 attraverso la funzione CLB_messenger::regs(..) di un&#8217;altra istanza B di CLB_messenger, essa ricever\u00e0 in slot_messenger(..) tutte le notifiche dei comandi lanciati dall&#8217;oggetto B, fino ad una eventuale chiamata\u00a0 B-&gt;unregs(A);<\/li>\n<li>Tutte le istanze allocate delle classi di interfaccia CLB_messenger vengono automaticamente registrate in una lista di accesso, fino alla loro distruzione; questo permette un accesso all&#8217;oggetto attraverso il nome proprio, un identificatore univoco dell&#8217;istanza; descriveremo di seguito come gestire questa eventualit\u00e0.<\/li>\n<\/ul>\n<p><strong><img decoding=\"async\" data-attachment-id=\"3285\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/?attachment_id=3285\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" data-orig-size=\"24,24\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"word-image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?fit=24%2C24&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"alignleft size-full wp-image-3285\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2018\/03\/word-image-97.png?resize=24%2C24&#038;ssl=1\" alt=\"\" width=\"24\" height=\"24\" data-recalc-dims=\"1\" \/>Nota:<\/strong> In pratica, una classe derivata da\u00a0 CLB_messenger potrebbe solo possedere una funzione slot_messenger(..) per potere ricevere comandi da un qualunque oggetto creato nel framework..<\/p>\n<p>&nbsp;<\/p>\n<p>Questo \u00e8 il codice di dichiarazione della classe:<\/p>\n<pre class=\"lang:default decode:true\">class AFX_EXT_CLASS CLB_messenger\r\n{\r\npublic:\r\n\r\n\tbool regs(CLB_messenger *robj);\r\n\tbool unregs(CLB_messenger *robj);\r\n\r\n\tbool registered(CLB_messenger *robj);\r\n\r\n\tCLB_messenger();\r\n\t~CLB_messenger();\r\n\r\n\tvirtual bool slot_messenger(_received_data);\r\n\r\n\tbool send(__arg_value cmd, ...);\r\n\r\n\tbool send_to_obj(CLB_messenger *receiver, __arg_value pars, ...);\r\n\r\n\t__use_private_struct\r\n};\r\n<\/pre>\n<h4><strong>bool regs(CLB_messenger *robj)<\/strong><\/h4>\n<p><em>registrazione di una classe come oggetto ricevente<\/em>. Questa funzione permette di registrare l&#8217;oggetto <strong>robj<\/strong> come ricevente automatico della messaggistica (comandi) della classe.\u00a0 In pratica tutti i comandi mandati attraverso la funzione Send() del sender saranno ricevuti dagli oggetti<br \/>\nregistrati.\u00a0 E&#8217; possibile registrare un numero qualunque di istanze receiver, e tutti questi oggetti potranno mandare anche messaggi all&#8217;oggetto sul quale sono stati registrati.<\/p>\n<h4><strong>bool unregs(CLB_messenger *robj)<\/strong><\/h4>\n<p><em>\u00a0rimozione dell&#8217;oggetto registrato.\u00a0 L<\/em>&#8216;oggetto viene comunque automaticamente rimosso quando distrutta la classe, e l&#8217;operazione \u00e8 fatta dal distruttore di CLB_messenger dal quale deriva. Dopo la sua de-registrazione l&#8217;oggetto non ricever\u00e0 pi\u00f9 comandi dalla classe alla quale era collegato cod la funzione regs.<\/p>\n<h4>bool registered(CLB_messenger *robj)<\/h4>\n<p>Testa che la istanza robj sia stata registrata nella classe; in questo caso rimanda true;<\/p>\n<h4>bool send(__arg_value cmd, &#8230;)<\/h4>\n<p>Manda un comando e parametri relativi a tutti gli oggetti registrati come receiver attraverso la funzione regs; l&#8217;ultimo elemento della var_list passata deve essere necessariamente _$end:<\/p>\n<h4>bool send_to_obj(CLB_messenger *receiver, __arg_value pars, &#8230;)<\/h4>\n<p>manda un comando e parametri ad uno specifico oggetto\u00a0 <em>receiver<\/em>. l&#8217;ultimo elemento della var_list passata deve essere necessariamente _$end;<\/p>\n<p>in questo caso non \u00e8 necessario che <em>receiver<\/em> sia stato registrato basta sia un puntatore a un <em>CLB_messenger<\/em> (vedi l&#8217;esempio di codice precedente relativo allo slot di <em>DOCK_document_navigator)<\/em><\/p>\n<p><strong>virtual bool slot_messenger(_received_data)<\/strong><\/p>\n<p>Questa funzione deve essere riscritta per ogni classe derivata da CLB_messenger, perch\u00e8 corrisponde al parser dei comandi ricevuti. Strutturalmente non \u00e8 molto diverso dalla definizione di uno slot di ricezione messaggi di OPERATION_CALL prima descritto per <em>DOCK_document_navigator).<\/em><\/p>\n<p>Si riporta ad esempio la funzione scritta per la classe Widget_plotter<\/p>\n<pre class=\"lang:default decode:true\">\tbool Widget_plotter::slot_messenger(_received_data)\r\n\t{\r\n\t\t__getstr\r\n\t\t__is_request(_$get,_$selected, _$curve)\r\n\t\t{\r\n\t\t\t__pop_p(cv, CURVE);\r\n\t\t\t_$str-&gt;edit-&gt;get_selected_curve(cv);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n<\/pre>\n<p>come parametro passato alla funzione, in conformit\u00e0 con la dichiarazione della stessa, c&#8217;\u00e8 sempre la macro _received_data :<\/p>\n<pre class=\"lang:default decode:true \">#define _received_data test_request &amp;_requ_<\/pre>\n<p>questo \u00e8 un modo per rendere immediatamente utilizzabili le macro <span style=\"color: #ff0000;\"><em>__is_request<\/em> <\/span>(incontrata prima descrivendo la classe <em>test_request<\/em>) e <span style=\"color: #ff0000;\"><em>__pop_v<\/em> <\/span>, una macro equivalente alla\u00a0 <span style=\"color: #ff0000;\">__pop_param\u00a0<\/span><\/p>\n<p>nel nostro esempio <span style=\"color: #ff0000;\">_$get,_$selected, _$curve\u00a0<\/span><\/p>\n<p>\u00e8 il comando che richiede un puntatore ad un oggetto CURVE contenuto nella classe; l&#8217;oggetto \u00e8 trasferito nel parametro CURVE *cv estratto dallo stack dei comandi e parametri con __pop_p. La funzione chiamante ricever\u00e0 questa informazione, come si vede nel codice che segue e che ha effettuato la chiamata..<\/p>\n<pre class=\"lang:default decode:true\">\t\t\t\t\/\/ funzione di ricezione dei messaggi da CLB_messenger\r\n\t\t\t\tbool slot_messenger(_received_data)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!_$str-&gt;layout)\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t__is_sender(w_plot)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t__is_request(_$get, _$image, _$background)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t__pop_p(img, IMAGE*);\r\n\t\t\t\t\t\t\tLayer_color *mrc = _$str-&gt;layout-&gt;Get_selected_layer();\r\n\t\t\t\t\t\t\tif (mrc)\r\n\t\t\t\t\t\t\t\t*img=mrc-&gt;get_background_image();\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t__is_request(_$modified, _$function)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tLayer_color *mrc = _$str-&gt;layout-&gt;Get_selected_layer();\r\n\t\t\t\t\t\t\tif (mrc)\r\n\t\t\t\t\t\t\t{\r\n\r\n\t\t\t\t\t\t\t\tCURVE *curva = mrc-&gt;get_curva();\r\n\t\t\t\t\t\t\t\t__send_cmd_to_obj(w_plot, _$get, _$selected, _$curve, curva);\t\t\/\/ estrae la curva modificata\r\n\t\t\t\t\t\t\t\tmrc-&gt;calculate_layer_image();\t\t\t\/\/ ricalcola l\u00ecimmagine di propagazione\r\n\t\t\t\t\t\t\t\tigrp-&gt;calculate_prop_image();\r\n\t\t\t\t\t\t\t\t_paint_result();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n<\/pre>\n<p>il codice della classe cui appartiene la funzione, ha ricevuto un messaggio che analizza e decide quali azioni compiere:\u00a0<span style=\"color: #ff0000;\"> __is_sender(w_plot)<\/span> \u00e8 una macro che controlla se il sender del comando \u00e8 w_plot , gi\u00e0 noto alla classe ovviamente, in questo caso se ha ricevuto il comando<span style=\"color: #ff0000;\"> $modified, _$function<\/span> decide, fra le altre cose, di richiedere la curva per usarla internamente; possiamo osservare che il puntatore curva \u00e8 passato, come gi\u00e0 spiegato, quale parametro nel comando.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In un articolo precedente abbiamo presentato la classe OPERATION_CALL \u00a0, un&#8217;interfaccia utilizzata nel framework di Colibr\u00ec per la comunicazione fra gli oggetti. La classe, ereditata da Gui_Interface, quindi da EXTENDED_WIDGET, \u00e8 basata sul concetto di\u00a0 comando, inteso come una sequenza di stringhe&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"aside","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[19,112],"tags":[],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-Ze","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3796"}],"collection":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/comments?post=3796"}],"version-history":[{"count":19,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3796\/revisions"}],"predecessor-version":[{"id":3815,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3796\/revisions\/3815"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=3796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=3796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=3796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}