Dialog with tabs and pull down menu

From Vectorlab
Jump to: navigation, search
Underconstruction.png
This vcor page is currently under construction.

By: orso. Last edit: 2015.12.20 (YYYY.MM.DD)

In the category:Under construction you'll find a list of all pages currently marked as under construction.

Tab example 2 - Dialog with 3 tabs and a popup menu outside the tabs. Whenever you click a button, the popup will load your action as history. After a certain number of actions, the script will insult you. This example is also valid for VW before 12, when retriving the user's tab position was not handled by VS routines. By Orso

{
2007 Orso B. Schmid@vcor.net
A dialog with 3 tabs and a pull down menu
}

PROCEDURE DialogWithTabsAndPullDownMenus;
CONST
	{ 
	manage dialog items IDs.
	sorting the items according to the location
	helps managing them.
	The numbering must be unique (an ID) for every item.
	}
	cTabControl = 9; { the control for all tabs }
	
	cTab1 = 10; { tab 1 }
		cButTab1_1 = 11;
		cButTab1_2 = 12;
		cButTab1_3 = 13;
	
	cTab2 = 20; { tab 2 }
		cButTab2_1 = 21;
		cButTab2_2 = 22;
		cButTab2_3 = 23;
	
	cTab3 = 30; { tab 3 }
		cButTab3_1 = 31;
		cButTab3_2 = 32;
		cButTab3_3 = 33;
	
	cSt	= 40;	{ static text: explanation for the pull down menu }
	cPull = 41;	{ the pull down menu }
	
	
VAR
	{ here global variables valid for the whole script, they are prefixed with "g" }
	g_dID, g_dResult  : LONGINT;
	g_tabLoc, g_howInsane : INTEGER;
	
	{ some sort of constructor, workaround for lack of obj oriented programming in VS }
	{ 2007 Orso B. Schmid@vcor.net }
	FUNCTION inc(VAR n : INTEGER): INTEGER;
		BEGIN
			n := n + 1;
			inc := n;
		END;
	
	
	{ set up the dialog display }
	FUNCTION Define_Dialog: LONGINT;
		VAR 
			dID : LONGINT;
		
		BEGIN
			dID := CreateLayout('Tab Control Dialog', false, 'OK', 'Cancel');
		
		
			{ Tab Group 1 }
			CreateGroupBox(dID, cTab1, 'Tab 1', FALSE);
		
			CreatePushButton(dID, cButTab1_1, 'Button 1');
			SetFirstGroupItem(dID, cTab1, cButTab1_1);
		
			CreatePushButton(dID, cButTab1_2, 'Button 2');
			SetBelowItem(dID, cButTab1_1, cButTab1_2, 0, 0);
		
			CreatePushButton(dID, cButTab1_3, 'Button 3');
			SetBelowItem(dID, cButTab1_2, cButTab1_3, 0, 0);
		
		
			{ Tab Group 2 }
			CreateGroupBox(dID, cTab2, 'Tab 2', FALSE);
		
			CreatePushButton(dID, cButTab2_1, 'Button 1');
			SetFirstGroupItem(dID, cTab2, cButTab2_1);
		
			CreatePushButton(dID, cButTab2_2, 'Button 2');
			SetRightItem(dID, cButTab2_1, cButTab2_2, 0, 0);
		
			CreatePushButton(dID, cButTab2_3, 'Button 3');
			SetRightItem(dID, cButTab2_2, cButTab2_3, 0, 0);
		
		
			{ Tab Group 3 }
			CreateGroupBox(dID, cTab3, 'Tab 3', FALSE);
		
			CreatePushButton(dID, cButTab3_1, 'Button 1');
			SetFirstGroupItem(dID, cTab3, cButTab3_1);
		
			CreatePushButton(dID, cButTab3_2, 'Button 2');
			SetRightItem(dID, cButTab3_1, cButTab3_2, 0, 0);
		
			CreatePushButton(dID, cButTab3_3, 'Button 3');
			SetBelowItem(dID, cButTab3_1, cButTab3_3, 0, 0);
		
			{ Create tab control }
			CreateTabControl(dID, cTabControl);
			SetFirstLayoutItem(dID, cTabControl);
			
			CreateStaticText(dID, cSt, 'below the history of your actions, click on the pull down menu to view it:', 35);
			SetBelowItem(dID, cTabControl, cSt, 0, 0);
			
			CreatePullDownMenu(dId, cPull, 36);
			SetBelowItem(dID, cSt, cPull, 0, 0);
		
			{ Add the tab panes to tab control }
			CreateTabPane(dID, cTabControl, cTab1);
			CreateTabPane(dID, cTabControl, cTab2);
			CreateTabPane(dID, cTabControl, cTab3);
		
			 { return the dialog ID }
			Define_Dialog := dID;
		END;
		
		
	{ this is the engine for the dialog }
	PROCEDURE Drive_Dialog(VAR item: LONGINT; data: LONGINT);
		{ 
		item is a number representing an event:
		if a user, for example, clicks on button 1 of tab 1, this will set the 
		item to cButTab1_1, which we defined at the beginning with the constant 11
		
		if the user clicks the button 2 of tab 3, this will set the 
		item to cButTab2_3, which we defined at the beginning with the constant 23.
		
		if the user clicks on OK, this will set the
		item to 1.
		
		if the user clicks on ESC, this will set the
		item to 2.
		
		if the item number is set during the dialog to -1
		the dialog will break, see below how this works.
		
		When the dialog exits (it cannot exit with -1) the item will pass to 
		g_dResult := RunLayoutDialog(g_dID, Drive_Dialog);
		
		g_dResult is the last value: it can be only 1 or 2.
		}
		
		{ This will set the action to be executed by clicking the buttons
		and set the global value g_tabLoc, needed for actions that occur AFTER THE DIALOG QUITS

		on VW before 12.00 you don't know in which tab your user is.
		As workaround every button sets a var with the tab number.
		If the user does not click a button the number remains set to 0.
		}
		PROCEDURE action(whichButton, whichTab: INTEGER);
				
			{ loads a pull down menu with some string value }
			PROCEDURE PullLoader(whichPull: INTEGER; whatString: STRING);
				VAR
					nChoices : INTEGER;
					
				BEGIN
					nChoices := numChoices(whichPull); { count how many choices are already loaden }
					{ SetPref(12348, false); }
					{ 
					KevinMoore 2001: this turns off dialog refreshing, in this particular case is not needed,
					but should you wish to load the popup with LOTs of values, you better use it
					}
					
					IF nChoices >= 5 THEN BEGIN
						alrtDialog('That is insane. I refuse to go ahead!');
						IF nChoices = 5 THEN
							InsertChoice(whichPull, nChoices, concat('I refused to go ahead ', inc(g_howInsane), ' time.'))
							{ We insert a last value at the end of the list }
						ELSE BEGIN
							DelChoice(whichPull, nChoices-1);
							InsertChoice(whichPull, nChoices, concat('I refused to go ahead ', inc(g_howInsane), ' times.')); 
							{ insertChoice always insert between, do not overwrite values, so I am bound to delete the last choice }
						END;

						
					END ELSE
						InsertChoice(whichPull, nChoices, whatString); { load a pull menu with some string }
						{ 
						pull down menus need index 0-based. 
						We read up the amount of values already stored there with numChoices
						Since we know we loaded already at least one value, '<no history yet>',
						we can be sure not to make an error. The pull menu will load at the next position.
						}
					
					{ SetPref(12348, true); }
					selChoice(whichPull, nChoices, true); { select the last choice }
				END;
			
			{ main of "Action" }
			BEGIN
				g_tabLoc := whichTab;
				PullLoader(cPull, concat('You pressed button ', whichButton, ', tab ', g_tabLoc));
			END;

		BEGIN
			CASE item OF
				SetupDialogC:
					BEGIN
						{ initialize some values }
						g_tabLoc := 0;

						{ initialize the pull down menu }
						InsertChoice(cPull, 0, '<no history yet>');
					END;

					
				{ these will be called when in Tab 1 }
				cButTab1_1: 
					action(1, 1); 
					{ the first value is the button clicked, the second sets the global var g_tabLoc }
					
				cButTab1_2:
					action(2, 1);
					
				cButTab1_3:
					action(3, 1);
				
				
				{ these will be called when in Tab 2 }
				cButTab2_1:
					action(1, 2);
					
				cButTab2_2:
					action(2, 2);
					
				cButTab2_3:
					action(3, 2);
					
					
				{ these will be called when in Tab 3 }
				cButTab3_1:
					action(1, 3);
					
				cButTab3_2:
					action(2, 3);
					
				cButTab3_3:
					action(3, 3);
				
				{ this happens if user clicks on OK and is executed JUST BEFORE leaving the dialog }
				1:
					CASE g_tabLoc OF
					0: 	BEGIN
							alrtDialog('Come on! You should click something!');
							IF YNdialog('Do you want to give it a try?') THEN
								item := -1; 
								{ BREAK THE DIALOG - give the user a chance to retry }
						END;
					1, 2:	alrtDialog(concat('You are about to quit the dialog from tab ', g_tabLoc));
					OTHERWISE
						
						alrtDialog('You proved to be insane!');
					END;
			END;
		END;


	{ 
	this is executed when the dialog exits because you pressed OK
	AFTER the dialog quits
	}
	PROCEDURE DoSomething;
		CONST
			br = chr(13);
		VAR
			complaint : STRING;
			
		BEGIN
			complaint :=  concat('That wasn', chr(39), 't much of a dialog, was it?');
			
			IF g_howInsane > 0 THEN
				complaint := concat('You drove me crazy. Clicking those buttons ', g_howInsane + 4, ' times!');
				
			IF YNDialog(concat('Now you quitted the dialog.', br, br, complaint, chr(13), br, 'Perhaps go ahead to the next dialog example: DialogWithSwaps')) THEN
				alrtDialog('Congratulation, you really wish to learn this damn thing!');
		END;
		
	PROCEDURE DoSomethingElse;
		BEGIN
			AlrtDialog('Not very engaged....');
		END;
 	
{ ******** MAIN ******** }
BEGIN
	
	g_dID := Define_Dialog;
			
	IF VerifyLayout(g_dID) THEN BEGIN
		g_howInsane := 0;
		g_dResult := RunLayoutDialog(g_dID, Drive_Dialog);

		IF (g_dResult = 2) THEN
			alrtdialog('You canceled')
		ELSE 
			IF g_tabLoc > 0 THEN
				DoSomething
			ELSE
				DoSomethingElse;
	END;
END;
RUN(DialogWithTabsAndPullDownMenus);