Page 1 of 1

My dialog tricks

Posted: 4 Oct 2010 7:52
by Ferenc Nagy
Hi,

It's the time not only to ask something but to publish some tricks about dialog handling.
1. Validation of strings by length [after trimming] and allowed characters.
2. Comparison of two string which should contain V2>=V1 integer values.
3. Easy hangling of DIALOG_INTS e.g. in dialog_..._update procedures.
4. Usage of synchronized list boxed instead of grids or columns separated by tabulators.
4. a) Optional Integer control to enhance navigation.
5. Move selection in one or more list boxes based on an integer control.
6. Display explanation of the control in focus in the status line.

Usage:
Insert include statements into VIPTOOLS.PRE

Code: Select all

ifdef use_dlgpack   include "dialog\\dialog.pre"   include "mydialog.pre" enddef
and VPITOOL.PRO, respectively.

Code: Select all

ifdef use_dlgpack   include "dialog\\dialog.pro"   include "mydialog.pro" enddef
Declarations are in mydialog.pre:

Code: Select all

        % 30.4.2007 % **** Extensions to dialog pack **** GLOBAL PREDICATES                 trim_validate_str(STRING Input, STRING Corrected, INTEGER Min_Length, INTEGER Max_Length, char Lowest_Allowed, char Highest_Allowed, string Error_Message)                 -(       i    ,        o        ,         i         ,         i         ,      i             ,      i              ,        i            ) my_validate_str(STRING Corrected, INTEGER Min_Length, INTEGER Max_Length, char Lowest_Allowed, char Highest_Allowed, string Error_Message)               -(       i        ,         i         ,         i         ,      i             ,      i              ,        i            ) change_case(STRING Input, STRING Corrected, char Lowest_Allowed, char Highest_Allowed)           -(       i    ,        o        ,      i             ,      i              ) prohibited_char(STRING Entry, char Lowest_Allowed, char Highest_Allowed)   my_compare_int(STRING S1, STRING S2, dialog_int V1, dialog_int V2, string Error_Message)              -(       i ,        i ,            o ,            o ,        i            )                 procedure INTEGER my_dialog_GetInt(WINDOW,DIALOG_CONTROL_ID)   procedure INTEGER my_dialog_VLGetInt(DIALOG_CONTROL_ID,DIALOG_VAL_LIST)
Clauses are in mydialog.pro:

Code: Select all

% 30.4.2007 % **** Extensions to dialog pack **** CLAUSES   trim_validate_str(S, C, Min_Length, Max_Length, Lowest_Allowed, Highest_Allowed, Error_Message) if         fronttoken(S,Token,RestString),         concat(Token,RestString,F),         searchchar(F,' ',FoundPos),         Length=FoundPos-1,         frontstr(Length,F,K,_),         change_case(K, C, Lowest_Allowed, Highest_Allowed),         my_validate_str(C, Min_Length, Max_Length, Lowest_Allowed, Highest_Allowed, Error_Message).   change_case(S, C, _, Highest_Allowed) if         Highest_Allowed<='Z',         !,         upper_lower(S,C). change_case(S, C, Lowest_Allowed, Highest_Allowed) if         Lowest_Allowed>='a',         Highest_Allowed<='z',         !,         upper_lower(C,S). change_case(S, S, _, _).         my_validate_str(S, Min_Length, _, _, _, Error_Message) if         str_len(S,Length),         Length<Min_length,         dlg_Error("Too Short Entry", Error_Message),         fail. my_validate_str(S, _, Max_Length, _, _, Error_Message) if         str_len(S,Length),         Length>Max_length,         dlg_Error("Too Long Entry", Error_Message),         fail. my_validate_str(S, _, _, Lowest_Allowed, Highest_Allowed, Error_Message) if         prohibited_char(S, Lowest_Allowed, Highest_Allowed),         !,         dlg_Error("Invalid Characters", Error_Message),         fail. my_validate_str(_, _, _, _, _, _).   prohibited_char(Entry, Lowest_Allowed, _) if         frontchar(Entry,FrontChar,_),         Frontchar<Lowest_Allowed,         !. prohibited_char(Entry, _, Highest_Allowed) if         frontchar(Entry,FrontChar,_),         Frontchar>Highest_Allowed,         !. prohibited_char(Entry, Lowest_Allowed, Highest_Allowed) if         frontchar(Entry,_,RestString),         !,         prohibited_char(RestString, Lowest_Allowed, Highest_Allowed).         my_compare_int(S1, S2, _, _, Error_Message) if         str_int(S1,V1),         str_int(S2,V2),         V2<V1,         !,         dlg_Error("Invalid Values", Error_Message),         fail. my_compare_int(S1, S2, K1, K2, _) if         str_int(S1,V1),         str_int(S2,V2),         V2>=V1,         K1=i(V1),         K2=i(V2),         !. my_compare_int(S1, S2, void, void, _) if         not(str_int(S1,_)),         not(str_int(S2,_)),         !. my_compare_int(S1, S2, void, K2, _) if         not(str_int(S1,_)),         str_int(S2,V2),         K2=i(V2),         !. my_compare_int(S1, S2, K1, void, _) if         not(str_int(S2,_)),         str_int(S1,V1),         K1=i(V1),         !.   my_dialog_GetInt (WINDOW,DIALOG_CONTROL_ID,I) if V = dialog_GetInt (WINDOW,DIALOG_CONTROL_ID), V=i(I).   my_dialog_VLGetInt (DIALOG_CONTROL_ID,DIALOG_VAL_LIST,I) if V = dialog_VLGetInt (DIALOG_CONTROL_ID,DIALOG_VAL_LIST), V=i(I).
The above were written in version 5. The following tricks are in version 7.
myDialogTricks.cl

Code: Select all

/*****************************************************************************  % @Project:  SOAP  % @File name: myDialogTricks.cl  % @Written by: Copyright (c) Budapest, Hungary 2009 Ferenc Nagy PhD.  % @short My dialog tricks.  % @detail Typical dialog handling tricks for the project.  % @end ******************************************************************************/     class myDialogTricks     open core   domains     listBox_list = listbox*.   predicates     classInfo : core::classInfo.     % @short Class information  predicate.     % @detail This predicate represents information predicate of this class.     % @end   predicates     % Synchronize selection in two or more list boxes.     synchronizeListBoxes:(listBox Changed, listbox_list Followers, positive Index) procedure (i,i,o).       % Synchronize selection in two or more list boxes and the selection index in an integer control.     synchronizeListBoxesandInteger:(listBox Changed, listbox_list Followers, integercontrol) procedure (i,i,i).       % Move selection in one or more list boxes based on an integer control.     moveSelection:(integercontrol, listbox_list Followers) procedure (i,i).       % Fill rows of synchronized list boxes with list of strings.     fillListBoxes:(listbox_list Synchronized, core::string_list) procedure (i,i).       % Fill rows of synchronized list boxes with list of strings and     % change the count of found and index of selected rows.     fillListBoxesand2Integers:(listbox_list Synchronized, core::string_list, integercontrol Found, integercontrol Selected) procedure (i,i,i,i).       % Copy selected line of the list box to the status line.     copySelectedToStatusLine:(listBox LBox, vpiDomains::menuTag StatusField) determ (i,i).       % Initialize status line.     initializeStatusLine:(string Text, vpiDomains::menuTag StatusField) procedure (i,i).       % Display explanation of the control in focus in the status line.     explainInStatusLine:(string Dialog, string Control, string Explanation) procedure (i,i,i).   end class myDialogTricks
The clauses - myDialogTricks.pro

Code: Select all

/*****************************************************************************  % @Project:  SOAP  % @File name: myDialogTricks.pro  % @Written by: Copyright (c) Budapest, Hungary 2009 Ferenc Nagy PhD.  % @short My dialog tricks.  % @detail Typical dialog handling tricks for the project.  % @end ******************************************************************************/       implement myDialogTricks     open core   constants     className = "com/visual-prolog/myDialogTricks/myDialogTricks".     classVersion = "$JustDate: $$Revision: $".   clauses     classInfo(className, classVersion).         % Synchronize selection in two or more list boxes.     synchronizeListBoxes(Changed, Followers, Index) :-         Index=Changed:tryGetSelectedIndex(),         foreach Elem = list::getMember_nd(Followers) do             Elem:selectAt(Index, true)         end foreach,         !.     synchronizeListBoxes(_, _,0).       % Synchronize selection in two or more list boxes and the selection index in an integer control.     synchronizeListBoxesandInteger(Changed, Followers, Ictl) :-         synchronizeListBoxes(Changed, Followers, Index),         Index1=Index+1,         Ictl:setInteger(Index1).         % Move selection in one or more list boxes based on an integer control.     moveSelection(IntegerControl, Followers) :-         Index=IntegerControl:getInteger()-1,         foreach Elem = list::getMember_nd(Followers) do             Elem:selectAt(Index, true)         end foreach.       % Fill rows of synchronized list boxes with list of strings.     fillListBoxes([ ],  _) :- !.     fillListBoxes( _ , [ ]) :- !.     fillListBoxes([Lbox1|RestSynchronized], [Head|Tail]) :-         Lbox1:add(Head),         fillListBoxes(RestSynchronized, Tail).     % Fill rows of synchronized list boxes with list of strings and     % change the count of found and index of selected rows.     fillListBoxesand2Integers([Lbox1|RestSynchronized], String_List, Found, Selected) :-         fillListBoxes([Lbox1|RestSynchronized], String_List),         Found:setInteger(LBox1:getCount()),         Selected:setInteger(1),         !.    fillListBoxesand2Integers(_, _, _, _).      % Copy selected line of the list box to the status line.    copySelectedToStatusLine(LBox, StatusField) :-        [Sel1|_]=LBox:getSelectedItems(),        Task = vpi::getTaskWindow(),        vpiToolbar::setValue(Task, StatusField, vpitoolbar::text_value(Sel1)).       % Initialize status line.     initializeStatusLine(Text, StatusField) :-         Task = vpi::getTaskWindow(),         vpiToolbar::setValue(Task, StatusField, vpitoolbar::text_value(Text)).       % Display explanation of the control in focus in the status line.     explainInStatusLine(Dialog, Control, Explanation) :-         Task = vpi::getTaskWindow(),         DC=string::format("% %",Dialog,Control),         vpiToolbar::setValue(Task, resourceIdentifiers::idt_1, vpitoolbar::text_value(DC)),         vpiToolbar::setValue(Task, resourceIdentifiers::idt_help_line,vpitoolbar::text_value(Explanation)).       end implement myDialogTricks

Posted: 17 Dec 2012 18:03
by Remuar
Hello Frank,

I start to go through the labyrinth of ViP and found your post interesting so I tryed to make it work, but no surprise, some infos are missing for a beginner like me....
Have you some hints how to test your "tricks"

thank's

Test of my dialog tricks

Posted: 18 Dec 2012 12:28
by Ferenc Nagy
Hi,
Suppose you have a table of data of N entries and 3 fields for each entries.
Yo can populate a list box control of N choices from the first fields, another list box of N choices from the second fields, and a third list box control from the third field. Suppose that data in the first field are strings having maximal length of 10 characters but the second a third fields may contain 50 characters.
You can scroll horizontally the second and the third list box. Anyway the code is much simpler than the grid example.
Make a dialog with the above three list boxes, three input boxes, an [Add], a [Delete], a [Modify] buttons.

Excerpt showing the usage of my dialog tricks

Posted: 22 Dec 2012 11:59
by Ferenc Nagy
Hello Remuar,

I send you forms toolbars and modules from my program Solution of Alphametic Puzzles.
http://wiki.visual-prolog.com/index.php?title=3rd:SOAP
I hope this helps.

Posted: 27 Dec 2012 15:11
by Remuar
Hi Ferenc,

Thank's for your response but trying to build it (in 7.3 or 7.4) I got

error c100 : The file 'pfc\vpi\vpidialog\vpidialog.ph' is not found

so seems there is a lost file... do you know where to find it?

Go back to 7.2

Posted: 28 Dec 2012 18:55
by Ferenc Nagy
Remuar,
Go back to 7.2.
Try to find out from the

Code: Select all

pfc
folder of version 7.2 where it is.
Try to copy it to 7.3 or 7.4.
Report me the result.

Ask the gurus in the main forum

Posted: 29 Dec 2012 8:09
by Ferenc Nagy
Thank's for your response but trying to build it (in 7.3 or 7.4) I got

error c100 : The file 'pfc\vpi\vpidialog\vpidialog.ph' is not found
Remuar,
1. Forget my previous answer.
2. Try

Code: Select all

simply pfc\vpi\vpi.ph
.
3. Ask the gurus on the main Visual Prolog Forum. I regret that the library of7.4 PE is truncated compared to 7.2 but dialog ought not to be omitted.

Look at my upgraded dialog tricks

Posted: 29 Dec 2012 16:15
by Ferenc Nagy
I have upgraded my dialog tricks to 7.3. I wrote a test project and a slideshow showing the steps what I have done. http://franknagy.atw.hu/Tipp/dialogtricksdemo.zip

Posted: 29 Dec 2012 17:01
by Thomas Linder Puls
Here it is updated it to 7.4 (without a fine slide show ;-)).

Posted: 29 Dec 2012 20:31
by Remuar
Thank's Ferenc & Thomas,

But by now what i get as nothing todo with ur post from 22 Dec 2012 11:59

There is only one test "Kinks" I will investigate further tomorow...

good night

PS: your sugestion with
simply pfc\vpi\vpi.ph
give so much error I hat to abandon

A suggested last minute change

Posted: 30 Dec 2012 8:17
by Ferenc Nagy
Remuar,
I hope that you understand the slide show and I need not to make another example form where

Code: Select all

  % Synchronize selection in two or more list boxes and the selection index in an integer control.     synchronizeListBoxesandInteger:(listBox Changed, listbox_list Followers, integercontrol) procedure (i,i,i).
is demonstrated.
I have worked enough on this demo. It is your turn to add the corresponding sultans of your country in a fourth list box and write an (n+1)th procedure which displays their picture and CV.
Don't forget to publish here your results.
....
Thomas,
I do not see to much differences within the program. OK.
A suggested last minute change
Let the font name and size not constants from task window but parameters of the redefineMessages procedure.
MyDialogTricks.cl

Code: Select all

predicates % [Re]Define Messages window. redefineMessages:(string FontName, positive Fontsize, positive Num_Msg_Lines) procedure (i,i,i).
MyDialogTricks.pro

Code: Select all

clauses     classInfo(className, classVersion). % This is the header of the implementation. % [Re]Define Messages window. redefineMessages(FontName,FontSize,Num_Msg_Lines) :-     TaskWindow=applicationWindow::get(),     MessageForm = messageForm::display(TaskWindow),     MessageForm:setVerticalSize(messageForm::parentRelative(1.0)),     MessageControl = MessageForm:getMessageControl(),     MessageControl:setLines(Num_Msg_Lines),     MessageControl:setFont(vpi::fontCreateByName(FontName, FontSize)).