FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister   ProfileProfile   Log inLog in 


My dialog tricks

Post new topic   Reply to topic    discuss.visual-prolog.com Forum Index -> Visual Prolog Tips & Samples
View previous topic :: View next topic  
Author Message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 4 Oct 2010 7:52    Post subject: My dialog tricks Reply with quote

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


ifdef use_dlgpack
  include "dialog\\dialog.pre"
  include "mydialog.pre"
enddef

and VPITOOL.PRO, respectively.


ifdef use_dlgpack
  include "dialog\\dialog.pro"
  include "mydialog.pro"
enddef

Declarations are in mydialog.pre:


   % 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:


% 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


/*****************************************************************************
 % @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

/*****************************************************************************
 % @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


_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Remuar




Joined: 02 Dec 2012
Posts: 28

PostPosted: 17 Dec 2012 18:03    Post subject: Reply with quote

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
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 18 Dec 2012 12:28    Post subject: Test of my dialog tricks Reply with quote

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.

_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 22 Dec 2012 11:59    Post subject: Excerpt showing the usage of my dialog tricks Reply with quote

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.



Report window.png
 Description:
Report form with synchronized list boxed
 Filesize:  46.31 KB
 Viewed:  4652 Time(s)

Report window.png



myDialogTricks.zip
 Description:
Usage of my dialog tricks. Excerpt from my program Solution of Alphametic Puzzles

Download
 Filename:  myDialogTricks.zip
 Filesize:  20.31 KB
 Downloaded:  426 Time(s)


_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Remuar




Joined: 02 Dec 2012
Posts: 28

PostPosted: 27 Dec 2012 15:11    Post subject: Reply with quote

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?
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 28 Dec 2012 18:55    Post subject: Go back to 7.2 Reply with quote

Remuar,
Go back to 7.2.
Try to find out from the

pfc

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

_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 29 Dec 2012 8:09    Post subject: Ask the gurus in the main forum Reply with quote

Quote:
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

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.

_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 29 Dec 2012 16:15    Post subject: Look at my upgraded dialog tricks Reply with quote

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
_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Thomas Linder Puls



Copenhagen, Denmark
Joined: 28 Feb 2000
Posts: 3093

PostPosted: 29 Dec 2012 17:01    Post subject: Reply with quote

Here it is updated it to 7.4 (without a fine slide show Wink).


dialogtricksdemo.zip
 Description:
Tricks Dialog 7.4

Download
 Filename:  dialogtricksdemo.zip
 Filesize:  42.94 KB
 Downloaded:  447 Time(s)


_________________
Regards Thomas Linder Puls
Prolog Development Center
Back to top
View user's profile Send private message
Remuar




Joined: 02 Dec 2012
Posts: 28

PostPosted: 29 Dec 2012 20:31    Post subject: Reply with quote

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
Quote:
simply pfc\vpi\vpi.ph

give so much error I hat to abandon
Back to top
View user's profile Send private message
Ferenc Nagy



Hungary
Joined: 24 Apr 2007
Posts: 378

PostPosted: 30 Dec 2012 8:17    Post subject: A suggested last minute change Reply with quote

Remuar,
I hope that you understand the slide show and I need not to make another example form where

  % 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.
Quote:
MyDialogTricks.cl

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

Quote:
MyDialogTricks.pro

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)).




pick 002.png
 Description:
Differences found by the Total Commander.
 Filesize:  3.34 KB
 Viewed:  4500 Time(s)

pick 002.png



_________________
TIA, Regards,
Frank Nagy
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    discuss.visual-prolog.com Forum Index -> Visual Prolog Tips & Samples All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum