{"id":3613,"date":"2018-07-24T15:46:01","date_gmt":"2018-07-24T15:46:01","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=3613"},"modified":"2018-07-30T15:39:55","modified_gmt":"2018-07-30T15:39:55","slug":"gestione-di-parametri-utente-la-classe-paramlist","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/howto\/gestione-di-parametri-utente-la-classe-paramlist\/admin\/2018\/07\/","title":{"rendered":"Gestione di parametri utente: la classe PARAMLIST"},"content":{"rendered":"<p>Il framework di Colibri contiene alcune classi per la configurazione dell&#8217;ambiente software; una di queste, PARAMLIST, viene presentata in questo articolo.<\/p>\n<p>PARAM_LIST \u00e8 utilizzata per salvare e richiamare parametri di configurazione del software: ad esempio, per conservare le informazioni sull&#8217;ultima directory usata per salvare i file tif; L<\/p>\n<pre class=\"lang:default decode:true\">class  AFX_EXT_CLASS PARAMLIST :public TAGS::TAG\r\n{\r\npublic:\r\n\tPARAMLIST();\r\n\t~PARAMLIST();\r\n\r\n\tSTRING Get ( STRING id );\r\n\tbool  Get ( STRING id, int *v );\r\n\tbool  Get ( STRING id, float *v );\r\n\tbool Get(STRING id, void *ptr, int mem_size);\r\n\tbool Get(STRING id, FILE_ITF *obj);\r\n\r\n\tSTRING Put(STRING id,STRING value);\r\n\tbool Put ( STRING id, int value );\r\n\tbool Put ( STRING id, float value );\r\n\tbool Put(STRING id, void *ptr, int mem_size);\r\n\tbool Put(STRING id, FILE_ITF *obj);\r\n\r\n\tSTRING FileSuffix();\r\n\r\n\tbool Load(STRING path);\r\n\tbool Save(STRING path);\r\n\r\n\t\/** \\brief apre la configurazione locale \r\n\t\\details La configurazione locale \u00e8 una lista di parametri usati dall'applicazione\r\n\t\r\n\t*\/\r\n\tstatic PARAMLIST *OpenUserConfig ( );\r\n\r\n\t\/** salva la configurazione locale\r\n\t*\/\r\n\tstatic bool CloseUserConfig ( );\r\n\r\n\t\/\/ pubblica sul sito ftp un file\r\n\tbool Publish(STRING fname, STRING remote_dir);\r\n\r\n\t\/\/ recupera dal sito remoto\r\n\tbool GetFtp(STRING fname, STRING remote_dir);\r\n\r\n\t__use_tag_funcs\r\n\t__use_private_struct\r\n};\r\n\r\n<\/pre>\n<p>PARAM_LIST gestisce una lista di parametri dei seguenti tipi:<\/p>\n<ul>\n<li><span style=\"color: #800000;\">STRING<\/span><\/li>\n<li><span style=\"color: #800000;\">int<\/span><\/li>\n<li><span style=\"color: #800000;\">float<\/span><\/li>\n<li><span style=\"color: #800000;\">void *mem<\/span><\/li>\n<\/ul>\n<p>STRING \u00e8 una stringa di caratteri TCHAR di lunghezza qualunque, int e float sono i tipi C \/C++ equivalenti, void *mem \u00e8 un blocco di memoria di mem_size byte;<\/p>\n<h4>identificatore del parametro<\/h4>\n<p>Ogni parametro \u00e8 associato ad un id univoco, usato per la lettura\/scrittura; le funzioni PARAM_LIST::Get e\u00a0PARAM_LIST::Put richiedono come primo argomento l&#8217;identificatore\u00a0 del parametro<\/p>\n<h4>Salvare un parametro<\/h4>\n<p>Le funzioni PARAM_LIST::Put permettono di salvare un parametro;\u00a0 In particolare notare che la funzione<span style=\"color: #800000;\"><em>\u00a0<\/em><\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"color: #800000;\"><em>Put(STRING id, void *ptr, int mem_size) ;\u00a0<\/em><\/span><\/p>\n<p>richiede oltre all&#8217;identificatore ed al puntatore alla memoria, anche le dimensioni dal leggere; il puntatore ptr pu\u00f2 essere, ad esempio, una struttura dati i cui campi contigui hanno dimensione fissa (quindi non puntatori allocati..)<\/p>\n<h4>Leggere un parametro<\/h4>\n<p>Per recuperare il valore di un parametro usare la funzione<\/p>\n<p style=\"text-align: center;\"><em><span style=\"color: #800000;\">PARAM_LIST::Get<\/span><\/em><\/p>\n<p>Se il parametro cercato non \u00e8 stato ancora memorizzato, le funzioni Get(..) rimandano un valore di default 0 per i tipi float e int, rimanda invece 0 nel caso di un parametro stringa o puntatore void *mem; in questo caso occorrer\u00e0 gestire il risultato da parte del programmatore;<\/p>\n<h4>Leggere\/Salvare un parametro con interfaccia FILE_ITF<\/h4>\n<p>Le classi che hanno interfaccia FILE_ITF possono essere utilizzate come parametri gestiti da PARAM_LIST; ad esempio, tutte le classi derivata da DOCUMENT posseggono questa interfaccia, quindi potranno essere usate come parametri gestibili in PARAM_LIST.<\/p>\n<p>Il vantaggio principale in questo caso \u00e8 nel fatto che le funzioni virtuali Read e Write di queste classi sono in grado di gestire anche la revisione della classe, e questo permette di alterare nel tempo facilmente il contenuto della classe, cosa che non \u00e8 prevista per i parametri di tipo <span style=\"color: #993300;\"><em>struc<\/em><\/span>.<\/p>\n<h4>Salvataggio e scrittura su file<\/h4>\n<p>La scrittura su file della classe PARAMLIST \u00e8 effettuata attraverso le funzioni<\/p>\n<p style=\"text-align: center;\"><em><span style=\"color: #800000;\">bool Load(STRING path); <\/span><\/em><\/p>\n<p style=\"text-align: center;\"><em><span style=\"color: #800000;\">bool Save(STRING path);<\/span><\/em><\/p>\n<p><em><span style=\"color: #800000;\">path<\/span><\/em> \u00e8 il percorso completo del file da generare\/leggere; Il salvataggio avviene automaticamente sul file precedente, se presente, senza richiesta di conferma;<\/p>\n<p><em>PARAM_LIST<\/em> \u00e8 una classe d&#8217;uso generale, ed il fatto che sia derivata da <span style=\"color: #800000;\"><em>TAG<\/em><\/span>\u00a0 fa\u00a0intuire che la stessa sia usata anche per salvare configurazioni all&#8217;interno di altri file (ad esempio \u00e8 usata nella classe <em><span style=\"color: #800000;\">DOCUMENT<\/span><\/em> per salvare informazioni sul trattamento di uno specifico documento).<\/p>\n<!--nextpage-->\n<p>Le configurazioni utente contengono tutte le informazioni usate da un utilizzatore del software, e sono salvate in un file non visibile dall&#8217;utente; il modo migliore per gestire i parametri utente \u00e8 quello di usare le macro\u00a0\u00a0<em><span style=\"color: #800000;\">_$user_cfg<\/span><\/em> e\u00a0<span style=\"color: #800000;\"><em>_$close_user_cfg<\/em><\/span>.<\/p>\n<p><strong><em><span style=\"color: #800000;\">_$user_cfg<\/span> <\/em><\/strong>accede direttamente alla PARAM_LIST di configurazione utente<\/p>\n<p><strong><span style=\"color: #800000;\">_$<\/span><\/strong><em><strong><span style=\"color: #800000;\"><strong>clos<\/strong>e_user_cfg<\/span><\/strong><\/em> salva automaticamente la configurazione utente su disco;<\/p>\n<p>Di seguito si riporta un frammento di codice che permette di estrarre e scrivere alcuni parametri utente<\/p>\n<pre class=\"lang:default decode:true\">static void put_config(CLASS_STR)\r\n{\r\n\t_$user_cfg-&gt;Put(p_img_output, _$str-&gt;img_type);\r\n\t_$user_cfg-&gt;Put(p_imap_pixels, _$str-&gt;img_pixel);\r\n\t_$close_user_cfg\r\n}\r\n\r\nstatic void get_config(CLASS_STR)\r\n{\r\n\t_$user_cfg-&gt;Get(p_img_output, &amp;_$str-&gt;img_type);\r\n\t_$user_cfg-&gt;Get(p_imap_pixels, &amp;_$str-&gt;img_pixel);\r\n\t_$close_user_cfg\r\n}\r\n<\/pre>\n<p>Nel frammento di codice sono riportate due funzioni che ricevono la struttura nascosta di una classe; nella struttura sono presenti due campi int\u00a0img_type e int\u00a0img_pixel; la funzione <span style=\"color: #800000;\"><em>Put_config<\/em><\/span> scrive i due parametri nella configurazione utente; la funzione <em><span style=\"color: #800000;\">Get_config<\/span><\/em> invece li recupera.<\/p>\n<p>In entrambi i casi l&#8217;ultima riga contiene la macro _$<span style=\"color: #800000;\"><em>close_user_cfg<\/em><\/span> che salva su disco la configurazione, nel caso sia stata modificata, altrimenti non fa nulla;<\/p>\n<p><!--nextpage-->La classe pu\u00f2 essere salvata sul sito ftp ( il sito deve essere configurato nel software) attraverso le due funzioni<\/p>\n<p>bool Publish(STRING fname, STRING remote_dir);<\/p>\n<p>bool GetFtp(STRING fname, STRING remote_dir);<\/p>\n<p>Publish salva su un file remoto (fname nella directory\u00a0remote_dir);\u00a0 GetFtp richiama il contenuto della classe dal file fname; Le due funzioni possono quindi essere usate per condividere parametri da parte di utenze residenti non sulla stessa rete locale.<\/p>\n<p>Attualmente le due funzioni sono usate per trasferire messaggi fra utenti diversi registrati ed abilitati a ricevere messaggi e oggetti (file, ed altri dati) da altri utenti non necessariamente residenti sulla stessa rete.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il framework di Colibri contiene alcune classi per la configurazione dell&#8217;ambiente software; una di queste, PARAMLIST, viene presentata in questo articolo. PARAM_LIST \u00e8 utilizzata per salvare e richiamare parametri di configurazione del software: ad esempio, per conservare le informazioni sull&#8217;ultima directory usata&#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":[2,19],"tags":[],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-Wh","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3613"}],"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=3613"}],"version-history":[{"count":14,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3613\/revisions"}],"predecessor-version":[{"id":3627,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/3613\/revisions\/3627"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=3613"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=3613"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=3613"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}