home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
SORTWKS.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
7KB
|
237 lines
{***************************************************}
{* Proc SortWorksheet by Frank Brault *}
{* Deihl Graphsoft, Inc. ⌐ 1995 *}
{***************************************************}
PROCEDURE SortWorksheet;
LABEL 1;
CONST
kWorksheetName='Edit this!';
kMaxCols = 4094;
kMaxArray = 20;
VAR
WH: HANDLE;
str,worksheetName : STRING;
first,largest,current : INTEGER;
numRows,numFlds,sortCol,doFirstRow: INTEGER;
item, x1, x2, lenCheck, blankCell : INTEGER;
TA,TD,NA,ND : BOOLEAN;
cancel,finished,test : BOOLEAN;
PROCEDURE switch(VAR first,second:INTEGER);
VAR
temporary:ARRAY[1..kMaxArray] OF STRING;
i : INTEGER;
BEGIN
{** Exchanges row first and row second in worksheet}
FOR i:=1 TO numFlds DO BEGIN
temporary[i]:=GETCELLSTR(WH,first,i);
LOADCELL(first,i,GETCELLSTR(WH,second,i));
LOADCELL(second,i,temporary[i]);
END;
END;
PROCEDURE CenterDialog(dX1,dX2 : INTEGER; VAR x1,x2 : INTEGER);
VAR
scrX1,scrY1,scrX2,scrY2,w : INTEGER;
BEGIN
{** calculates horizontal center for dialog}
GetScreen(scrX1,scrY1,scrX2,scrY2);
w := dX2 - dX1;
x1 := ((scrX1 + scrX2) DIV 2) - (w DIV 2);
x2 := x1 + w;
END;
PROCEDURE Toggle(first,second : INTEGER);
BEGIN
{** Toggles dialog radio btn prs}
SetItem(first,TRUE);
SetItem(second,FALSE);
END;
FUNCTION ValidColNum(s1 : STRING; VAR colNum : INTEGER) : BOOLEAN;
VAR
i,n,o : INTEGER;
s2 : STRING;
test : BOOLEAN;
value : REAL;
BEGIN
{** Returns true if s1 is valid column letter or number}
test:= ValidNumStr(s1,value);
IF test THEN n:= value
ELSE BEGIN
n:= 0;
FOR i:= 1 TO LEN(s1) DO BEGIN
s2:=COPY(s1,i,1);
o:= ORD(s2);
{** If lower case then convert to upper case}
IF ((96 < o) AND (o < 123)) THEN o:= o - 32;
n:= (26 * n) + (o - 64);
END;
END;
{** If result is within range then function returns TRUE}
IF ((0 < n) AND (n < kMaxCols)) THEN BEGIN
colNum:= n;
ValidColNum:=TRUE;
END
ELSE ValidColNum:= FALSE;
END;
{******************* MAIN *******************}
BEGIN
PUSHATTRS;
{** Initialize dialog result variables}
doFirstRow:= 0;
TA:= FALSE;
TD:= FALSE;
NA:= FALSE;
ND:= FALSE;;
CENTERDIALOG(0,276,x1,x2);
BEGINDIALOG(1,1,x1,120,x2,395);
ADDBUTTON('OK',1,1,188,219,252,242);
ADDBUTTON('Cancel',2,1,108,219,172,242);
ADDFIELD('____________________________',3,1,15,24,256,42);
ADDFIELD('Sort rows in active worksheet.',4,1,23,17,249,35);
ADDFIELD('Sort by Column:',5,1,42,62,154,80);
ADDFIELD('',6,2,160,61,209,76);
ADDBUTTON('Don╒t sort first row.',7,2,35,169,198,187);
ADDBUTTON('Text',8,3,35,105,88,123);
ADDBUTTON('Numeric',9,3,35,129,116,147);
ADDBUTTON('Ascending',10,3,140,105,242,123);
ADDBUTTON('Descending',11,3,140,129,233,147);
ENDDIALOG;
GetDialog(1);
SetItem(7,TRUE);
SetItem(8,TRUE);
SetItem(10,TRUE);
finished := FALSE;
cancel:= FALSE;
REPEAT
DialogEvent(item);
IF item = 7 THEN SetItem(7,NOT(ItemSel(7)));
IF item = 8 THEN Toggle(8,9);
IF item = 9 THEN Toggle(9,8);
IF item = 10 THEN Toggle(10,11);
IF item = 11 THEN Toggle(11,10);
IF item = 2 THEN
BEGIN
finished := TRUE;
cancel := TRUE;
END;
IF item = 1 THEN BEGIN
{** Check for valid worksheet column}
test:=validColNum(GETFIELD(6),sortCol);
IF test THEN finished:=TRUE
ELSE BEGIN
SYSBEEP;
SelField(6);
END;
IF ItemSel(7) THEN doFirstRow:=1;
IF (ItemSel(8) AND ItemSel(10)) THEN TA:= TRUE;
IF (ItemSel(8) AND ItemSel(11)) THEN TD:= TRUE;
IF (ItemSel(9) AND ItemSel(10)) THEN NA:= TRUE;
IF (ItemSel(9) AND ItemSel(11)) THEN ND:= TRUE;
END;
UNTIL finished;
CLRDIALOG;
IF cancel THEN GOTO 1;
SETCURSOR(WATCHC);
{** Try active worksheet}
WH:=ActSSheet;
{** Try named worksheet CONST}
IF (WH=NIL) THEN WH:=GETOBJECT(kWorksheetName);
{** Try getting worksheet name from user}
IF (WH=NIL) THEN BEGIN
worksheetName:=STRDIALOG('Enter the name of the worksheet to be sorted.','Worksheet 1');
WH:=GETOBJECT(worksheetName);
END;
{** If no worksheet then punch out with dialog╔}
IF ((WH=NIL)|(GetType(WH)<>18)) THEN BEGIN
SYSBEEP;
ALRTDIALOG('I can╒t find a worksheet by that name.');
GOTO 1;
END;
SelectSS(WH);
SprdSize(WH,numRows,numFlds);
{** Check if array limit is big enough}
IF numFlds > kMaxArray THEN BEGIN
str:= CONCAT('Increase CONST kMaxArray to at least ',numFlds,'.');
ALRTDIALOG(str);
GOTO 1;
END;
{** Load 0 values into blank sort column cells so there is a numeric value to compare}
IF NA | ND THEN BEGIN
MESSAGE('One moment please╔');
blankCell := 0;
FOR first:=(1+doFirstRow) TO numRows DO BEGIN
lenCheck := LEN(GETCELLSTR(WH,first,sortCol));
IF lenCheck < 1 THEN BEGIN
LOADCELL(first,sortCol,'0');
blankCell := blankCell + 1;
END;
END;
END;
{** NA = Sort numeric ascending}
IF NA THEN BEGIN
FOR first:=(1+doFirstRow) TO numRows-1 DO BEGIN
largest:= first;
FOR current:=first TO numRows DO BEGIN
IF STR2NUM(GETCELLSTR(WH,current,sortCol)) < STR2NUM(GETCELLSTR(WH,largest,sortCol)) THEN largest:= current;
END;
switch(largest,first);
MESSAGE('Row ',first,' of ',numRows,' completed╔')
END;
{** Load blanks back into sort column cells}
FOR first:=(1+doFirstRow) TO (1+doFirstRow + blankCell-1) DO LOADCELL(first,sortCol,'');
END;
{** ND = Sort numeric descending}
IF ND THEN BEGIN
FOR first:=(1+doFirstRow) TO numRows-1 DO BEGIN
largest:= first;
FOR current:=first TO numRows DO BEGIN
IF STR2NUM(GETCELLSTR(WH,current,sortCol)) > STR2NUM(GETCELLSTR(WH,largest,sortCol)) THEN largest:= current;
END;
switch(largest,first);
MESSAGE('Row ',first,' of ',numRows,' completed╔')
END;
{** Load blanks back into sort column cells}
FOR first:= numRows DOWNTO (numRows - blankCell + 1) DO LOADCELL(first,sortCol,'');
END;
{** TA = Sort text ascending}
IF TA THEN BEGIN
FOR first:=(1+doFirstRow) TO numRows-1 DO BEGIN
largest:= first;
FOR current:=first TO numRows DO BEGIN
IF GETCELLSTR(WH,current,sortCol) < GETCELLSTR(WH,largest,sortCol) THEN largest:= current;
END;
switch(largest,first);
MESSAGE('Row ',first,' of ',numRows,' completed╔')
END;
END;
{** TD = Sort text descending}
IF TD THEN BEGIN
FOR first:=(1+doFirstRow) TO numRows-1 DO BEGIN
largest:= first;
FOR current:=first TO numRows DO BEGIN
IF GETCELLSTR(WH,current,sortCol) > GETCELLSTR(WH, largest, sortCol) THEN largest:= current;
END;
switch(largest,first);
MESSAGE('Row ',first,' of ',numRows,' completed╔')
END;
END;
1:POPATTRS;
CLRMESSAGE;
END; {of MAIN}
RUN(SortWorksheet);