home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
FINDTEXT.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
9KB
|
359 lines
{***************************************************}
{* Proc Find/Replace Text by Frank Brault *}
{* Deihl Graphsoft, Inc. ⌐ 1995 *}
{***************************************************}
{*Design Limits:
Target strings containing 255 characters or more are not searched.
Any wrapping accomplished manually by reshaping the handles of text blocks is not retained when a string is replaced.
Worksheet function replaces strings found in cells using default text formating. Does NOT search names.
Also, a SELECTED ONLY check box would be nice. *}
PROCEDURE ReplaceTxt;
LABEL 1,2;
VAR
h,i,layerHandleT : HANDLE;
Sr,x,y,strTooLongCount : REAL;
Oldstring,Newstring,Chkstring,Wrkstring1,Wrkstring2,Nchkstring : STRING;
S1,S2,S3,S4,Sn,CountStr,layerName : STRING;
indx1,lenold,lennew,lenwrk1,lenchk,lenrem, f,f1,f2,f3,tn,c,r,c1,r1,ca : INTEGER;
finished,cancel,te,db,ws,cs : BOOLEAN;
item,x1,x2,count,counter : INTEGER;
numOfNames,n1,objType : INTEGER;
nameStr : STRING;
PROCEDURE CenterDialog(dX1,dX2 : INTEGER; VAR x1,x2 : INTEGER);
VAR
scrX1,scrY1,scrX2,scrY2,w : INTEGER;
BEGIN
GetScreen(scrX1,scrY1,scrX2,scrY2);
w := dX2 - dX1;
x1 := ((scrX1 + scrX2) DIV 2) - (w DIV 2);
x2 := x1 + w;
END;
PROCEDURE Replace(VAR Oldstring,Newstring,Chkstring,Nchkstring: STRING;
VAR f,lenold,lennew,lenwrk1,count: INTEGER);
LABEL 3;
BEGIN
f := 0;
indx1 := POS(Oldstring,Chkstring);
IF (LEN(Chkstring) > 254) THEN BEGIN
strTooLongCount := strTooLongCount + 1;
indx1 := 0;
END;
IF Newstring = '' THEN
BEGIN
WHILE indx1 <> 0 DO
BEGIN
DELETE (Chkstring,indx1,lenold);
IF Chkstring = '' THEN
BEGIN
f := 1;
count := count + 1;
Nchkstring := '';
GOTO 3;
END;
indx1 := POS(Oldstring,Chkstring);
f := 1;
count := count + 1;
END;
Nchkstring := Chkstring;
GOTO 3;
END;
WHILE indx1 <> 0 DO
BEGIN
f3 := 0;
If f = 1 THEN
BEGIN
lennew := LEN(Newstring);
indx1 := indx1 + lenwrk1 + lennew;
END;
lenchk := LEN(Chkstring);
IF lenold = lenchk THEN Nchkstring := Newstring
ELSE
BEGIN
lenwrk1 := indx1 - 1;
DELETE(Chkstring,indx1,lenold);
IF indx1 = 1 THEN
BEGIN
f3 := 1;
Wrkstring2 := Chkstring;
Nchkstring := CONCAT(Newstring,Wrkstring2);
END
ELSE
BEGIN
Wrkstring1 := COPY(Chkstring,1,lenwrk1);
IF lenchk = indx1 + lenold -1 THEN
Nchkstring := CONCAT(Wrkstring1,Newstring)
ELSE
BEGIN
f3 := 1;
lenrem := lenchk - lenold - indx1 + 1;
Wrkstring2 := COPY(Chkstring,indx1,lenrem);
Nchkstring := CONCAT(Wrkstring1,Newstring,Wrkstring2);
END;
END;
END;
Chkstring := Nchkstring;
IF f3 = 1 THEN indx1 := POS(Oldstring,Wrkstring2) ELSE indx1 := 0;
f := 1;
count := count + 1;
END;
3:END;
PROCEDURE SearchRecords;
VAR
myS,recordName,fieldName,DBRef:STRING;
layerHandleR,handleToRecord,objectHandle:HANDLE;
myR:REAL;
i,j,k,l:INTEGER;
BEGIN
layerHandleR:= FLayer;
WHILE (layerHandleR<>NIL) DO BEGIN
objectHandle:= FInLayer(layerHandleR);
WHILE (objectHandle<>NIL) DO BEGIN
i := NumRecords(objectHandle);
IF (i>0) THEN BEGIN
FOR j := 1 to i DO BEGIN
handleToRecord := GetRecord(objectHandle,j);
recordName:= GetName(handleToRecord);
k := NumFields(handleToRecord);
FOR l := 1 to k DO BEGIN
myS := GetFldName(handleToRecord,l);
fieldName:= myS;
myR := GetFldType(handleToRecord,l);
myS := Num2Str(0,myR);
DBRef:=CONCAT('(''',recordName,'''.''',fieldName,''')');
myS:= EvalStr(ObjectHandle,DBRef);
Chkstring := myS;
f := 0;
Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count);
IF f = 1 THEN BEGIN
IF Nchkstring = '' THEN
SetRField(ObjectHandle,recordName,fieldName,'0')
ELSE SetRField(ObjectHandle,recordName,fieldName,Nchkstring);
END;
END; {of FOR l := 1 to k}
END; {of FOR j := 1 to i}
END; {of IF Statement}
objectHandle:= NextObj(objectHandle);
END; {of Objects in Layer LOOP}
layerHandleR:= NextLayer(layerHandleR);
END; {of Layer LOOP}
END; {of SearchRecords}
BEGIN
PUSHATTRS;
CenterDialog(0,450,x1,x2);
BeginDialog(1,1,x1,40,x2,262);
AddButton('Change All',1,1,316,190,398,210);
AddButton('Cancel',2,1,225,190,285,210);
AddField('_______________________',3,1,140,16,300,34);
AddField('Find and Replace Dialog',4,1,140,10,300,24);
AddField('Search where:',5,1,30,50,129,67);
AddField('Replace with:',6,1,209,114,303,132);
AddField('Find what:',7,1,209,50,282,67);
AddField('Search String...',8,2,211,74,406,90);
AddField('Replace String...',9,2,211,140,406,155);
AddButton('Text Objects',10,2,30,84,137,104);
AddButton('Record Fields',11,2,30,112,166,132);
AddButton('Worksheets',12,2,30,140,141,160);
EndDialog;
GetDialog(1);
SelField(8);
finished := FALSE;
cancel:= FALSE;
REPEAT DialogEvent(item);
IF item > 2 THEN BEGIN
IF item > 9 THEN SetItem(item,NOT(ITEMSEL(item)));
END
ELSE
BEGIN
IF item = 2 THEN
BEGIN
finished := TRUE;
cancel := TRUE;
GOTO 1;
END;
IF item = 1 THEN
BEGIN
IF NOT(ITEMSEL(10) OR ITEMSEL(11) OR ITEMSEL(12)) THEN
BEGIN
SYSBEEP;
FOR counter := 1 TO 4 DO
BEGIN
SetItem(10,NOT(ITEMSEL(10)));
SetItem(11,NOT(ITEMSEL(11)));
SetItem(12,NOT(ITEMSEL(12)));
WAIT(1);
END;
GOTO 1;
END;
IF Getfield(8) = 'Search String...' THEN
BEGIN
SYSBEEP;
SelField(8);
GOTO 1;
END;
IF Getfield(9) = 'Replace String...' THEN
BEGIN
SYSBEEP;
SelField(9);
GOTO 1;
END
ELSE finished := TRUE;
END;
1:END;
UNTIL finished;
Oldstring:=Getfield(8);
Newstring:=Getfield(9);
te:= ITEMSEL(10);
db:= ITEMSEL(11);
ws:= ITEMSEL(12);
CLRDIALOG;
IF cancel THEN GOTO 2;
SETCURSOR(WATCHC);
strTooLongCount:= 0;
lenold := LEN(Oldstring);
count := 0;
IF te THEN
BEGIN
DSelectObj(ALL);
SELECTOBJ(T=Text);
layerHandleT:= FLayer;
WHILE (layerHandleT <> NIL) DO BEGIN
layerName:= GetLName(layerHandleT);
Layer(layerName);
h := FSActLayer;
WHILE h <> NIL DO
BEGIN
f := 0;
Chkstring := GETTEXT(h);
Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count);
IF f = 1 THEN
BEGIN
IF Nchkstring = '' THEN
BEGIN
i := h;
h := NEXTSOBJ(h);
DSELECTOBJ(T=Text);
SETSELECT(i);
DELETEOBJS;
SELECTOBJ(T=Text);
END
ELSE
BEGIN
SETTEXT(h,Nchkstring);
h := NEXTSOBJ(h);
END;
END
ELSE h := NEXTSOBJ(h);
END;
layerHandleT:= NextLayer(layerHandleT);
END;
END;
DSelectObj(T=Text);;
IF db THEN SearchRecords;
IF ws THEN
BEGIN
CENTERDIALOG(0,320,x1,x2);
BEGINDIALOG(2,1,x1,190,x2,318);
ADDBUTTON('Use Default',1,1,197,81,292,104);
ADDBUTTON('Cancel',2,1,118,82,182,105);
ADDFIELD('Default formatting is used when strings',3,1,18,21,302,39);
ADDFIELD('are replaced in worksheet cells.',4,1,18,44,246,62);
ENDDIALOG;
GetDialog(2);
finished := FALSE;
cancel:= FALSE;
REPEAT DialogEvent(item);
IF item = 2 THEN
BEGIN
finished := TRUE;
cancel := TRUE;
END;
IF item = 1 THEN finished := TRUE;
UNTIL finished;
CLRDIALOG;
IF cancel THEN GOTO 2;
f2 := 0;
numOfNames:= NameNum;
FOR n1:= 1 TO numOfNames DO
BEGIN
nameStr:= NameList(n1);
h:= GetObject(nameStr);
objType:= GetType(h);
IF (objType = 18) THEN
BEGIN
f1 := 0;
{ Need a WSheetIsOpen Function !!!!!!!!!!!!!}
f2 := 1;
SelectSS(h);
SprdSize(h,r,c);
FOR r1 := 1 TO r DO
BEGIN
FOR c1 := 1 TO c DO
BEGIN
cs := CellHasStr(h,r1,c1);
f := 0;
IF cs THEN
BEGIN
Chkstring := GetCellStr(h,r1,c1);
Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count);
IF f = 1 THEN
BEGIN
f1 := 1;
ca := GetCAlign(h,r1,c1);
SprdAlign(ca);
{ Need a GetCellTxtFormat Function !!!!!!!!!!!!!}
{ Need a SetCellTxtFormat Function !!!!!!!!!!!!!}
LoadCell(r1,c1,Nchkstring);
END;
END;
END;
END;
IF f1 = 1 THEN DoMenuText('WSRecalculate');
END;
END;
IF f2 = 1 THEN CloseSS(h);
END;
DSELECTALL;
IF strTooLongCount > 0 THEN BEGIN
IF strTooLongCount < 2 THEN ALRTDIALOG('One block of text was skipped because it╒s length was greater than 255 characters.')
ELSE BEGIN
s1:=(Num2Str(0,strTooLongCount));
s2:= CONCAT(s1,' blocks of text were skipped because their lengths were each greater than 255 characters.');
ALRTDIALOG(s2);
END;
END;
IF count = 0 THEN
BEGIN
SYSBEEP;
ALRTDIALOG('String not found.');
GOTO 2;
END;
CountStr := NUM2STR(0,count);
CountStr := CONCAT(CountStr,' OCCURRENCE(S) CHANGED.');
SYSBEEP;
ALRTDIALOG(countstr);
2:CLRMESSAGE;
POPATTRS;
END;
RUN(ReplaceTxt);