Post by albertstc012 on Oct 18, 2018 9:18:26 GMT
CopyPasteDLGEDIT.BBC is a very bad hack of the official DLGEDIT BBC4W example program. I have added to it Copy and Paste to the Menu which makes it more useful for my purposes than the original DLGEDITs which can only save and load from a file. With CopyPasteDLGEDIT.BBC I am able to select, copy or cut DLG code from an existing program listing and then, after using paste from the menu, wysiwyg desired alterations.
Using copy from the menu will open a text edit box with new DLG code listed.
One check box if ticked and after clicking OK will add INSTALL@lib$+"WINLIB" and INSTALL @lib$+"WINLIB2B" as a header to the code. The other check box if ticked will append “PROC_showdialog(dlg%)” to the code.
With these additions added the code can be pasted into a new blank BBC4W program page and the dialogue box for the code will be displayed when run. If errors are reported it will be usually because the dialogue code uses variables that have not been declared for the new program. Declaring values for these variables in a header for the code will enable the the code to be displayed when run.
BBC4W Code
REM Additiopns added to Visual Dialogue Box By Chris Coxall
REM COPY AND PASTE
REM PASTE: Dialogue box code selected and copied to clip board
REM from an open BBCBASIC program or idirectly from a text
REM editor.
REM It is saved to a flie and loaded back into DLGEDIT for
REM modification.
REM
REM COPY: Will display the code in an edit box.
REM Two check boxes allow optionally the dialogue box code to be
REM prefixed with INSTALL @lib$+"WINLIB" INSTALL @lib$+"WINLIB2B"
REM and added at the bottom of the code PROC_showdialog(dlg2%).
REM The code then can on it's own be pasted into the BBCBASIC IDE and RUN
REM. Visual Dialogue Box Editor for BBC BASIC for Windows
REM. Richard Russell, 26-Sep-2004; 17-Jun-2005; 12-Aug-2005; 09-Feb-2006; 20-Sep-2007
REM MODE 8
*ESC OFF
INSTALL @lib$+"WINLIB"
INSTALL @lib$+"WINLIB2B"
REM PROC_loadclip
REM
REM PRINT $$tmp%
Variable$=" "
REM Added Dialogue box by Chris Coxall
REM INSTALL @lib$+"WINLIB":INSTALL @lib$+"WINLIB2B"
dlg2%=FN_newdialog("Dialogue box",3,20,515,296,8,710)
dlg2%!16=&90C800C4
REM Button, BS_DEFPUSHBUTTON, WS_TABSTOP, WS_GROUP, WS_VISIBLE
PROC_dlgitem( dlg2%,"OK",1,14,235,56,14,&50030001,&80)
REM Button, BS_PUSHBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Cancel",2,79,235,56,14,&50010000,&80)
REM Edit box, ES_MULTILINE, ES_AUTOVSCROLL, ES_AUTOHSCROLL, ES_WANTRETURN, WS_VISIBLE
PROC_dlgitem( dlg2%,"",106,12,13,487,211,&50B010C4,&81)
REM Button, BS_AUTOCHECKBOX, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"INSTALL WINLIB WINLIB2B",101,145,232,108,19,&50010003,&80)
REM Button, BS_AUTOCHECKBOX, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"add PROC_showdialog(dlg2%)",102,270,232,110,16,&50010003,&80)
REM Group box, WS_GROUP, WS_VISIBLE
PROC_dlgitem( dlg2%,"EDIT BOX Add Scroll Bars",109,13,251,426,34,&50020007,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Horisontal Scroll Bar",110,103,264,96,15,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Vertical Scroll Bar",111,200,264,84,16,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Horisontal and Vertical Scroll Bar",112,300,264,138,15,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"NO",113,21,262,64,16,&50010009,&80)
REM PROC_showdialog(dlg2%)
Prop%=FN_newdialog("",220,40,185,242,8,1200)
PROC_static(Prop%,"",100,5,6,35,14,2)
PROC_static(Prop%,"Text:",101,72,6,35,14,2)
PROC_static(Prop%,"X position:",102,5,23,35,14,2)
PROC_static(Prop%,"Y position:",103,87,23,40,14,2)
PROC_static(Prop%,"Width:",104,5,40,35,14,2)
PROC_static(Prop%,"Height:",105,87,40,40,14,2)
PROC_editbox(Prop%,"",106,45,5,40,12,&80)
PROC_editbox(Prop%,"",107,114,5,60,12,&80)
PROC_editbox(Prop%,"",108,45,22,40,12,&2000)
PROC_editbox(Prop%,"",109,134,22,40,12,&2000)
PROC_editbox(Prop%,"",110,45,39,40,12,&2000)
PROC_editbox(Prop%,"",111,134,39,40,12,&2000)
PROC_groupbox(Prop%,"Styles",112,3,55,178,165,0)
I% = 116
FOR Y% = 65 TO 200 STEP 15
FOR X% = 10 TO 110 STEP 87
PROC_checkbox(Prop%,"",I%,X%,Y%,82,14,0):I% += 1
NEXT:NEXT
PROC_pushbutton(Prop%,"OK",1,5,225,50,14,&20001)
PROC_pushbutton(Prop%,"",2,67,225,50,14,0)
PROC_pushbutton(Prop%,"Apply",3,129,225,50,14,0)
SYS "CreatePopupMenu" TO hFile%
SYS "AppendMenu", hFile%, 0, 10, "&New"
SYS "AppendMenu", hFile%, 0, 11, "&Load..."
SYS "AppendMenu", hFile%, 0, 12, "&Save"
SYS "AppendMenu", hFile%, 0, 13, "Save &As..."
SYS "AppendMenu", hFile%, 0, 19, "&Export..."
REM PASTE ADDED by Chris Coxall
SYS "AppendMenu", hFile%, 0, 114, "PASTE"
REM COPY ADDED by Chris Coxall
SYS "AppendMenu", hFile%, 0, 115, "COPY"
SYS "AppendMenu", hFile%, 0, 14, "E&xit"
SYS "CreateMenu" TO hMenu%
SYS "SetMenu", @hwnd%, hMenu%
SYS "AppendMenu", hMenu%, 16, hFile%, "&File"
SYS "AppendMenu", hMenu%, 0, 15, "&Help"
SYS "DrawMenuBar", @hwnd%
SYS "CreatePopupMenu" TO hAdd%
SYS "AppendMenu", hAdd%, 0, 20, "&Group Box"
SYS "AppendMenu", hAdd%, 0, 21, "&Pushbutton"
SYS "AppendMenu", hAdd%, 0, 22, "&Checkbox"
SYS "AppendMenu", hAdd%, 0, 23, "&Radiobutton"
SYS "AppendMenu", hAdd%, 0, 24, "&Editbox"
SYS "AppendMenu", hAdd%, 0, 25, "&Listbox"
SYS "AppendMenu", hAdd%, 0, 26, "Co&mbobox"
SYS "AppendMenu", hAdd%, 0, 27, "&Static"
SYS "CreatePopupMenu" TO hPopup%
SYS "AppendMenu", hPopup%, 16, hAdd%, "Add"
SYS "AppendMenu", hPopup%, 0, 31, "Move"
SYS "AppendMenu", hPopup%, 0, 32, "Move group"
SYS "AppendMenu", hPopup%, 0, 33, "Resize"
SYS "AppendMenu", hPopup%, 0, 34, "Copy"
SYS "AppendMenu", hPopup%, 0, 35, "Paste"
SYS "AppendMenu", hPopup%, 0, 36, "Delete"
SYS "AppendMenu", hPopup%, 0, 37, "Properties"
DIM Old% 3, P% 55, Text% 255
[OPT 2
.K%
mov eax,[esp+12]
mov ebx,[esp+16]
push 0
push @hwnd%
push 0
push ebx
push eax
push &180
push hPopup%
call "TrackPopupMenu"
ret 16
.M%
cmp dword [esp+8],&500
jz K%
jmp [Old%]
]
SYS "SetWindowLong", @hwnd%, -4, M% TO !Old%
DIM t$(100),i%(100),x%(100),y%(100),w%(100),h%(100),s%(100),c%(100)
DIM Of{lStructSize%, hwndOwner%, hInstance%, lpstrFilter%, \
\ lpstrCustomFilter%, nMaxCustFilter%, nFilterIndex%, \
\ lpstrFile%, nMaxFile%, lpstrFileTitle%, \
\ nMaxFileTitle%, lpstrInitialDir%, lpstrTitle%, \
\ flags%, nFileOffset{l&,h&}, nFileExtension{l&,h&}, \
\ lpstrDefExt%, lCustData%, lpfnHook%, lpTemplateName%}
DIM Fn% 256
ff$ = "DLG files"+CHR$0+"*.DLG"+CHR$0+CHR$0
ex$ = "DLG"+CHR$0
Of.lStructSize% = DIM(Of{})
Of.hwndOwner% = @hwnd%
Of.lpstrFilter% = !^ff$
Of.lpstrFile% = Fn%
Of.lpstrDefExt% = !^ex$
Of.nMaxFile% = 256
Of.flags% = 6
DIM bu%(6),bi%(6)
bu%() = 11,1,2,6,7,8,0
bi%() = 15,115,114,10,11,12,0
Ht% = FN_createtoolbar(7,bu%(),bi%())
Hs% = FN_createstatusbar("Right click in dialogue box to edit")
Dlg% = FN_newdialog("",0,0,0,0,0,10000)
nparts% = 6
DIM edges% nparts%*4-1
FOR N% = 0 TO nparts%-1
READ edges%!(N%*4)
NEXT N%
DATA 180, 300, 350, 440, 530, 640
SYS "SendMessage", Hs%, 1028, nparts%, edges%
Move% = 0
ON ERROR SYS "MessageBox", @hwnd%, REPORT$, 0, 48
ON CLOSE IF FNconfirm PROCexit ELSE RETURN
ON MOVE PROCmove(@msg%,@wparam%,@lparam%,Move%+1) : RETURN
ON SYS MenuCmd% = @wparam% : RETURN
PROCnew
PROCgetscale
MenuCmd% = 0
NextID% = 100
Changed% = FALSE
OFF
REPEAT
J% = FNwhereami
PROCnotify(J%)
MOUSE x%,y%,B%
SYS "GetCursorPos", ^X%
IF INKEY(-1) MOUSE ON 130 ELSE MOUSE ON 0
IF (J% >= 0) IF (B% AND 2) PROCmovesize(J%,x%(),y%(),134,0)
IF (J% >= 0) IF (B% AND 4) IF INKEY(-1) PROCmovesize(J%,w%(),h%(),130,0)
IF (J% >= 0) IF (B% AND 1) THEN
SYS "EnableMenuItem", hPopup%, 0, &400-(Num% >= 99)
SYS "EnableMenuItem", hPopup%, 32, -(c%(J%)<>&80 OR (s%(J%)AND7)<>7)
SYS "EnableMenuItem", hPopup%, 34, -(J% = 0)
SYS "EnableMenuItem", hPopup%, 35, -(s%(100) = 0)
SYS "EnableMenuItem", hPopup%, 36, -(J% = 0 OR Num% = 1)
SYS "SendMessage", @hwnd%, &500, X%, Y% TO cmd%
CASE cmd% OF
WHEN 20: PROCadd("Group Box", &50020007,&80, X%, Y%)
WHEN 21: PROCadd("Pushbutton", &50010000,&80, X%, Y%)
WHEN 22: PROCadd("Checkbox", &50010003,&80, X%, Y%)
WHEN 23: PROCadd("Radiobutton",&50010009,&80, X%, Y%)
WHEN 24: PROCadd("", &50810080,&81, X%, Y%)
WHEN 25: PROCadd("", &50A10000,&83, X%, Y%)
WHEN 26: PROCadd("", &50210003,&85, X%, Y%)
WHEN 27: PROCadd("Static", &50000000,&82, X%, Y%)
WHEN 31: PROCmovesize(J%,x%(),y%(),134,0)
WHEN 32: PROCmovesize(J%,x%(),y%(),134,1)
WHEN 33: PROCmovesize(J%,w%(),h%(),130,0)
WHEN 34: PROCcopy(J%)
WHEN 35: PROCpaste(X%,Y%)
WHEN 36: PROCdelete(J%)
WHEN 37: PROCproperties(J%)
ENDCASE
ENDIF
temp% = 0
SWAP temp%,MenuCmd%
CASE temp% OF
WHEN 2: PROCupdate(0)
WHEN 10: IF FNconfirm PROCnew
WHEN 11: IF FNconfirm PROCload
WHEN 12: IF FNsave Changed%=FALSE
WHEN 13: IF FNsaveas Changed%=FALSE
WHEN 14: IF FNconfirm PROCexit
REM WHEN 114 ADDED
WHEN 114: PROC_loadclip:PROC_paste
WHEN 15: PROChelp
REM WHEN 115: PROC_copy ADDED
WHEN 115: PROC_copy
WHEN 19: PROCexport
OTHERWISE SYS "Sleep", 0
ENDCASE
UNTIL INKEY(1)=0
DEF FNwhereami:LOCAL A%,I%,J%,K%,T%,U%,V%,W%,X%,Y%,Z%:REM GLOBAL Num%,Dlg%
SYS "GetForegroundWindow" TO W%
IF W% <> !Dlg% AND W% <> @hwnd% THEN = -1
SYS "GetCursorPos", ^X%
SYS "GetWindowRect", !Dlg%, ^T%
SYS "PtInRect", ^T%, X%, Y% TO K%
IF K% = 0 THEN = -1
A% = &7FFFFFFF
J% = 0
FOR I% = 1 TO Num%
T% = x%(I%)
U% = y%(I%)
V% = T% + w%(I%)
W% = U% + h%(I%)
SYS "MapDialogRect", !Dlg%, ^T%
SYS "ClientToScreen", !Dlg%, ^T%
SYS "ClientToScreen", !Dlg%, ^V%
SYS "PtInRect", ^T%, X%, Y% TO K%
IF K% THEN
Z% = w%(I%) * h%(I%)
IF Z% < A% A% = Z% : J% = I%
ENDIF
NEXT I%
= J%
DEF PROCupdate(T%):LOCAL I%,L%,F%,S%,X%,Y%,t$:REM GLOBAL Dlg%,Num%
Dlg%!16 = s%(0)
Dlg%!20 = 0
Dlg%!24 = 0
Dlg%!26 = x%(0)
Dlg%!28 = y%(0)
Dlg%!30 = w%(0)
Dlg%!32 = h%(0)
Dlg%!34 = 0
SYS "MultiByteToWideChar", 0, 0, t$(0), LENt$(0), Dlg%+38, 256 TO L%
Dlg%!(2*L%+38) = 0
Dlg%!(2*L%+40) = i%(0)
SYS "MultiByteToWideChar", 0, 0, "MS Sans Serif", 13, Dlg%+2*L%+42, 256 TO F%
Dlg%!(2*L%+2*F%+42) = 0
Dlg%!12 = Dlg%+2*L%+2*F%+44
FOR I% = 1 TO Num%
t$ = t$(I%)
IF T% IF c%(I%)=&80 IF (s%(I%)AND7)<>7 IF (s%(I%)AND7)>1 t$ += STRING$(127-LENt$," ")
PROC_dlgitem(Dlg%,t$,i%(I%),x%(I%),y%(I%),w%(I%),h%(I%),s%(I%),c%(I%))
NEXT I%
IF !Dlg% PROC_closedialog(Dlg%)
SYS "GetCursorPos", ^X%
PROC_showdialog(Dlg%)
SYS "SetCursorPos", X%, Y%
SYS "GetSystemMenu", !Dlg%, 0 TO S%
SYS "DeleteMenu", S%, &F010, 0
SYS "DeleteMenu", S%, &F060, 0
ENDPROC
DEF PROCupdateitem(I%):REM GLOBAL Dlg%
LOCAL H%,V%,W%,X%,Y%
SYS "GetDlgItem", !Dlg%, i%(I%) TO H%
V% = x%(I%)
W% = y%(I%)
X% = x%(I%)+w%(I%)
Y% = y%(I%)+h%(I%)
SYS "MapDialogRect",!Dlg%,^V%
SYS "SetWindowPos",H%,0,V%,W%,X%-V%,Y%-W%,4+16+256
ENDPROC
DEF PROCnotify(J%):REM GLOBAL Hs%,Variable$
IF J% < 0 THEN
FOR J% = 1 TO 5
SYS "SendMessage", Hs%, 1025, J%, ""
NEXT
ENDPROC
ENDIF
SYS "SendMessage", Hs%, 1025, 1, t$(J%)
SYS "SendMessage", Hs%, 1025, 3, "posn = "+STR$x%(J%)+","+STR$y%(J%)
SYS "SendMessage", Hs%, 1025, 4, "size = "+STR$w%(J%)+","+STR$h%(J%)
SYS "SendMessage", Hs%, 1025, 5, "style = 0x"+STR$~s%(J%)
IF J% THEN
SYS "SendMessage", Hs%, 1025, 2, "id = "+STR$i%(J%)
ELSE
SYS "SendMessage", Hs%, 1025, 2, Variable$
ENDIF
ENDPROC
DEF PROCmove(M%,W%,L%,Move%):REM GLOBAL Hs%,Ht%,Dlg%,Move%
LOCAL V%,W%,X%,Y%
PRIVATE O%
SYS "PostMessage",Hs%,M%,W%,L%
SYS "PostMessage",Ht%,M%,W%,L%
IF !Dlg% IF M%=3 THEN
X% = x%(0)
Y% = y%(0)
SYS "MapDialogRect",!Dlg%,^V%
IF Move%>=O% SYS "SetWindowPos",!Dlg%,0,X%+((L%<<16)>>16),Y%+(L%>>16),0,0,5
O% = Move%
ENDIF
ENDPROC
DEF FNconfirm:LOCAL R%:REM GLOBAL Changed%
IF NOT Changed% THEN =TRUE
SYS "MessageBox",@hwnd%,"Save changes?","DLGEDIT",35 TO R%
IF R%=6 IF FNsave Changed%=FALSE:=TRUE
IF R%=7 Changed%=FALSE:=TRUE
=FALSE
DEF PROCtitle:REM GLOBAL Fn%
SYS "SetWindowText",@hwnd%,"DLGEDIT-"+$$Fn%
ENDPROC
DEF PROCexit
IF !Dlg% PROC_closedialog(Dlg%)
IF !Prop% PROC_closedialog(Prop%)
PROC_removestatusbar
PROC_removetoolbar
QUIT
DEF PROCgetscale:LOCAL T%,U%,V%,W%:REM GLOBAL Dlg%,XScale,Yscale
T% = 100 : V% = T%
U% = 100 : W% = U%
SYS "MapDialogRect", !Dlg%, ^T%
Xscale = 100/T%
Yscale = 100/U%
ENDPROC
DEF PROCadd(T$,S%,C%,X%,Y%):REM GLOBAL Dlg%,Xscale,Yscale,Num%,NextID%,Changed%
SYS "ScreenToClient", !Dlg%, ^X%
IF X% < 0 ENDPROC
X% *= Xscale
Y% *= Yscale
Num% += 1
t$(Num%) = T$
i%(Num%) = NextID%
x%(Num%) = X%
y%(Num%) = Y%
w%(Num%) = 64
IF C% = &85 h%(Num%) = 60 ELSE h%(Num%) = 16
s%(Num%) = S%
c%(Num%) = C%
NextID% += 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCmovesize(J%,a%(),b%(),M%,G%):REM GLOBAL Xscale,Yscale,Num%,Changed%,Dlg%
LOCAL B%, I%, T%, U%, V%, W%, X%, Y%, oX%, oY%, x%, y%, F%, P%, Q%
IF c%(J%) = &85 SYS "SendDlgItemMessage", !Dlg%, i%(J%), &14F, 1, 0
REPEAT
MOUSE ON M%
MOUSE X%, Y%, B%
UNTIL B% AND 6
SYS "GetCursorPos", ^T%
x% = a%(J%) : y% = b%(J%)
oX% = -1 : oY% = -1
REPEAT
MOUSE ON M%
SYS "GetCursorPos", ^X%
IF (X% <> oX% OR Y% <> oY%) THEN
oX% = X% : oY% = Y%
V% = a%(J%) : W% = b%(J%)
a%(J%) = x% + (X%-T%)*Xscale
b%(J%) = y% + (Y%-U%)*Yscale
IF a%(J%) < 0 a%(J%) = 0
PROCupdateitem(J%)
IF G% THEN
X% = V%+w%(J%) : Y% = W%+h%(J%)
FOR I% = 1 TO Num%
SYS "PtInRect", ^V%, x%(I%), y%(I%) TO B%
IF (B% <> 0) AND (I% <> J%) THEN
x%(I%) += a%(J%)-V%
y%(I%) += b%(J%)-W%
PROCupdateitem(I%)
ENDIF
NEXT
ENDIF
V% = x%(0) : W% = y%(0)
X% = x%(0)+w%(0) : Y% = y%(0)+h%(0)
SYS "MapDialogRect",!Dlg%,^V%
P% = V% : Q% = W%
SYS "AdjustWindowRect", ^V%, s%(0), 0
X% -= V% : Y% -= W%
V% = P% : W% = Q%
P% = 0 : Q% = 0
SYS "ClientToScreen", @hwnd%, ^P%
SYS "SetWindowPos",!Dlg%,0,P%+V%,Q%+W%,X%,Y%,4
PROCnotify(J%)
F% = TRUE
ELSE
IF F% IF c%(J%) = &85 SYS "SendDlgItemMessage", !Dlg%, i%(J%), &14F, 1, 0
F% = FALSE
ENDIF
SYS "Sleep", 20
MOUSE X%, Y%, B%
UNTIL (B% AND 6) = 0
MOUSE ON 0
PROCupdate(1)
Changed% = TRUE
ENDPROC
DEF PROCcopy(J%)
IF J% = 0 ENDPROC
t$(100) = t$(J%)
i%(100) = i%(J%)
x%(100) = x%(J%)
y%(100) = y%(J%)
w%(100) = w%(J%)
h%(100) = h%(J%)
s%(100) = s%(J%)
c%(100) = c%(J%)
ENDPROC
DEF PROCpaste(X%,Y%):REM GLOBAL Dlg%,Xscale,Yscale,Num%,NextID%,Changed%
SYS "ScreenToClient", !Dlg%, ^X%
IF X% < 0 ENDPROC
X% *= Xscale
Y% *= Yscale
Num% += 1
t$(Num%) = t$(100)
i%(Num%) = NextID%
x%(Num%) = X%
y%(Num%) = Y%
w%(Num%) = w%(100)
h%(Num%) = h%(100)
s%(Num%) = s%(100)
c%(Num%) = c%(100)
NextID% += 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCdelete(J%):LOCAL I%:REM GLOBAL Num%,Changed%
IF J% = 0 ENDPROC
IF J% <> Num% THEN
FOR I% = J% TO Num%-1
t$(I%) = t$(I%+1)
i%(I%) = i%(I%+1)
x%(I%) = x%(I%+1)
y%(I%) = y%(I%+1)
w%(I%) = w%(I%+1)
h%(I%) = h%(I%+1)
s%(I%) = s%(I%+1)
c%(I%) = c%(I%+1)
NEXT
ENDIF
Num% -= 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCproperties(J%):LOCAL H%,I%,t$,temp%:REM GLOBAL Prop%,Changed%,Variable$
PROC_showdialog(Prop%)
SYS "SetDlgItemText", !Prop%, 2, "Cancel"
IF J% THEN
SYS "SetDlgItemText", !Prop%, 100, "ID number:"
SYS "SetDlgItemText", !Prop%, 106, STR$(i%(J%))
ELSE
SYS "SetDlgItemText", !Prop%, 100, "Variable:"
SYS "SetDlgItemText", !Prop%, 106, Variable$
ENDIF
SYS "SetDlgItemText", !Prop%, 107, t$(J%)
SYS "SetDlgItemInt", !Prop%, 108, x%(J%), 1
SYS "SetDlgItemInt", !Prop%, 109, y%(J%), 1
SYS "SetDlgItemInt", !Prop%, 110, w%(J%), 0
SYS "SetDlgItemInt", !Prop%, 111, h%(J%), 0
c%(0) = &84
PROCrestore(c%(J%))
READ t$
SYS "SetWindowText", !Prop%, t$+" properties"
FOR I% = 0 TO 17
READ t$
IF t$ <> "" THEN
SYS "SetDlgItemText", !Prop%, I%+116, t$
ELSE
SYS "GetDlgItem", !Prop%, I%+116 TO H%
SYS "EnableWindow", H%, 0
ENDIF
SYS "CheckDlgButton", !Prop%, I%+116, -((s%(J%) AND (1 << I%)) <> 0)
NEXT
FOR I% = 27 TO 28
IF J% THEN
IF I% = 27 t$ = "WS_DISABLED" ELSE t$ = "WS_VISIBLE"
SYS "SetDlgItemText", !Prop%, I%+107, t$
ELSE
SYS "GetDlgItem", !Prop%, I%+107 TO H%
SYS "EnableWindow", H%, 0
ENDIF
SYS "CheckDlgButton", !Prop%, I%+107, -((s%(J%) AND (1 << I%)) <> 0)
NEXT
REPEAT
temp% = 0
SWAP temp%,MenuCmd%
IF temp% = 1 OR temp% = 3 THEN
SYS "GetDlgItemText", !Prop%, 106, Text%, 255
IF J%=0 Variable$ = $$Text% ELSE i%(J%) = VAL($$Text%)
SYS "GetDlgItemText", !Prop%, 107, Text%, 255
t$(J%) = $$Text%
SYS "GetDlgItemInt", !Prop%, 108, 0, 0 TO x%(J%)
SYS "GetDlgItemInt", !Prop%, 109, 0, 0 TO y%(J%)
SYS "GetDlgItemInt", !Prop%, 110, 0, 0 TO w%(J%)
SYS "GetDlgItemInt", !Prop%, 111, 0, 0 TO h%(J%)
FOR I% = 0 TO 17
SYS "IsDlgButtonChecked", !Prop%, I%+116 TO H%
s%(J%) = s%(J%) AND NOT (1 << I%) OR (H% << I%)
NEXT
FOR I% = 27 TO 28
SYS "IsDlgButtonChecked", !Prop%, I%+107 TO H%
s%(J%) = s%(J%) AND NOT (1 << I%) OR (H% << I%)
NEXT
SYS "SetDlgItemText", !Prop%, 2, "Close"
PROCupdate(1)
PROCnotify(J%)
Changed% = TRUE
ELSE
SYS "Sleep", 0
ENDIF
UNTIL (!Prop% = 0) OR (temp% = 1) OR (temp% = 2)
IF !Prop% PROC_closedialog(Prop%)
ENDPROC
DEF PROCnew:REM GLOBAL Fn%,Num%,NextID%,Variable$
?Fn% = 0
PROCtitle
Num% = 2
NextID% = 100
Variable$ = "dlg%"
t$() = "Dialogue box","OK","Cancel"
i%() = 8,1,2
x%() = 50,12,92
y%() = 50,108,108
w%() = 160,56,56
h%() = 128,14,14
s%() = &90C800C4,&50030001,&50010000
c%() = 0,&80,&80
PROCupdate(0)
ENDPROC
DEF PROCload:LOCAL F%,I%,A$:REM GLOBAL Fn%,Of{},Num%,NextID%
?Fn% = 0
SYS "GetOpenFileName",Of{} TO F% : IF F% = 0 THEN ENDPROC
PROCtitle
F% = OPENIN($$Fn%)
IF F% THEN
Num% = 0
NextID% = 100
s%(0) = &90C800C4
REPEAT
INPUT #F%, A$ : IF ASCA$ = 10 A$ = MID$(A$,2)
I% = INSTR(A$,"!16="):IF I% s%(0)=EVALMID$(A$,I%+4)
I% = INSTR(A$,"FN_newdialog("):IF I% PROCscan(A$,I%+13,0)
I% = INSTR(A$,"PROC_dlgitem("):IF I% Num% += 1:PROCscan(A$,I%+13,Num%)
UNTIL EOF#F%
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot open file", 0, 64
ENDIF
PROCupdate(0)
ENDPROC
DEF FNsaveas:LOCAL F%:REM GLOBAL Fn%,Of{}
?Fn% = 0
SYS "GetSaveFileName",Of{} TO F% : IF F% = 0 THEN = 0
PROCtitle
REM FNsave ALTERED
DEF FNsave:LOCAL F%:REM IF ?Fn%=0 THEN =FNsaveas
F% = OPENOUT "OLD.dlg"
IF F% THEN
PROCupdate(0)
PROCwrite(F%,0)
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
= F%
DEF PROCexport
LOCAL B%,F%,N%,F$,E$,eofn{}
DIM eofn{} = Of{}, N% LOCAL 256
F$ = "BBC BASIC file"+CHR$0+"*.BBC"+CHR$0+CHR$0
E$ = "BBC"+CHR$0
REPEAT
F% = INSTR($$Fn%,".",B%+1)
B% = INSTR($$Fn%,"\",B%+1)
UNTIL B%=0
$$N% = LEFT$($$Fn%,F%-1)
eofn.lStructSize% = DIM(eofn{})
eofn.hwndOwner% = @hwnd%
eofn.lpstrFilter% = !^F$
eofn.lpstrFile% = N%
eofn.lpstrDefExt% = !^E$
eofn.nMaxFile% = 256
eofn.flags% = 6
SYS "GetSaveFileName", eofn{} TO F% : IF F%=0 THEN ENDPROC
F% = OPENOUT($$N%)
IF F% THEN
PROCupdate(0)
PROCout(F%,1,"REM This code is generated automatically - do not edit!")
PROCwrite(F%,1)
BPUT #F%,0:BPUT#F%,&FF:BPUT#F%,&FF
CLOSE#F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
ENDPROC
DEF PROCwrite(F%,T%) : REM GLOBAL Variable$,Num%
LOCAL B%,I%,c$,t$
PROCout(F%,T%,Variable$+"=FN_newdialog("""+t$(0)+""","+STR$x%(0)+","+STR$y%(0)+","+STR$w%(0)+","+STR$h%(0)+","+STR$i%(0)+","+STR$(Dlg%!12-Dlg%+4)+")")
PROCout(F%,T%,Variable$+"!16=&"+STR$~s%(0))
FOR I% = 1 TO Num%
PROCrestore(c%(I%)) : READ c$
CASE c%(I%) OF
WHEN &80:
CASE s%(I%) AND 15 OF
WHEN 0: c$ += ", BS_PUSHBUTTON"
WHEN 1: c$ += ", BS_DEFPUSHBUTTON"
WHEN 2: c$ += ", BS_CHECKBOX"
WHEN 3: c$ += ", BS_AUTOCHECKBOX"
WHEN 4: c$ += ", BS_RADIOBUTTON"
WHEN 5: c$ += ", BS_3STATE"
WHEN 6: c$ += ", BS_AUTO3STATE"
WHEN 7: c$ = "Group box"
WHEN 8: c$ += ", BS_USERBUTTON"
WHEN 9: c$ += ", BS_AUTORADIOBUTTON"
WHEN 10: c$ += ", BS_PUSHBOX"
WHEN 11: c$ += ", BS_OWNERDRAW"
ENDCASE
WHEN &82:
CASE s%(I%) AND 31 OF
WHEN 0: c$ += ", SS_LEFT"
WHEN 1: c$ += ", SS_CENTER"
WHEN 2: c$ += ", SS_RIGHT"
WHEN 3: c$ += ", SS_ICON"
WHEN 4: c$ += ", SS_BLACKRECT"
WHEN 5: c$ += ", SS_GRAYRECT"
WHEN 6: c$ += ", SS_WHITERECT"
WHEN 7: c$ += ", SS_BLACKFRAME"
WHEN 8: c$ += ", SS_GRAYFRAME"
WHEN 9: c$ += ", SS_WHITEFRAME"
WHEN 10: c$ += ", SS_USERITEM"
WHEN 11: c$ += ", SS_SIMPLE"
WHEN 12: c$ += ", SS_LEFTNOWORDWRAP"
WHEN 13: c$ += ", SS_OWNERDRAW"
WHEN 14: c$ += ", SS_BITMAP"
WHEN 15: c$ += ", SS_ENHMETAFILE"
WHEN 16: c$ += ", SS_ETCHEDHORZ"
WHEN 17: c$ += ", SS_ETCHEDVERT"
WHEN 18: c$ += ", SS_ETCHEDFRAME"
ENDCASE
ENDCASE
FOR B% = 0 TO 17
READ t$ : IF s%(I%) AND 2^B% IF LEN(t$) > 2 THEN c$ += ", "+t$
NEXT
IF s%(I%) AND &8000000 THEN c$ += ", WS_DISABLED"
IF s%(I%) AND &10000000 THEN c$ += ", WS_VISIBLE"
PROCout(F%,T%,"REM "+c$)
PROCout(F%,T%,"PROC_dlgitem("+Variable$+","""+t$(I%)+""","+STR$i%(I%)+","+STR$x%(I%)+","+STR$y%(I%)+","+STR$w%(I%)+","+STR$h%(I%)+",&"+STR$~s%(I%)+",&"+STR$~c%(I%)+")")
NEXT
ENDPROC
DEF PROCout(F%,T%,A$)
IF T% THEN
IF EVAL("0:"+A$)
A$ = $(!332+2)
BPUT#F%,LENA$+4:BPUT#F%,0:BPUT#F%,0:PRINT #F%,A$
ELSE
PRINT #F%,A$ : BPUT#F%,10
ENDIF
ENDPROC
DEF PROCscan(A$,I%,J%):REM GLOBAL NextID%, Variable$
LOCAL E%
IF J%=0 E% = INSTR(A$,"=") : Variable$ = LEFT$(A$,E%-1)
IF J% I% = INSTR(A$,",",I%)+1
t$(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%+LENt$(J%))+1
IF J% i%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
x%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
y%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
w%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
h%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% s%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% c%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J%=0 i%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% IF i%(J%) >= NextID% NextID% = i%(J%) + 1
ENDPROC
DEF PROChelp:LOCAL H$
H$ = "Right click in dialogue box to edit contents."+CHR$13
H$ += "Middle button is shortcut for 'Move' command."+CHR$13
H$ += "Shift + left button is shortcut for 'Resize'."+CHR$13
H$ += "When dialogue box is complete, save to file."+CHR$13
H$ += "Insert the file into your BBC BASIC program;"+CHR$13
H$ += "alternatively export to a tokenised file and"+CHR$13
H$ += "incorporate it at run time using CALL ""dlgfile""."
SYS "MessageBox", @hwnd%, H$, "Help", 0
ENDPROC
DEF PROCrestore(C%)
RESTORE +(C% - &7F)
DATA Button,1,2,4,8,,BS_LEFTTEXT,BS_ICON,BS_BITMAP,BS_LEFT,BS_RIGHT,BS_TOP,BS_BOTTOM,BS_PUSHLIKE,BS_MULTILINE,BS_NOTIFY,BS_FLAT,WS_TABSTOP,WS_GROUP
DATA Edit box,ES_CENTER,ES_RIGHT,ES_MULTILINE,ES_UPPERCASE,ES_LOWERCASE,ES_PASSWORD,ES_AUTOVSCROLL,ES_AUTOHSCROLL,ES_NOHIDESEL,,ES_OEMCONVERT,ES_READONLY,ES_WANTRETURN,ES_NUMBER,,,WS_TABSTOP,WS_GROUP
DATA Static control,1,2,4,8,16,,,SS_NOPREFIX,SS_NOTIFY,SS_CENTERIMAGE,SS_RIGHTJUST,SS_REALSIZEIMAGE,SS_SUNKEN,,SS_ENDELLIPSIS,SS_PATHELLIPSIS,WS_TABSTOP,WS_GROUP
DATA List box,LBS_NOTIFY,LBS_SORT,LBS_NOREDRAW,LBS_MULTIPLESEL,LBS_OWNERFIXED,LBS_OWNERVAR,LBS_HASSTRINGS,LBS_USETABSTOPS,LBS_NOINTEGRALH,LBS_MULTICOLUMN,LBS_WANTINPUT,LBS_EXTENDELSEL,LBS_DISABLENOSC,LBS_NODATA,LBS_NOSEL,,WS_TABSTOP,WS_GROUP
DATA Dialogue box,DS_ABSALIGN,DS_SYSMODAL,,DS_FIXEDSYS,DS_NOFAILCREATE,,,,DS_NOIDLEMESG,DS_SETFOREGRND,DS_CONTROL,DS_CENTER,DS_CENTERMOUSE,DS_CONTEXTHELP,,,,
DATA Combo box,CBS_SIMPLE,CBS_DROPDOWN,,,CBS_OWNERFIXED,CBS_OWNERVAR,CBS_AUTOHSCROLL,CBS_OEMCONVERT,CBS_SORT,CBS_HASSTRINGS,CBS_NOINTEGRALH,CBS_DISABLENOSC,,CBS_UPPERCASE,CBS_LOWERCASE,,WS_TABSTOP,WS_GROUP
ENDPROC
REM PROC_paste Added by Chris Coxall
DEF PROC_paste:LOCAL F%,I%,A$:REM GLOBAL Fn%,Of{},Num%,NextID%
F% = OPENIN "OLD.dlg"
IF F% THEN
Num% = 0
NextID% = 100
s%(0) = &90C800C4
REPEAT
INPUT #F%, A$ : IF ASCA$ = 10 A$ = MID$(A$,2)
I% = INSTR(A$,"!16="):IF I% s%(0)=EVALMID$(A$,I%+4)
I% = INSTR(A$,"FN_newdialog("):IF I% PROCscan(A$,I%+13,0)
I% = INSTR(A$,"PROC_dlgitem("):IF I% Num% += 1:PROCscan(A$,I%+13,Num%)
UNTIL EOF#F%
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot open file", 0, 64
ENDIF
PROCupdate(0)
ENDPROC
DEF FN_copy:LOCAL F%:REM GLOBAL Fn%,Of{}
?Fn% = 0
REM PROC_copy ADDED by Chris Coxall
DEF PROC_copy:LOCAL F%:
F% = OPENOUT "NEW.dlg"
IF F% THEN
PROCupdate(0)
PROCwrite(F%,0)
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
X=OPENIN "NEW.dlg"
REM A$=CHR$13+CHR$10
A$=""
REPEAT
N=BGET#X
A$=A$+CHR$(N)
UNTIL PTR#X=EXT#X
CLOSE#X
text$=A$
PROC_showdialog(dlg2%)
SYS "SetDlgItemText", !dlg2%, 106, text$
REPEAT
click% = 0
ON SYS click% = @wparam% AND &FFFF : RETURN
REPEAT pause% = INKEY(1) : UNTIL click% OR !dlg% = 0
ON SYS OFF
CASE click% OF
WHEN 1 PROC_1
WHEN 2 PROC_closedialog(dlg2%):QUIT
ENDCASE
UNTIL !dlg%=0
IF !dlg% THEN PROC_closedialog(dlg%)
STOP
REM DEF PROC_1 ADDED by Chris Coxall
REM Copies WINLIB prefix to DLG code and PROC_showdialog sufix
REM and loads it into the clipboard
REM GLOBALvars Variable$,A$
DEF PROC_1
REM IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SYS "IsDlgButtonChecked", !dlg2%, 110 TO state3%
SYS "IsDlgButtonChecked", !dlg2%, 111 TO state4%
SYS "IsDlgButtonChecked", !dlg2%, 112 TO state5%
IF state3%=1 OR state4%=1 OR state5%=1 THEN
PROC_get
got$=text$
REM PRINTA$:H=GET
array=FN_split(text$, ",", a$())
FOR i=0 TO array-1
PRINTi, a$(i)
IF i=7 THEN
IF state3%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&100000"
IF state4%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&200000"
IF state5%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&300000"
ENDIF
NEXT i
PRINT new$
new$=FN_join(a$(), ",", array)
PRINT"array 7 ";new$
REM text$=new$
v=FN_findreplace(A$,got$,new$,I%)
text$=A$
PROC_clipwrite
SYS "SetDlgItemText", !dlg2%, 106, A$
ENDIF
REM JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
SYS "SetDlgItemText", !dlg2%, 106, A$
SYS "IsDlgButtonChecked", !dlg2%, 101 TO state%
IF state%=1 text$="INSTALL @lib$+""WINLIB"":INSTALL @lib$+""WINLIB2B"""\
\+CHR$13+CHR$10+A$ ELSE text$=A$
SYS "SetDlgItemText", !dlg2%, 106, text$
SYS "IsDlgButtonChecked", !dlg2%, 102 TO state2%
IF state2%=1 text$=text$+CHR$13+CHR$10+"PROC_showdialog("+FN_trim(Variable$)+")"
SYS "SetDlgItemText", !dlg2%, 106, text$
SYS "GlobalAlloc", &2000, LEN(text$)+1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
$$tmp% = text$
SYS "GlobalUnlock", hdata%
SYS "OpenClipboard", @hwnd%
SYS "EmptyClipboard"
SYS "SetClipboardData", 1, hdata%
SYS "CloseClipboard"
ENDPROC
DEF PROC_2
PRINT"CANCELED"
PROC_closedialog(dlg2%):QUIT
ENDPROC
REM PROC_loadclip ADDED by Chris Coxall
REM PROC_loadclip loads clipboard contents into file.
DEF PROC_loadclip
*| Load clipboard into OLD.dlg
LOCAL fi$,X
SYS "OpenClipboard", @hwnd%
SYS "GetClipboardData", 1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
SYS "GlobalUnlock", hdata%
SYS "CloseClipboard"
fi$= $$tmp%
X=OPENOUT"OLD.dlg"
PRINT#X,fi$
CLOSE#X
*| end of Load clipboard into OLD.dlg
ENDPROC
DEF FN_trim(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
DEF PROC_get
REM Read Clip Board
SYS "OpenClipboard", @hwnd%
SYS "GetClipboardData", 1 TO hdata%
IF hdata% THEN
SYS "GlobalLock", hdata% TO tmp%
text$ = $$tmp%
SYS "GlobalUnlock", hdata%
ENDIF
SYS "CloseClipboard"
ENDPROC
REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
REM String library v1.1, Richard Russell, 20-Mar-2010
;
REM Convert to lower case:
DEF FN_lower(A$)
SYS "CharLowerBuff", !^A$, LEN(A$)
= A$
;
REM Convert to upper case:
DEF FN_upper(A$)
SYS "CharUpperBuff", !^A$, LEN(A$)
= A$
;
REM Convert to 'title' case:
DEF FN_title(A$)
LOCAL S%
REPEAT
MID$(A$,S%+1,1) = FN_upper(MID$(A$,S%+1,1))
S% = INSTR(A$, " ", S%+1)
UNTIL S%=0
= A$
;
REM Convert to binary string:
DEF FN_binary(N%) = FN_tobase(N%,2,-32*(N%<0))
;
REM Convert N% to string in base B% with minimum M% digits:
DEF FN_tobase(N%,B%,M%)
LOCAL D%,A$
REPEAT
D% = N%MODB%
N% DIV= B%
IF D%<0 D% += B%:N% -= 1
A$ = CHR$(48 + D% - 7*(D%>9)) + A$
M% -= 1
UNTIL (N%=FALSE OR N%=TRUE) AND M%<=0
=A$
;
REM Replace all occurrences of O$ with N$ starting at I%:
REM The returned value is the number of replacements made
DEF FN_findreplace(RETURN A$,O$,N$,I%)
LOCAL C%
REPEAT
I% = INSTR(A$,O$,I%)
IF I% THEN
A$ = LEFT$(A$,I%-1)+N$+MID$(A$,I%+LEN(O$))
I% += LEN(N$)
C% += 1
ENDIF
UNTIL I% = 0
= C%
;
REM Replace all occurrences of O$ with N$ starting at I%:
REM This version performs a case-insensitive comparison
DEF FN_findreplacei(RETURN A$,O$,N$,I%)
LOCAL C%
REPEAT
I% = FN_instri(A$,O$,I%)
IF I% THEN
A$ = LEFT$(A$,I%-1)+N$+MID$(A$,I%+LEN(O$))
I% += LEN(N$)
C% += 1
ENDIF
UNTIL I% = 0
= C%
;
REM Search backwards from end of string:
DEF FN_instrr(A$, B$, S%)
LOCAL O%,P%
IF S%=0 S% = LEN(A$)
REPEAT
O% = P%
P% = INSTR(A$, B$, P%+1)
UNTIL P% = 0 OR P% > S%
= O%
;
REM Case-insensitive version of INSTR:
DEF FN_instri(A$, B$, S%)
= INSTR(FN_lower(A$), FN_lower(B$), S%)
;
REM Case-insensitive version of FN_instrr:
DEF FN_instrri(A$, B$, S%)
= FN_instrr(FN_lower(A$), FN_lower(B$), S%)
;
REM Remove leading and trailing spaces:
DEF FN_trim(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
;
DEF FN_trimleading(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
= A$
REM Split a string at specified delimiter:
REM A$ is the string to be split
REM d$ is the delimiter at which to split
REM a$() is an array to receive the parts (created if necessary)
REM The returned value is the number of array elements written
DEF FN_split(A$, d$, RETURN a$())
LOCAL C%, I%, N%, P%, Q%, R%
IF !^a$() N% = DIM(a$(),1)+1
FOR P% = 0 TO 1
I% = 0
R% = 0
REPEAT
Q% = R%
REPEAT
C% = INSTR(A$, d$, Q%+1)
Q% = INSTR(A$, """", Q%+1)
IF Q% IF C% > Q% THEN
Q% = INSTR(A$, """", Q%+1)
IF Q%=0 ERROR 100, "Mismatched quotes"
ELSE
Q% = 0
ENDIF
UNTIL Q% = 0
IF C% = 0 THEN C% = LEN(A$)+1
IF P% a$(I%) = MID$(A$, R%+1, C%-R%-1)
R% = C%+LEN(d$)-1
I% += 1
UNTIL R% >= LEN(A$)
IF P% = 0 IF N% < I% THEN
IF N% a$() = ""
!^a$() = 0
DIM a$(I%-1)
ENDIF
NEXT P%
= I%
;
REM Join array elements using specified delimiter:
DEF FN_join(a$(), d$, N%)
LOCAL I%,A$
FOR I% = 0 TO N%-1
IF I%=N%-1 d$=""
A$ += a$(I%) + d$
NEXT
= A$
DEF FN_trail(A$)
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
DEF FN_tabs(A$)
WHILE RIGHT$(A$)=CHR$9 A$=LEFT$(A$) : ENDWHILE
= A$
DEF FNrights(RETURN A$,x)
REM Gets a Sub String Right after a number of charactors from the left given by "x".
y=LEN A$-x
k$= RIGHT$(A$,y)
A$=LEFT$(A$,x)
=k$
REM YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
DEF PROC_clipwrite
REM text$ = "The five boxing wizards jump quickly"+CHR$13+CHR$10
SYS "GlobalAlloc", &2000, LEN(text$)+1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
$$tmp% = text$
SYS "GlobalUnlock", hdata%
SYS "OpenClipboard", @hwnd%
SYS "EmptyClipboard"
SYS "SetClipboardData", 1, hdata%
SYS "CloseClipboard"
ENDPROC
Using copy from the menu will open a text edit box with new DLG code listed.
One check box if ticked and after clicking OK will add INSTALL@lib$+"WINLIB" and INSTALL @lib$+"WINLIB2B" as a header to the code. The other check box if ticked will append “PROC_showdialog(dlg%)” to the code.
With these additions added the code can be pasted into a new blank BBC4W program page and the dialogue box for the code will be displayed when run. If errors are reported it will be usually because the dialogue code uses variables that have not been declared for the new program. Declaring values for these variables in a header for the code will enable the the code to be displayed when run.
BBC4W Code
REM Additiopns added to Visual Dialogue Box By Chris Coxall
REM COPY AND PASTE
REM PASTE: Dialogue box code selected and copied to clip board
REM from an open BBCBASIC program or idirectly from a text
REM editor.
REM It is saved to a flie and loaded back into DLGEDIT for
REM modification.
REM
REM COPY: Will display the code in an edit box.
REM Two check boxes allow optionally the dialogue box code to be
REM prefixed with INSTALL @lib$+"WINLIB" INSTALL @lib$+"WINLIB2B"
REM and added at the bottom of the code PROC_showdialog(dlg2%).
REM The code then can on it's own be pasted into the BBCBASIC IDE and RUN
REM. Visual Dialogue Box Editor for BBC BASIC for Windows
REM. Richard Russell, 26-Sep-2004; 17-Jun-2005; 12-Aug-2005; 09-Feb-2006; 20-Sep-2007
REM MODE 8
*ESC OFF
INSTALL @lib$+"WINLIB"
INSTALL @lib$+"WINLIB2B"
REM PROC_loadclip
REM
REM PRINT $$tmp%
Variable$=" "
REM Added Dialogue box by Chris Coxall
REM INSTALL @lib$+"WINLIB":INSTALL @lib$+"WINLIB2B"
dlg2%=FN_newdialog("Dialogue box",3,20,515,296,8,710)
dlg2%!16=&90C800C4
REM Button, BS_DEFPUSHBUTTON, WS_TABSTOP, WS_GROUP, WS_VISIBLE
PROC_dlgitem( dlg2%,"OK",1,14,235,56,14,&50030001,&80)
REM Button, BS_PUSHBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Cancel",2,79,235,56,14,&50010000,&80)
REM Edit box, ES_MULTILINE, ES_AUTOVSCROLL, ES_AUTOHSCROLL, ES_WANTRETURN, WS_VISIBLE
PROC_dlgitem( dlg2%,"",106,12,13,487,211,&50B010C4,&81)
REM Button, BS_AUTOCHECKBOX, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"INSTALL WINLIB WINLIB2B",101,145,232,108,19,&50010003,&80)
REM Button, BS_AUTOCHECKBOX, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"add PROC_showdialog(dlg2%)",102,270,232,110,16,&50010003,&80)
REM Group box, WS_GROUP, WS_VISIBLE
PROC_dlgitem( dlg2%,"EDIT BOX Add Scroll Bars",109,13,251,426,34,&50020007,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Horisontal Scroll Bar",110,103,264,96,15,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Vertical Scroll Bar",111,200,264,84,16,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"Add Horisontal and Vertical Scroll Bar",112,300,264,138,15,&50010009,&80)
REM Button, BS_AUTORADIOBUTTON, WS_TABSTOP, WS_VISIBLE
PROC_dlgitem( dlg2%,"NO",113,21,262,64,16,&50010009,&80)
REM PROC_showdialog(dlg2%)
Prop%=FN_newdialog("",220,40,185,242,8,1200)
PROC_static(Prop%,"",100,5,6,35,14,2)
PROC_static(Prop%,"Text:",101,72,6,35,14,2)
PROC_static(Prop%,"X position:",102,5,23,35,14,2)
PROC_static(Prop%,"Y position:",103,87,23,40,14,2)
PROC_static(Prop%,"Width:",104,5,40,35,14,2)
PROC_static(Prop%,"Height:",105,87,40,40,14,2)
PROC_editbox(Prop%,"",106,45,5,40,12,&80)
PROC_editbox(Prop%,"",107,114,5,60,12,&80)
PROC_editbox(Prop%,"",108,45,22,40,12,&2000)
PROC_editbox(Prop%,"",109,134,22,40,12,&2000)
PROC_editbox(Prop%,"",110,45,39,40,12,&2000)
PROC_editbox(Prop%,"",111,134,39,40,12,&2000)
PROC_groupbox(Prop%,"Styles",112,3,55,178,165,0)
I% = 116
FOR Y% = 65 TO 200 STEP 15
FOR X% = 10 TO 110 STEP 87
PROC_checkbox(Prop%,"",I%,X%,Y%,82,14,0):I% += 1
NEXT:NEXT
PROC_pushbutton(Prop%,"OK",1,5,225,50,14,&20001)
PROC_pushbutton(Prop%,"",2,67,225,50,14,0)
PROC_pushbutton(Prop%,"Apply",3,129,225,50,14,0)
SYS "CreatePopupMenu" TO hFile%
SYS "AppendMenu", hFile%, 0, 10, "&New"
SYS "AppendMenu", hFile%, 0, 11, "&Load..."
SYS "AppendMenu", hFile%, 0, 12, "&Save"
SYS "AppendMenu", hFile%, 0, 13, "Save &As..."
SYS "AppendMenu", hFile%, 0, 19, "&Export..."
REM PASTE ADDED by Chris Coxall
SYS "AppendMenu", hFile%, 0, 114, "PASTE"
REM COPY ADDED by Chris Coxall
SYS "AppendMenu", hFile%, 0, 115, "COPY"
SYS "AppendMenu", hFile%, 0, 14, "E&xit"
SYS "CreateMenu" TO hMenu%
SYS "SetMenu", @hwnd%, hMenu%
SYS "AppendMenu", hMenu%, 16, hFile%, "&File"
SYS "AppendMenu", hMenu%, 0, 15, "&Help"
SYS "DrawMenuBar", @hwnd%
SYS "CreatePopupMenu" TO hAdd%
SYS "AppendMenu", hAdd%, 0, 20, "&Group Box"
SYS "AppendMenu", hAdd%, 0, 21, "&Pushbutton"
SYS "AppendMenu", hAdd%, 0, 22, "&Checkbox"
SYS "AppendMenu", hAdd%, 0, 23, "&Radiobutton"
SYS "AppendMenu", hAdd%, 0, 24, "&Editbox"
SYS "AppendMenu", hAdd%, 0, 25, "&Listbox"
SYS "AppendMenu", hAdd%, 0, 26, "Co&mbobox"
SYS "AppendMenu", hAdd%, 0, 27, "&Static"
SYS "CreatePopupMenu" TO hPopup%
SYS "AppendMenu", hPopup%, 16, hAdd%, "Add"
SYS "AppendMenu", hPopup%, 0, 31, "Move"
SYS "AppendMenu", hPopup%, 0, 32, "Move group"
SYS "AppendMenu", hPopup%, 0, 33, "Resize"
SYS "AppendMenu", hPopup%, 0, 34, "Copy"
SYS "AppendMenu", hPopup%, 0, 35, "Paste"
SYS "AppendMenu", hPopup%, 0, 36, "Delete"
SYS "AppendMenu", hPopup%, 0, 37, "Properties"
DIM Old% 3, P% 55, Text% 255
[OPT 2
.K%
mov eax,[esp+12]
mov ebx,[esp+16]
push 0
push @hwnd%
push 0
push ebx
push eax
push &180
push hPopup%
call "TrackPopupMenu"
ret 16
.M%
cmp dword [esp+8],&500
jz K%
jmp [Old%]
]
SYS "SetWindowLong", @hwnd%, -4, M% TO !Old%
DIM t$(100),i%(100),x%(100),y%(100),w%(100),h%(100),s%(100),c%(100)
DIM Of{lStructSize%, hwndOwner%, hInstance%, lpstrFilter%, \
\ lpstrCustomFilter%, nMaxCustFilter%, nFilterIndex%, \
\ lpstrFile%, nMaxFile%, lpstrFileTitle%, \
\ nMaxFileTitle%, lpstrInitialDir%, lpstrTitle%, \
\ flags%, nFileOffset{l&,h&}, nFileExtension{l&,h&}, \
\ lpstrDefExt%, lCustData%, lpfnHook%, lpTemplateName%}
DIM Fn% 256
ff$ = "DLG files"+CHR$0+"*.DLG"+CHR$0+CHR$0
ex$ = "DLG"+CHR$0
Of.lStructSize% = DIM(Of{})
Of.hwndOwner% = @hwnd%
Of.lpstrFilter% = !^ff$
Of.lpstrFile% = Fn%
Of.lpstrDefExt% = !^ex$
Of.nMaxFile% = 256
Of.flags% = 6
DIM bu%(6),bi%(6)
bu%() = 11,1,2,6,7,8,0
bi%() = 15,115,114,10,11,12,0
Ht% = FN_createtoolbar(7,bu%(),bi%())
Hs% = FN_createstatusbar("Right click in dialogue box to edit")
Dlg% = FN_newdialog("",0,0,0,0,0,10000)
nparts% = 6
DIM edges% nparts%*4-1
FOR N% = 0 TO nparts%-1
READ edges%!(N%*4)
NEXT N%
DATA 180, 300, 350, 440, 530, 640
SYS "SendMessage", Hs%, 1028, nparts%, edges%
Move% = 0
ON ERROR SYS "MessageBox", @hwnd%, REPORT$, 0, 48
ON CLOSE IF FNconfirm PROCexit ELSE RETURN
ON MOVE PROCmove(@msg%,@wparam%,@lparam%,Move%+1) : RETURN
ON SYS MenuCmd% = @wparam% : RETURN
PROCnew
PROCgetscale
MenuCmd% = 0
NextID% = 100
Changed% = FALSE
OFF
REPEAT
J% = FNwhereami
PROCnotify(J%)
MOUSE x%,y%,B%
SYS "GetCursorPos", ^X%
IF INKEY(-1) MOUSE ON 130 ELSE MOUSE ON 0
IF (J% >= 0) IF (B% AND 2) PROCmovesize(J%,x%(),y%(),134,0)
IF (J% >= 0) IF (B% AND 4) IF INKEY(-1) PROCmovesize(J%,w%(),h%(),130,0)
IF (J% >= 0) IF (B% AND 1) THEN
SYS "EnableMenuItem", hPopup%, 0, &400-(Num% >= 99)
SYS "EnableMenuItem", hPopup%, 32, -(c%(J%)<>&80 OR (s%(J%)AND7)<>7)
SYS "EnableMenuItem", hPopup%, 34, -(J% = 0)
SYS "EnableMenuItem", hPopup%, 35, -(s%(100) = 0)
SYS "EnableMenuItem", hPopup%, 36, -(J% = 0 OR Num% = 1)
SYS "SendMessage", @hwnd%, &500, X%, Y% TO cmd%
CASE cmd% OF
WHEN 20: PROCadd("Group Box", &50020007,&80, X%, Y%)
WHEN 21: PROCadd("Pushbutton", &50010000,&80, X%, Y%)
WHEN 22: PROCadd("Checkbox", &50010003,&80, X%, Y%)
WHEN 23: PROCadd("Radiobutton",&50010009,&80, X%, Y%)
WHEN 24: PROCadd("", &50810080,&81, X%, Y%)
WHEN 25: PROCadd("", &50A10000,&83, X%, Y%)
WHEN 26: PROCadd("", &50210003,&85, X%, Y%)
WHEN 27: PROCadd("Static", &50000000,&82, X%, Y%)
WHEN 31: PROCmovesize(J%,x%(),y%(),134,0)
WHEN 32: PROCmovesize(J%,x%(),y%(),134,1)
WHEN 33: PROCmovesize(J%,w%(),h%(),130,0)
WHEN 34: PROCcopy(J%)
WHEN 35: PROCpaste(X%,Y%)
WHEN 36: PROCdelete(J%)
WHEN 37: PROCproperties(J%)
ENDCASE
ENDIF
temp% = 0
SWAP temp%,MenuCmd%
CASE temp% OF
WHEN 2: PROCupdate(0)
WHEN 10: IF FNconfirm PROCnew
WHEN 11: IF FNconfirm PROCload
WHEN 12: IF FNsave Changed%=FALSE
WHEN 13: IF FNsaveas Changed%=FALSE
WHEN 14: IF FNconfirm PROCexit
REM WHEN 114 ADDED
WHEN 114: PROC_loadclip:PROC_paste
WHEN 15: PROChelp
REM WHEN 115: PROC_copy ADDED
WHEN 115: PROC_copy
WHEN 19: PROCexport
OTHERWISE SYS "Sleep", 0
ENDCASE
UNTIL INKEY(1)=0
DEF FNwhereami:LOCAL A%,I%,J%,K%,T%,U%,V%,W%,X%,Y%,Z%:REM GLOBAL Num%,Dlg%
SYS "GetForegroundWindow" TO W%
IF W% <> !Dlg% AND W% <> @hwnd% THEN = -1
SYS "GetCursorPos", ^X%
SYS "GetWindowRect", !Dlg%, ^T%
SYS "PtInRect", ^T%, X%, Y% TO K%
IF K% = 0 THEN = -1
A% = &7FFFFFFF
J% = 0
FOR I% = 1 TO Num%
T% = x%(I%)
U% = y%(I%)
V% = T% + w%(I%)
W% = U% + h%(I%)
SYS "MapDialogRect", !Dlg%, ^T%
SYS "ClientToScreen", !Dlg%, ^T%
SYS "ClientToScreen", !Dlg%, ^V%
SYS "PtInRect", ^T%, X%, Y% TO K%
IF K% THEN
Z% = w%(I%) * h%(I%)
IF Z% < A% A% = Z% : J% = I%
ENDIF
NEXT I%
= J%
DEF PROCupdate(T%):LOCAL I%,L%,F%,S%,X%,Y%,t$:REM GLOBAL Dlg%,Num%
Dlg%!16 = s%(0)
Dlg%!20 = 0
Dlg%!24 = 0
Dlg%!26 = x%(0)
Dlg%!28 = y%(0)
Dlg%!30 = w%(0)
Dlg%!32 = h%(0)
Dlg%!34 = 0
SYS "MultiByteToWideChar", 0, 0, t$(0), LENt$(0), Dlg%+38, 256 TO L%
Dlg%!(2*L%+38) = 0
Dlg%!(2*L%+40) = i%(0)
SYS "MultiByteToWideChar", 0, 0, "MS Sans Serif", 13, Dlg%+2*L%+42, 256 TO F%
Dlg%!(2*L%+2*F%+42) = 0
Dlg%!12 = Dlg%+2*L%+2*F%+44
FOR I% = 1 TO Num%
t$ = t$(I%)
IF T% IF c%(I%)=&80 IF (s%(I%)AND7)<>7 IF (s%(I%)AND7)>1 t$ += STRING$(127-LENt$," ")
PROC_dlgitem(Dlg%,t$,i%(I%),x%(I%),y%(I%),w%(I%),h%(I%),s%(I%),c%(I%))
NEXT I%
IF !Dlg% PROC_closedialog(Dlg%)
SYS "GetCursorPos", ^X%
PROC_showdialog(Dlg%)
SYS "SetCursorPos", X%, Y%
SYS "GetSystemMenu", !Dlg%, 0 TO S%
SYS "DeleteMenu", S%, &F010, 0
SYS "DeleteMenu", S%, &F060, 0
ENDPROC
DEF PROCupdateitem(I%):REM GLOBAL Dlg%
LOCAL H%,V%,W%,X%,Y%
SYS "GetDlgItem", !Dlg%, i%(I%) TO H%
V% = x%(I%)
W% = y%(I%)
X% = x%(I%)+w%(I%)
Y% = y%(I%)+h%(I%)
SYS "MapDialogRect",!Dlg%,^V%
SYS "SetWindowPos",H%,0,V%,W%,X%-V%,Y%-W%,4+16+256
ENDPROC
DEF PROCnotify(J%):REM GLOBAL Hs%,Variable$
IF J% < 0 THEN
FOR J% = 1 TO 5
SYS "SendMessage", Hs%, 1025, J%, ""
NEXT
ENDPROC
ENDIF
SYS "SendMessage", Hs%, 1025, 1, t$(J%)
SYS "SendMessage", Hs%, 1025, 3, "posn = "+STR$x%(J%)+","+STR$y%(J%)
SYS "SendMessage", Hs%, 1025, 4, "size = "+STR$w%(J%)+","+STR$h%(J%)
SYS "SendMessage", Hs%, 1025, 5, "style = 0x"+STR$~s%(J%)
IF J% THEN
SYS "SendMessage", Hs%, 1025, 2, "id = "+STR$i%(J%)
ELSE
SYS "SendMessage", Hs%, 1025, 2, Variable$
ENDIF
ENDPROC
DEF PROCmove(M%,W%,L%,Move%):REM GLOBAL Hs%,Ht%,Dlg%,Move%
LOCAL V%,W%,X%,Y%
PRIVATE O%
SYS "PostMessage",Hs%,M%,W%,L%
SYS "PostMessage",Ht%,M%,W%,L%
IF !Dlg% IF M%=3 THEN
X% = x%(0)
Y% = y%(0)
SYS "MapDialogRect",!Dlg%,^V%
IF Move%>=O% SYS "SetWindowPos",!Dlg%,0,X%+((L%<<16)>>16),Y%+(L%>>16),0,0,5
O% = Move%
ENDIF
ENDPROC
DEF FNconfirm:LOCAL R%:REM GLOBAL Changed%
IF NOT Changed% THEN =TRUE
SYS "MessageBox",@hwnd%,"Save changes?","DLGEDIT",35 TO R%
IF R%=6 IF FNsave Changed%=FALSE:=TRUE
IF R%=7 Changed%=FALSE:=TRUE
=FALSE
DEF PROCtitle:REM GLOBAL Fn%
SYS "SetWindowText",@hwnd%,"DLGEDIT-"+$$Fn%
ENDPROC
DEF PROCexit
IF !Dlg% PROC_closedialog(Dlg%)
IF !Prop% PROC_closedialog(Prop%)
PROC_removestatusbar
PROC_removetoolbar
QUIT
DEF PROCgetscale:LOCAL T%,U%,V%,W%:REM GLOBAL Dlg%,XScale,Yscale
T% = 100 : V% = T%
U% = 100 : W% = U%
SYS "MapDialogRect", !Dlg%, ^T%
Xscale = 100/T%
Yscale = 100/U%
ENDPROC
DEF PROCadd(T$,S%,C%,X%,Y%):REM GLOBAL Dlg%,Xscale,Yscale,Num%,NextID%,Changed%
SYS "ScreenToClient", !Dlg%, ^X%
IF X% < 0 ENDPROC
X% *= Xscale
Y% *= Yscale
Num% += 1
t$(Num%) = T$
i%(Num%) = NextID%
x%(Num%) = X%
y%(Num%) = Y%
w%(Num%) = 64
IF C% = &85 h%(Num%) = 60 ELSE h%(Num%) = 16
s%(Num%) = S%
c%(Num%) = C%
NextID% += 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCmovesize(J%,a%(),b%(),M%,G%):REM GLOBAL Xscale,Yscale,Num%,Changed%,Dlg%
LOCAL B%, I%, T%, U%, V%, W%, X%, Y%, oX%, oY%, x%, y%, F%, P%, Q%
IF c%(J%) = &85 SYS "SendDlgItemMessage", !Dlg%, i%(J%), &14F, 1, 0
REPEAT
MOUSE ON M%
MOUSE X%, Y%, B%
UNTIL B% AND 6
SYS "GetCursorPos", ^T%
x% = a%(J%) : y% = b%(J%)
oX% = -1 : oY% = -1
REPEAT
MOUSE ON M%
SYS "GetCursorPos", ^X%
IF (X% <> oX% OR Y% <> oY%) THEN
oX% = X% : oY% = Y%
V% = a%(J%) : W% = b%(J%)
a%(J%) = x% + (X%-T%)*Xscale
b%(J%) = y% + (Y%-U%)*Yscale
IF a%(J%) < 0 a%(J%) = 0
PROCupdateitem(J%)
IF G% THEN
X% = V%+w%(J%) : Y% = W%+h%(J%)
FOR I% = 1 TO Num%
SYS "PtInRect", ^V%, x%(I%), y%(I%) TO B%
IF (B% <> 0) AND (I% <> J%) THEN
x%(I%) += a%(J%)-V%
y%(I%) += b%(J%)-W%
PROCupdateitem(I%)
ENDIF
NEXT
ENDIF
V% = x%(0) : W% = y%(0)
X% = x%(0)+w%(0) : Y% = y%(0)+h%(0)
SYS "MapDialogRect",!Dlg%,^V%
P% = V% : Q% = W%
SYS "AdjustWindowRect", ^V%, s%(0), 0
X% -= V% : Y% -= W%
V% = P% : W% = Q%
P% = 0 : Q% = 0
SYS "ClientToScreen", @hwnd%, ^P%
SYS "SetWindowPos",!Dlg%,0,P%+V%,Q%+W%,X%,Y%,4
PROCnotify(J%)
F% = TRUE
ELSE
IF F% IF c%(J%) = &85 SYS "SendDlgItemMessage", !Dlg%, i%(J%), &14F, 1, 0
F% = FALSE
ENDIF
SYS "Sleep", 20
MOUSE X%, Y%, B%
UNTIL (B% AND 6) = 0
MOUSE ON 0
PROCupdate(1)
Changed% = TRUE
ENDPROC
DEF PROCcopy(J%)
IF J% = 0 ENDPROC
t$(100) = t$(J%)
i%(100) = i%(J%)
x%(100) = x%(J%)
y%(100) = y%(J%)
w%(100) = w%(J%)
h%(100) = h%(J%)
s%(100) = s%(J%)
c%(100) = c%(J%)
ENDPROC
DEF PROCpaste(X%,Y%):REM GLOBAL Dlg%,Xscale,Yscale,Num%,NextID%,Changed%
SYS "ScreenToClient", !Dlg%, ^X%
IF X% < 0 ENDPROC
X% *= Xscale
Y% *= Yscale
Num% += 1
t$(Num%) = t$(100)
i%(Num%) = NextID%
x%(Num%) = X%
y%(Num%) = Y%
w%(Num%) = w%(100)
h%(Num%) = h%(100)
s%(Num%) = s%(100)
c%(Num%) = c%(100)
NextID% += 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCdelete(J%):LOCAL I%:REM GLOBAL Num%,Changed%
IF J% = 0 ENDPROC
IF J% <> Num% THEN
FOR I% = J% TO Num%-1
t$(I%) = t$(I%+1)
i%(I%) = i%(I%+1)
x%(I%) = x%(I%+1)
y%(I%) = y%(I%+1)
w%(I%) = w%(I%+1)
h%(I%) = h%(I%+1)
s%(I%) = s%(I%+1)
c%(I%) = c%(I%+1)
NEXT
ENDIF
Num% -= 1
PROCupdate(0)
Changed% = TRUE
ENDPROC
DEF PROCproperties(J%):LOCAL H%,I%,t$,temp%:REM GLOBAL Prop%,Changed%,Variable$
PROC_showdialog(Prop%)
SYS "SetDlgItemText", !Prop%, 2, "Cancel"
IF J% THEN
SYS "SetDlgItemText", !Prop%, 100, "ID number:"
SYS "SetDlgItemText", !Prop%, 106, STR$(i%(J%))
ELSE
SYS "SetDlgItemText", !Prop%, 100, "Variable:"
SYS "SetDlgItemText", !Prop%, 106, Variable$
ENDIF
SYS "SetDlgItemText", !Prop%, 107, t$(J%)
SYS "SetDlgItemInt", !Prop%, 108, x%(J%), 1
SYS "SetDlgItemInt", !Prop%, 109, y%(J%), 1
SYS "SetDlgItemInt", !Prop%, 110, w%(J%), 0
SYS "SetDlgItemInt", !Prop%, 111, h%(J%), 0
c%(0) = &84
PROCrestore(c%(J%))
READ t$
SYS "SetWindowText", !Prop%, t$+" properties"
FOR I% = 0 TO 17
READ t$
IF t$ <> "" THEN
SYS "SetDlgItemText", !Prop%, I%+116, t$
ELSE
SYS "GetDlgItem", !Prop%, I%+116 TO H%
SYS "EnableWindow", H%, 0
ENDIF
SYS "CheckDlgButton", !Prop%, I%+116, -((s%(J%) AND (1 << I%)) <> 0)
NEXT
FOR I% = 27 TO 28
IF J% THEN
IF I% = 27 t$ = "WS_DISABLED" ELSE t$ = "WS_VISIBLE"
SYS "SetDlgItemText", !Prop%, I%+107, t$
ELSE
SYS "GetDlgItem", !Prop%, I%+107 TO H%
SYS "EnableWindow", H%, 0
ENDIF
SYS "CheckDlgButton", !Prop%, I%+107, -((s%(J%) AND (1 << I%)) <> 0)
NEXT
REPEAT
temp% = 0
SWAP temp%,MenuCmd%
IF temp% = 1 OR temp% = 3 THEN
SYS "GetDlgItemText", !Prop%, 106, Text%, 255
IF J%=0 Variable$ = $$Text% ELSE i%(J%) = VAL($$Text%)
SYS "GetDlgItemText", !Prop%, 107, Text%, 255
t$(J%) = $$Text%
SYS "GetDlgItemInt", !Prop%, 108, 0, 0 TO x%(J%)
SYS "GetDlgItemInt", !Prop%, 109, 0, 0 TO y%(J%)
SYS "GetDlgItemInt", !Prop%, 110, 0, 0 TO w%(J%)
SYS "GetDlgItemInt", !Prop%, 111, 0, 0 TO h%(J%)
FOR I% = 0 TO 17
SYS "IsDlgButtonChecked", !Prop%, I%+116 TO H%
s%(J%) = s%(J%) AND NOT (1 << I%) OR (H% << I%)
NEXT
FOR I% = 27 TO 28
SYS "IsDlgButtonChecked", !Prop%, I%+107 TO H%
s%(J%) = s%(J%) AND NOT (1 << I%) OR (H% << I%)
NEXT
SYS "SetDlgItemText", !Prop%, 2, "Close"
PROCupdate(1)
PROCnotify(J%)
Changed% = TRUE
ELSE
SYS "Sleep", 0
ENDIF
UNTIL (!Prop% = 0) OR (temp% = 1) OR (temp% = 2)
IF !Prop% PROC_closedialog(Prop%)
ENDPROC
DEF PROCnew:REM GLOBAL Fn%,Num%,NextID%,Variable$
?Fn% = 0
PROCtitle
Num% = 2
NextID% = 100
Variable$ = "dlg%"
t$() = "Dialogue box","OK","Cancel"
i%() = 8,1,2
x%() = 50,12,92
y%() = 50,108,108
w%() = 160,56,56
h%() = 128,14,14
s%() = &90C800C4,&50030001,&50010000
c%() = 0,&80,&80
PROCupdate(0)
ENDPROC
DEF PROCload:LOCAL F%,I%,A$:REM GLOBAL Fn%,Of{},Num%,NextID%
?Fn% = 0
SYS "GetOpenFileName",Of{} TO F% : IF F% = 0 THEN ENDPROC
PROCtitle
F% = OPENIN($$Fn%)
IF F% THEN
Num% = 0
NextID% = 100
s%(0) = &90C800C4
REPEAT
INPUT #F%, A$ : IF ASCA$ = 10 A$ = MID$(A$,2)
I% = INSTR(A$,"!16="):IF I% s%(0)=EVALMID$(A$,I%+4)
I% = INSTR(A$,"FN_newdialog("):IF I% PROCscan(A$,I%+13,0)
I% = INSTR(A$,"PROC_dlgitem("):IF I% Num% += 1:PROCscan(A$,I%+13,Num%)
UNTIL EOF#F%
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot open file", 0, 64
ENDIF
PROCupdate(0)
ENDPROC
DEF FNsaveas:LOCAL F%:REM GLOBAL Fn%,Of{}
?Fn% = 0
SYS "GetSaveFileName",Of{} TO F% : IF F% = 0 THEN = 0
PROCtitle
REM FNsave ALTERED
DEF FNsave:LOCAL F%:REM IF ?Fn%=0 THEN =FNsaveas
F% = OPENOUT "OLD.dlg"
IF F% THEN
PROCupdate(0)
PROCwrite(F%,0)
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
= F%
DEF PROCexport
LOCAL B%,F%,N%,F$,E$,eofn{}
DIM eofn{} = Of{}, N% LOCAL 256
F$ = "BBC BASIC file"+CHR$0+"*.BBC"+CHR$0+CHR$0
E$ = "BBC"+CHR$0
REPEAT
F% = INSTR($$Fn%,".",B%+1)
B% = INSTR($$Fn%,"\",B%+1)
UNTIL B%=0
$$N% = LEFT$($$Fn%,F%-1)
eofn.lStructSize% = DIM(eofn{})
eofn.hwndOwner% = @hwnd%
eofn.lpstrFilter% = !^F$
eofn.lpstrFile% = N%
eofn.lpstrDefExt% = !^E$
eofn.nMaxFile% = 256
eofn.flags% = 6
SYS "GetSaveFileName", eofn{} TO F% : IF F%=0 THEN ENDPROC
F% = OPENOUT($$N%)
IF F% THEN
PROCupdate(0)
PROCout(F%,1,"REM This code is generated automatically - do not edit!")
PROCwrite(F%,1)
BPUT #F%,0:BPUT#F%,&FF:BPUT#F%,&FF
CLOSE#F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
ENDPROC
DEF PROCwrite(F%,T%) : REM GLOBAL Variable$,Num%
LOCAL B%,I%,c$,t$
PROCout(F%,T%,Variable$+"=FN_newdialog("""+t$(0)+""","+STR$x%(0)+","+STR$y%(0)+","+STR$w%(0)+","+STR$h%(0)+","+STR$i%(0)+","+STR$(Dlg%!12-Dlg%+4)+")")
PROCout(F%,T%,Variable$+"!16=&"+STR$~s%(0))
FOR I% = 1 TO Num%
PROCrestore(c%(I%)) : READ c$
CASE c%(I%) OF
WHEN &80:
CASE s%(I%) AND 15 OF
WHEN 0: c$ += ", BS_PUSHBUTTON"
WHEN 1: c$ += ", BS_DEFPUSHBUTTON"
WHEN 2: c$ += ", BS_CHECKBOX"
WHEN 3: c$ += ", BS_AUTOCHECKBOX"
WHEN 4: c$ += ", BS_RADIOBUTTON"
WHEN 5: c$ += ", BS_3STATE"
WHEN 6: c$ += ", BS_AUTO3STATE"
WHEN 7: c$ = "Group box"
WHEN 8: c$ += ", BS_USERBUTTON"
WHEN 9: c$ += ", BS_AUTORADIOBUTTON"
WHEN 10: c$ += ", BS_PUSHBOX"
WHEN 11: c$ += ", BS_OWNERDRAW"
ENDCASE
WHEN &82:
CASE s%(I%) AND 31 OF
WHEN 0: c$ += ", SS_LEFT"
WHEN 1: c$ += ", SS_CENTER"
WHEN 2: c$ += ", SS_RIGHT"
WHEN 3: c$ += ", SS_ICON"
WHEN 4: c$ += ", SS_BLACKRECT"
WHEN 5: c$ += ", SS_GRAYRECT"
WHEN 6: c$ += ", SS_WHITERECT"
WHEN 7: c$ += ", SS_BLACKFRAME"
WHEN 8: c$ += ", SS_GRAYFRAME"
WHEN 9: c$ += ", SS_WHITEFRAME"
WHEN 10: c$ += ", SS_USERITEM"
WHEN 11: c$ += ", SS_SIMPLE"
WHEN 12: c$ += ", SS_LEFTNOWORDWRAP"
WHEN 13: c$ += ", SS_OWNERDRAW"
WHEN 14: c$ += ", SS_BITMAP"
WHEN 15: c$ += ", SS_ENHMETAFILE"
WHEN 16: c$ += ", SS_ETCHEDHORZ"
WHEN 17: c$ += ", SS_ETCHEDVERT"
WHEN 18: c$ += ", SS_ETCHEDFRAME"
ENDCASE
ENDCASE
FOR B% = 0 TO 17
READ t$ : IF s%(I%) AND 2^B% IF LEN(t$) > 2 THEN c$ += ", "+t$
NEXT
IF s%(I%) AND &8000000 THEN c$ += ", WS_DISABLED"
IF s%(I%) AND &10000000 THEN c$ += ", WS_VISIBLE"
PROCout(F%,T%,"REM "+c$)
PROCout(F%,T%,"PROC_dlgitem("+Variable$+","""+t$(I%)+""","+STR$i%(I%)+","+STR$x%(I%)+","+STR$y%(I%)+","+STR$w%(I%)+","+STR$h%(I%)+",&"+STR$~s%(I%)+",&"+STR$~c%(I%)+")")
NEXT
ENDPROC
DEF PROCout(F%,T%,A$)
IF T% THEN
IF EVAL("0:"+A$)
A$ = $(!332+2)
BPUT#F%,LENA$+4:BPUT#F%,0:BPUT#F%,0:PRINT #F%,A$
ELSE
PRINT #F%,A$ : BPUT#F%,10
ENDIF
ENDPROC
DEF PROCscan(A$,I%,J%):REM GLOBAL NextID%, Variable$
LOCAL E%
IF J%=0 E% = INSTR(A$,"=") : Variable$ = LEFT$(A$,E%-1)
IF J% I% = INSTR(A$,",",I%)+1
t$(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%+LENt$(J%))+1
IF J% i%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
x%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
y%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
w%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
h%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% s%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% c%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J%=0 i%(J%) = EVALMID$(A$,I%) : I% = INSTR(A$,",",I%)+1
IF J% IF i%(J%) >= NextID% NextID% = i%(J%) + 1
ENDPROC
DEF PROChelp:LOCAL H$
H$ = "Right click in dialogue box to edit contents."+CHR$13
H$ += "Middle button is shortcut for 'Move' command."+CHR$13
H$ += "Shift + left button is shortcut for 'Resize'."+CHR$13
H$ += "When dialogue box is complete, save to file."+CHR$13
H$ += "Insert the file into your BBC BASIC program;"+CHR$13
H$ += "alternatively export to a tokenised file and"+CHR$13
H$ += "incorporate it at run time using CALL ""dlgfile""."
SYS "MessageBox", @hwnd%, H$, "Help", 0
ENDPROC
DEF PROCrestore(C%)
RESTORE +(C% - &7F)
DATA Button,1,2,4,8,,BS_LEFTTEXT,BS_ICON,BS_BITMAP,BS_LEFT,BS_RIGHT,BS_TOP,BS_BOTTOM,BS_PUSHLIKE,BS_MULTILINE,BS_NOTIFY,BS_FLAT,WS_TABSTOP,WS_GROUP
DATA Edit box,ES_CENTER,ES_RIGHT,ES_MULTILINE,ES_UPPERCASE,ES_LOWERCASE,ES_PASSWORD,ES_AUTOVSCROLL,ES_AUTOHSCROLL,ES_NOHIDESEL,,ES_OEMCONVERT,ES_READONLY,ES_WANTRETURN,ES_NUMBER,,,WS_TABSTOP,WS_GROUP
DATA Static control,1,2,4,8,16,,,SS_NOPREFIX,SS_NOTIFY,SS_CENTERIMAGE,SS_RIGHTJUST,SS_REALSIZEIMAGE,SS_SUNKEN,,SS_ENDELLIPSIS,SS_PATHELLIPSIS,WS_TABSTOP,WS_GROUP
DATA List box,LBS_NOTIFY,LBS_SORT,LBS_NOREDRAW,LBS_MULTIPLESEL,LBS_OWNERFIXED,LBS_OWNERVAR,LBS_HASSTRINGS,LBS_USETABSTOPS,LBS_NOINTEGRALH,LBS_MULTICOLUMN,LBS_WANTINPUT,LBS_EXTENDELSEL,LBS_DISABLENOSC,LBS_NODATA,LBS_NOSEL,,WS_TABSTOP,WS_GROUP
DATA Dialogue box,DS_ABSALIGN,DS_SYSMODAL,,DS_FIXEDSYS,DS_NOFAILCREATE,,,,DS_NOIDLEMESG,DS_SETFOREGRND,DS_CONTROL,DS_CENTER,DS_CENTERMOUSE,DS_CONTEXTHELP,,,,
DATA Combo box,CBS_SIMPLE,CBS_DROPDOWN,,,CBS_OWNERFIXED,CBS_OWNERVAR,CBS_AUTOHSCROLL,CBS_OEMCONVERT,CBS_SORT,CBS_HASSTRINGS,CBS_NOINTEGRALH,CBS_DISABLENOSC,,CBS_UPPERCASE,CBS_LOWERCASE,,WS_TABSTOP,WS_GROUP
ENDPROC
REM PROC_paste Added by Chris Coxall
DEF PROC_paste:LOCAL F%,I%,A$:REM GLOBAL Fn%,Of{},Num%,NextID%
F% = OPENIN "OLD.dlg"
IF F% THEN
Num% = 0
NextID% = 100
s%(0) = &90C800C4
REPEAT
INPUT #F%, A$ : IF ASCA$ = 10 A$ = MID$(A$,2)
I% = INSTR(A$,"!16="):IF I% s%(0)=EVALMID$(A$,I%+4)
I% = INSTR(A$,"FN_newdialog("):IF I% PROCscan(A$,I%+13,0)
I% = INSTR(A$,"PROC_dlgitem("):IF I% Num% += 1:PROCscan(A$,I%+13,Num%)
UNTIL EOF#F%
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot open file", 0, 64
ENDIF
PROCupdate(0)
ENDPROC
DEF FN_copy:LOCAL F%:REM GLOBAL Fn%,Of{}
?Fn% = 0
REM PROC_copy ADDED by Chris Coxall
DEF PROC_copy:LOCAL F%:
F% = OPENOUT "NEW.dlg"
IF F% THEN
PROCupdate(0)
PROCwrite(F%,0)
CLOSE #F%
ELSE
SYS "MessageBox", @hwnd%, "Cannot create file", 0, 64
ENDIF
X=OPENIN "NEW.dlg"
REM A$=CHR$13+CHR$10
A$=""
REPEAT
N=BGET#X
A$=A$+CHR$(N)
UNTIL PTR#X=EXT#X
CLOSE#X
text$=A$
PROC_showdialog(dlg2%)
SYS "SetDlgItemText", !dlg2%, 106, text$
REPEAT
click% = 0
ON SYS click% = @wparam% AND &FFFF : RETURN
REPEAT pause% = INKEY(1) : UNTIL click% OR !dlg% = 0
ON SYS OFF
CASE click% OF
WHEN 1 PROC_1
WHEN 2 PROC_closedialog(dlg2%):QUIT
ENDCASE
UNTIL !dlg%=0
IF !dlg% THEN PROC_closedialog(dlg%)
STOP
REM DEF PROC_1 ADDED by Chris Coxall
REM Copies WINLIB prefix to DLG code and PROC_showdialog sufix
REM and loads it into the clipboard
REM GLOBALvars Variable$,A$
DEF PROC_1
REM IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
SYS "IsDlgButtonChecked", !dlg2%, 110 TO state3%
SYS "IsDlgButtonChecked", !dlg2%, 111 TO state4%
SYS "IsDlgButtonChecked", !dlg2%, 112 TO state5%
IF state3%=1 OR state4%=1 OR state5%=1 THEN
PROC_get
got$=text$
REM PRINTA$:H=GET
array=FN_split(text$, ",", a$())
FOR i=0 TO array-1
PRINTi, a$(i)
IF i=7 THEN
IF state3%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&100000"
IF state4%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&200000"
IF state5%=1 new$=a$(7)+"+&300000":a$(7)=a$(7)+"+&300000"
ENDIF
NEXT i
PRINT new$
new$=FN_join(a$(), ",", array)
PRINT"array 7 ";new$
REM text$=new$
v=FN_findreplace(A$,got$,new$,I%)
text$=A$
PROC_clipwrite
SYS "SetDlgItemText", !dlg2%, 106, A$
ENDIF
REM JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
SYS "SetDlgItemText", !dlg2%, 106, A$
SYS "IsDlgButtonChecked", !dlg2%, 101 TO state%
IF state%=1 text$="INSTALL @lib$+""WINLIB"":INSTALL @lib$+""WINLIB2B"""\
\+CHR$13+CHR$10+A$ ELSE text$=A$
SYS "SetDlgItemText", !dlg2%, 106, text$
SYS "IsDlgButtonChecked", !dlg2%, 102 TO state2%
IF state2%=1 text$=text$+CHR$13+CHR$10+"PROC_showdialog("+FN_trim(Variable$)+")"
SYS "SetDlgItemText", !dlg2%, 106, text$
SYS "GlobalAlloc", &2000, LEN(text$)+1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
$$tmp% = text$
SYS "GlobalUnlock", hdata%
SYS "OpenClipboard", @hwnd%
SYS "EmptyClipboard"
SYS "SetClipboardData", 1, hdata%
SYS "CloseClipboard"
ENDPROC
DEF PROC_2
PRINT"CANCELED"
PROC_closedialog(dlg2%):QUIT
ENDPROC
REM PROC_loadclip ADDED by Chris Coxall
REM PROC_loadclip loads clipboard contents into file.
DEF PROC_loadclip
*| Load clipboard into OLD.dlg
LOCAL fi$,X
SYS "OpenClipboard", @hwnd%
SYS "GetClipboardData", 1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
SYS "GlobalUnlock", hdata%
SYS "CloseClipboard"
fi$= $$tmp%
X=OPENOUT"OLD.dlg"
PRINT#X,fi$
CLOSE#X
*| end of Load clipboard into OLD.dlg
ENDPROC
DEF FN_trim(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
DEF PROC_get
REM Read Clip Board
SYS "OpenClipboard", @hwnd%
SYS "GetClipboardData", 1 TO hdata%
IF hdata% THEN
SYS "GlobalLock", hdata% TO tmp%
text$ = $$tmp%
SYS "GlobalUnlock", hdata%
ENDIF
SYS "CloseClipboard"
ENDPROC
REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
REM String library v1.1, Richard Russell, 20-Mar-2010
;
REM Convert to lower case:
DEF FN_lower(A$)
SYS "CharLowerBuff", !^A$, LEN(A$)
= A$
;
REM Convert to upper case:
DEF FN_upper(A$)
SYS "CharUpperBuff", !^A$, LEN(A$)
= A$
;
REM Convert to 'title' case:
DEF FN_title(A$)
LOCAL S%
REPEAT
MID$(A$,S%+1,1) = FN_upper(MID$(A$,S%+1,1))
S% = INSTR(A$, " ", S%+1)
UNTIL S%=0
= A$
;
REM Convert to binary string:
DEF FN_binary(N%) = FN_tobase(N%,2,-32*(N%<0))
;
REM Convert N% to string in base B% with minimum M% digits:
DEF FN_tobase(N%,B%,M%)
LOCAL D%,A$
REPEAT
D% = N%MODB%
N% DIV= B%
IF D%<0 D% += B%:N% -= 1
A$ = CHR$(48 + D% - 7*(D%>9)) + A$
M% -= 1
UNTIL (N%=FALSE OR N%=TRUE) AND M%<=0
=A$
;
REM Replace all occurrences of O$ with N$ starting at I%:
REM The returned value is the number of replacements made
DEF FN_findreplace(RETURN A$,O$,N$,I%)
LOCAL C%
REPEAT
I% = INSTR(A$,O$,I%)
IF I% THEN
A$ = LEFT$(A$,I%-1)+N$+MID$(A$,I%+LEN(O$))
I% += LEN(N$)
C% += 1
ENDIF
UNTIL I% = 0
= C%
;
REM Replace all occurrences of O$ with N$ starting at I%:
REM This version performs a case-insensitive comparison
DEF FN_findreplacei(RETURN A$,O$,N$,I%)
LOCAL C%
REPEAT
I% = FN_instri(A$,O$,I%)
IF I% THEN
A$ = LEFT$(A$,I%-1)+N$+MID$(A$,I%+LEN(O$))
I% += LEN(N$)
C% += 1
ENDIF
UNTIL I% = 0
= C%
;
REM Search backwards from end of string:
DEF FN_instrr(A$, B$, S%)
LOCAL O%,P%
IF S%=0 S% = LEN(A$)
REPEAT
O% = P%
P% = INSTR(A$, B$, P%+1)
UNTIL P% = 0 OR P% > S%
= O%
;
REM Case-insensitive version of INSTR:
DEF FN_instri(A$, B$, S%)
= INSTR(FN_lower(A$), FN_lower(B$), S%)
;
REM Case-insensitive version of FN_instrr:
DEF FN_instrri(A$, B$, S%)
= FN_instrr(FN_lower(A$), FN_lower(B$), S%)
;
REM Remove leading and trailing spaces:
DEF FN_trim(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
;
DEF FN_trimleading(A$)
WHILE ASC(A$)=32 A$=MID$(A$,2) : ENDWHILE
= A$
REM Split a string at specified delimiter:
REM A$ is the string to be split
REM d$ is the delimiter at which to split
REM a$() is an array to receive the parts (created if necessary)
REM The returned value is the number of array elements written
DEF FN_split(A$, d$, RETURN a$())
LOCAL C%, I%, N%, P%, Q%, R%
IF !^a$() N% = DIM(a$(),1)+1
FOR P% = 0 TO 1
I% = 0
R% = 0
REPEAT
Q% = R%
REPEAT
C% = INSTR(A$, d$, Q%+1)
Q% = INSTR(A$, """", Q%+1)
IF Q% IF C% > Q% THEN
Q% = INSTR(A$, """", Q%+1)
IF Q%=0 ERROR 100, "Mismatched quotes"
ELSE
Q% = 0
ENDIF
UNTIL Q% = 0
IF C% = 0 THEN C% = LEN(A$)+1
IF P% a$(I%) = MID$(A$, R%+1, C%-R%-1)
R% = C%+LEN(d$)-1
I% += 1
UNTIL R% >= LEN(A$)
IF P% = 0 IF N% < I% THEN
IF N% a$() = ""
!^a$() = 0
DIM a$(I%-1)
ENDIF
NEXT P%
= I%
;
REM Join array elements using specified delimiter:
DEF FN_join(a$(), d$, N%)
LOCAL I%,A$
FOR I% = 0 TO N%-1
IF I%=N%-1 d$=""
A$ += a$(I%) + d$
NEXT
= A$
DEF FN_trail(A$)
WHILE RIGHT$(A$)=" " A$=LEFT$(A$) : ENDWHILE
= A$
DEF FN_tabs(A$)
WHILE RIGHT$(A$)=CHR$9 A$=LEFT$(A$) : ENDWHILE
= A$
DEF FNrights(RETURN A$,x)
REM Gets a Sub String Right after a number of charactors from the left given by "x".
y=LEN A$-x
k$= RIGHT$(A$,y)
A$=LEFT$(A$,x)
=k$
REM YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
DEF PROC_clipwrite
REM text$ = "The five boxing wizards jump quickly"+CHR$13+CHR$10
SYS "GlobalAlloc", &2000, LEN(text$)+1 TO hdata%
SYS "GlobalLock", hdata% TO tmp%
$$tmp% = text$
SYS "GlobalUnlock", hdata%
SYS "OpenClipboard", @hwnd%
SYS "EmptyClipboard"
SYS "SetClipboardData", 1, hdata%
SYS "CloseClipboard"
ENDPROC