Global message base editor

This commit is contained in:
mysticbbs 2012-11-18 12:04:59 -05:00
parent 8a6800bba7
commit f0a7e470e1
7 changed files with 230 additions and 49 deletions

View File

@ -4921,3 +4921,9 @@
+ Added a message base packer and renumber option to mUtil. This replaces
MYSTPACK with the bonus that it also works with Squish (and appears to not
be as buggy as MYSTPACK was).
+ Added Global Message Base editor into the Message base editor. Use the
TAB key when in the Message base list to tag areas that you'd like to set
global values for. Then use /G to open the editor. Set the options you'd
like to change to "Yes" and then set the value for that option. Press
CTRL-U when ready to update all tagged bases with the selected values.

View File

@ -10,7 +10,7 @@ Uses
bbs_Common;
Const
FormMaxItems = 50;
FormMaxItems = 60;
Const
YesNoStr : Array[False..True] of String[03] = ('No', 'Yes');
@ -109,7 +109,7 @@ Type
Destructor Destroy; Override;
Procedure Clear;
Procedure AddNone (HK: Char; D: String; X, Y, DS: Byte; H: String);
Procedure AddNone (HK: Char; D: String; X, Y, FX, FY, DS: Byte; H: String);
Procedure AddStr (HK: Char; D: String; X, Y, FX, FY, DS, FS, MX: Byte; P: Pointer; H: String);
Procedure AddPipe (HK: Char; D: String; X, Y, FX, FY, DS, FS, MX: Byte; P: Pointer; H: String);
Procedure AddPath (HK: Char; D: String; X, Y, FX, FY, DS, FS, MX: Byte; P: Pointer; H: String);
@ -367,11 +367,11 @@ Begin
End;
End;
Procedure TAnsiMenuForm.AddNone (HK: Char; D: String; X, Y, DS: Byte; H: String);
Procedure TAnsiMenuForm.AddNone (HK: Char; D: String; X, Y, FX, FY, DS: Byte; H: String);
Begin
If Items = FormMaxItems Then Exit;
AddBasic (HK, D, X, Y, 0, 0, DS, 0, 0, ItemNone, NIL, H);
AddBasic (HK, D, X, Y, FX, FY, DS, 0, 0, ItemNone, NIL, H);
End;
Procedure TAnsiMenuForm.AddChar (HK: Char; D: String; X, Y, FX, FY, DS, MN, MX: Byte; P: Pointer; H: String);
@ -629,6 +629,7 @@ Var
Ch : Char;
NewPos : Word;
NewXPos : Word;
NewYPos : Word;
Begin
Session.io.AllowArrow := True;
@ -659,6 +660,36 @@ Begin
End;
Case Ch of
#72 : Begin
NewPos := 0;
NewYPos := 0;
For Count := 1 to Items Do
If (ItemData[Count]^.FieldX = ItemData[ItemPos]^.FieldX) and
(ItemData[Count]^.FieldY < ItemData[ItemPos]^.FieldY) and
(ItemData[Count]^.FieldY > NewYPos) Then Begin
NewPos := Count;
NewYPos := ItemData[Count]^.FieldY;
End;
If NewPos > 0 Then Begin
BarOFF(ItemPos);
ItemPos := NewPos;
BarON;
End Else
If ItemPos > 1 Then Begin
BarOFF(ItemPos);
Dec(ItemPos);
BarON;
End Else
If ExitOnFirst Then Begin
WasFirstExit := True;
Result := Ch;
Break;
End;
End;
(*
#72 : If ItemPos > 1 Then Begin
BarOFF(ItemPos);
Dec(ItemPos);
@ -669,6 +700,7 @@ Begin
Result := Ch;
Break;
End;
*)
#75 : Begin
NewPos := 0;
NewXPos := 0;
@ -705,6 +737,33 @@ Begin
BarON;
End;
End;
#80 : Begin
NewPos := 0;
For Count := 1 to Items Do
If (ItemData[Count]^.FieldX = ItemData[ItemPos]^.FieldX) and
(ItemData[Count]^.FieldY > ItemData[ItemPos]^.FieldY) Then Begin
NewPos := Count;
Break;
End;
If NewPos > 0 Then Begin
BarOFF(ItemPos);
ItemPos := NewPos;
BarON;
End Else
If ItemPos < Items Then Begin
BarOFF(ItemPos);
Inc(ItemPos);
BarON;
End Else
If ExitOnLast Then Begin
WasLastExit := True;
Result := Ch;
Break;
End;
End;
(*
#80 : If ItemPos < Items Then Begin
BarOFF(ItemPos);
Inc(ItemPos);
@ -715,6 +774,7 @@ Begin
Result := Ch;
Break;
End;
*)
End;
End Else Begin
Case Ch of

View File

@ -45,7 +45,7 @@ Begin
Box.Open (30, StartY, 51, StartY + Cmds + 1);
For Count := 1 to Cmds Do
Form.AddNone (CmdData[Count].Key, ' ' + CmdData[Count].Key + ' ' + CmdData[Count].Desc, 31, StartY + Count, 20, '');
Form.AddNone (CmdData[Count].Key, ' ' + CmdData[Count].Key + ' ' + CmdData[Count].Desc, 31, StartY + Count, 31, StartY + Count, 20, '');
Result := Form.Execute;

View File

@ -153,11 +153,11 @@ Begin
Case MenuPtr of
0 : Begin
Form.AddNone('C', ' Configuration ', 5, 2, 15, 'BBS configuration settings');
Form.AddNone('S', ' Servers ', 26, 2, 9, 'Mystic Internet Server (MIS) settings');
Form.AddNone('E', ' Editors ', 41, 2, 9, 'BBS configuration editors');
Form.AddNone('I', ' Info ', 56, 2, 6, 'BBS Information and Monitors');
Form.AddNone('X', ' Exit ' , 69, 2, 6, 'Exit configuration');
Form.AddNone('C', ' Configuration ', 5, 2, 5, 2, 15, 'BBS configuration settings');
Form.AddNone('S', ' Servers ', 26, 2, 26, 2, 9, 'Mystic Internet Server (MIS) settings');
Form.AddNone('E', ' Editors ', 41, 2, 41, 2, 9, 'BBS configuration editors');
Form.AddNone('I', ' Info ', 56, 2, 56, 2, 6, 'BBS Information and Monitors');
Form.AddNone('X', ' Exit ' , 69, 2, 69, 2, 6, 'Exit configuration');
Res := Form.Execute;
@ -180,17 +180,17 @@ Begin
BoxOpen (4, 4, 33, 16);
CoolBoxOpen (3, 'Configuration');
Form.AddNone ('S', ' S System Paths', 5, 5, 28, '');
Form.AddNone ('G', ' G General Settings', 5, 6, 28, '');
Form.AddNone ('L', ' L Login/Matrix Settings', 5, 7, 28, '');
Form.AddNone ('1', ' 1 New User Settings 1', 5, 8, 28, '');
Form.AddNone ('2', ' 2 New User Settings 2', 5, 9, 28, '');
Form.AddNone ('3', ' 3 New User Optional Fields', 5, 10, 28, '');
Form.AddNone ('F', ' F File Base Settings', 5, 11, 28, '');
Form.AddNone ('M', ' M Message Base Settings', 5, 12, 28, '');
Form.AddNone ('E', ' E Echomail Networks', 5, 13, 28, '');
Form.AddNone ('O', ' O Offline Mail Settings', 5, 14, 28, '');
Form.AddNone ('C', ' C Console Settings', 5, 15, 28, '');
Form.AddNone ('S', ' S System Paths', 5, 5, 5, 5, 28, '');
Form.AddNone ('G', ' G General Settings', 5, 6, 5, 6, 28, '');
Form.AddNone ('L', ' L Login/Matrix Settings', 5, 7, 5, 7, 28, '');
Form.AddNone ('1', ' 1 New User Settings 1', 5, 8, 5, 8, 28, '');
Form.AddNone ('2', ' 2 New User Settings 2', 5, 9, 5, 9, 28, '');
Form.AddNone ('3', ' 3 New User Optional Fields', 5, 10, 5, 10, 28, '');
Form.AddNone ('F', ' F File Base Settings', 5, 11, 5, 11, 28, '');
Form.AddNone ('M', ' M Message Base Settings', 5, 12, 5, 12, 28, '');
Form.AddNone ('E', ' E Echomail Networks', 5, 13, 5, 13, 28, '');
Form.AddNone ('O', ' O Offline Mail Settings', 5, 14, 5, 14, 28, '');
Form.AddNone ('C', ' C Console Settings', 5, 15, 5, 15, 28, '');
Res := Form.Execute;
MenuPos[1] := Form.ItemPos;
@ -224,12 +224,12 @@ Begin
BoxOpen (25, 4, 53, 11);
CoolBoxOpen (24, 'Servers');
Form.AddNone ('I', ' I Internet Server Options', 26, 5, 27, '');
Form.AddNone ('1', ' 1 Telnet Server Options', 26, 6, 27, '');
Form.AddNone ('2', ' 2 FTP Server Options', 26, 7, 27, '');
Form.AddNone ('3', ' 3 POP3 Server Options', 26, 8, 27, '');
Form.AddNone ('4', ' 4 SMTP Server Options', 26, 9, 27, '');
Form.AddNone ('5', ' 5 NNTP Server Options', 26, 10, 27, '');
Form.AddNone ('I', ' I Internet Server Options', 26, 5, 26, 5, 27, '');
Form.AddNone ('1', ' 1 Telnet Server Options', 26, 6, 26, 6, 27, '');
Form.AddNone ('2', ' 2 FTP Server Options', 26, 7, 26, 7, 27, '');
Form.AddNone ('3', ' 3 POP3 Server Options', 26, 8, 26, 8, 27, '');
Form.AddNone ('4', ' 4 SMTP Server Options', 26, 9, 26, 9, 27, '');
Form.AddNone ('5', ' 5 NNTP Server Options', 26, 10, 26, 10, 27, '');
Res := Form.Execute;
MenuPos[2] := Form.ItemPos;
@ -258,19 +258,19 @@ Begin
BoxOpen (38, 4, 64, 18);
CoolBoxOpen (39, 'Editors');
Form.AddNone ('U', ' U User Editor', 39, 5, 25, '');
Form.AddNone ('M', ' M Menu Editor', 39, 6, 25, '');
Form.AddNone ('T', ' T Theme/Prompt Editor', 39, 7, 25, '');
Form.AddNone ('B', ' B Message Base Editor', 39, 8, 25, '');
Form.AddNone ('G', ' G Message Group Editor', 39, 9, 25, '');
Form.AddNone ('F', ' F File Base Editor', 39, 10, 25, '');
Form.AddNone ('R', ' R File Group Editor', 39, 11, 25, '');
Form.AddNone ('S', ' S Security Level Editor', 39, 12, 25, '');
Form.AddNone ('A', ' A Archive Editor', 39, 13, 25, '');
Form.AddNone ('P', ' P Protocol Editor', 39, 14, 25, '');
Form.AddNone ('E', ' E Event Editor', 39, 15, 25, '');
Form.AddNone ('V', ' V Voting Editor', 39, 16, 25, '');
Form.AddNone ('L', ' L BBS List Editor', 39, 17, 25, '');
Form.AddNone ('U', ' U User Editor', 39, 5, 39, 5, 25, '');
Form.AddNone ('M', ' M Menu Editor', 39, 6, 39, 6, 25, '');
Form.AddNone ('T', ' T Theme/Prompt Editor', 39, 7, 39, 7, 25, '');
Form.AddNone ('B', ' B Message Base Editor', 39, 8, 39, 8, 25, '');
Form.AddNone ('G', ' G Message Group Editor', 39, 9, 39, 9, 25, '');
Form.AddNone ('F', ' F File Base Editor', 39, 10, 39, 10, 25, '');
Form.AddNone ('R', ' R File Group Editor', 39, 11, 39, 11, 25, '');
Form.AddNone ('S', ' S Security Level Editor', 39, 12, 39, 12, 25, '');
Form.AddNone ('A', ' A Archive Editor', 39, 13, 39, 13, 25, '');
Form.AddNone ('P', ' P Protocol Editor', 39, 14, 39, 14, 25, '');
Form.AddNone ('E', ' E Event Editor', 39, 15, 39, 15, 25, '');
Form.AddNone ('V', ' V Voting Editor', 39, 16, 39, 16, 25, '');
Form.AddNone ('L', ' L BBS List Editor', 39, 17, 39, 17, 25, '');
Res := Form.Execute;
MenuPos[3] := Form.ItemPos;
@ -306,7 +306,7 @@ Begin
BoxOpen (54, 4, 64, 6);
CoolBoxOpen (54, 'Info');
Form.AddNone ('A', ' A About', 55, 5, 9, '');
Form.AddNone ('A', ' A About', 55, 5, 55, 5, 9, '');
Res := Form.Execute;
MenuPos[4] := Form.ItemPos;

View File

@ -275,7 +275,7 @@ Begin
VerticalLine (24, 11, 14);
Form.AddNone ('C', ' Command ', 15, 11, 9, Topic + 'Menu command function');
Form.AddNone ('C', ' Command ', 15, 11, 26, 11, 9, Topic + 'Menu command function');
Form.AddStr ('D', ' Data ' , 18, 12, 26, 12, 6, 40, 160, @Menu.Item[Num]^.CmdData[CmdNum]^.Data, Topic + 'Menu command optional data');
Form.AddStr ('A', ' Access ' , 16, 13, 26, 13, 8, 30, 30, @Menu.Item[Num]^.CmdData[CmdNum]^.Access, Topic + 'Access level to run this command');
Form.AddTog ('G', ' Execute ', 15, 14, 26, 14, 9, 6, 0, 10, 'Selected Up Down Left Right Tab Escape PgUp PgDn Home End', @Menu.Item[Num]^.CmdData[CmdNum]^.JumpID, Topic + '(Grid) Execute command on what Grid event?');

View File

@ -11,6 +11,7 @@ Implementation
Uses
m_Strings,
m_FileIO,
m_Bits,
bbs_Ansi_MenuBox,
bbs_Ansi_MenuForm,
bbs_Cfg_Common,
@ -43,7 +44,7 @@ Begin
Form.AddStr ('R', ' Read ACS' , 7, 12, 19, 12, 10, 30, 30, @MBase.ReadACS, Topic + 'Access required to read messages');
Form.AddStr ('P', ' Post ACS' , 7, 13, 19, 13, 10, 30, 30, @MBase.PostACS, Topic + 'Access required to post messages');
Form.AddStr ('Y', ' Sysop ACS' , 6, 14, 19, 14, 11, 30, 30, @MBase.SysopACS, Topic + 'Access required for Sysop access');
Form.AddNone ('D', ' Net Address' , 4, 15, 13, Topic + 'NetMail Address');
Form.AddNone ('D', ' Net Address' , 4, 15, 19, 15, 13, Topic + 'NetMail Address');
Form.AddStr ('I', ' Origin' , 9, 16, 19, 16, 8, 30, 50, @MBase.Origin, Topic + 'Message base origin line');
Form.AddStr ('S', ' Sponsor' , 8, 17, 19, 17, 9, 30, 30, @MBase.Sponsor, Topic + 'User name of base''s sponser');
Form.AddStr ('H', ' Header' , 9, 18, 19, 18, 8, 20, 20, @MBase.Header, Topic + 'Display file name of msg header');
@ -93,8 +94,116 @@ Var
MBaseFile : TBufFile;
MBase : RecMessageBase;
Procedure GlobalEdit;
Procedure GlobalEdit (Global: RecMessageBase);
Const
ChangeStr = 'Change this value for all tagged bases?';
Var
GBox : TAnsiMenuBox;
Form : TAnsiMenuForm;
Active : Array[1..26] of Boolean;
Count : LongInt;
Topic : String;
Begin
FillChar (Active, SizeOf(Active), 0);
Topic := '|03(|09Global MsgBase Edit|03) |01-|09> |15';
GBox := TAnsiMenuBox.Create;
Form := TAnsiMenuForm.Create;
GBox.Header := ' CTRL-U/Update ESC/Abort ';
GBox.Open (6, 5, 75, 21);
VerticalLine (26, 7, 19);
VerticalLine (64, 7, 19);
For Count := 1 to 13 Do
Form.AddBol ('!', '> ', 8, 6 + Count, 10, 6 + Count, 2, 3, @Active[Count], Topic + ChangeStr);
Form.AddPath ('!', ' Path' , 20, 7, 28, 7, 6, 16, 80, @Global.Path, Topic + 'Message base storage path');
Form.AddStr ('L', ' List ACS' , 16, 8, 28, 8, 10, 16, 30, @Global.ListACS, Topic + 'Access required to see in base list');
Form.AddStr ('R', ' Read ACS' , 16, 9, 28, 9, 10, 16, 30, @Global.ReadACS, Topic + 'Access required to read messages');
Form.AddStr ('P', ' Post ACS' , 16, 10, 28, 10, 10, 16, 30, @Global.PostACS, Topic + 'Access required to post messages');
Form.AddStr ('Y', ' Sysop ACS' , 15, 11, 28, 11, 11, 16, 30, @Global.SysopACS, Topic + 'Access required for Sysop access');
Form.AddNone ('D', ' Net Address' , 13, 12, 28, 12, 13, Topic + 'NetMail Address');
Form.AddStr ('I', ' Origin' , 18, 13, 28, 13, 8, 16, 50, @Global.Origin, Topic + 'Message base origin line');
Form.AddStr ('S', ' Sponsor' , 17, 14, 28, 14, 9, 16, 30, @Global.Sponsor, Topic + 'User name of base''s sponser');
Form.AddStr ('H', ' Header' , 18, 15, 28, 15, 8, 16, 20, @Global.Header, Topic + 'Display file name of msg header');
Form.AddStr ('T', ' R Template' , 14, 16, 28, 16, 12, 16, 20, @Global.RTemplate, Topic + 'Template for full screen reader');
Form.AddStr ('M', ' L Template' , 14, 17, 28, 17, 12, 16, 20, @Global.ITemplate, Topic + 'Template for lightbar message list');
Form.AddTog ('A', ' Base Type' , 15, 18, 28, 18, 11, 9, 0, 3, 'Local EchoMail Newsgroup Netmail', @Global.NetType, Topic + 'Message base type');
Form.AddTog ('B', ' Base Format' , 13, 19, 28, 19, 13, 6, 0, 1, 'JAM Squish', @Global.BaseType, Topic + 'Message base storage format');
For Count := 1 to 13 Do
Form.AddBol ('!', '> ', 45, 6 + Count, 47, 6 + Count, 2, 3, @Active[Count + 13], Topic + ChangeStr);
Form.AddAttr ('Q', ' Quote Color' , 51, 7, 66, 7, 13, @Global.ColQuote, Topic + 'Color for quoted text');
Form.AddAttr ('X', ' Text Color' , 52, 8, 66, 8, 12, @Global.ColText, Topic + 'Color for message text');
Form.AddAttr ('E', ' Tear Color' , 52, 9, 66, 9, 12, @Global.ColTear, Topic + 'Color for tear line');
Form.AddAttr ('G', ' Origin Color', 50, 10, 66, 10, 14, @Global.ColOrigin, Topic + 'Color for origin line');
Form.AddAttr ('K', ' Kludge Color', 50, 11, 66, 11, 14, @Global.ColKludge, Topic + 'Color for kludge line');
Form.AddWord ('M', ' Max Msgs' , 54, 12, 66, 12, 10, 5, 0, 65535, @Global.MaxMsgs, Topic + 'Maximum number of message in base');
Form.AddWord ('1', ' Max Msg Age' , 51, 13, 66, 13, 13, 5, 0, 65535, @Global.MaxAge, Topic + 'Maximum age (days) to keep messages');
Form.AddTog ('2', ' New Scan' , 54, 14, 66, 14, 10, 6, 0, 2, 'No Yes Forced', @Global.DefNScan, Topic + 'Newscan default for users');
Form.AddTog ('3', ' QWK Scan' , 54, 15, 66, 15, 10, 6, 0, 2, 'No Yes Forced', @Global.DefQScan, Topic + 'QWKscan default for users');
Form.AddBits ('4', ' Real Names' , 52, 16, 66, 16, 12, MBRealNames, @Global.Flags, Topic + 'Use real names in this base?');
Form.AddBits ('5', ' Autosigs' , 54, 17, 66, 17, 10, MBAutoSigs, @Global.Flags, Topic + 'Allow auto signatures in this base?');
Form.AddBits ('6', ' Kill Kludge' , 51, 18, 66, 18, 13, MBKillKludge, @Global.Flags, Topic + 'Filter out kludge lines');
Form.AddBits ('V', ' Private' , 55, 19, 66, 19, 9, MBPrivate, @Global.Flags, Topic + 'Is this a private base?');
Form.LoExitChars := #21#27;
Repeat
Case Form.Execute of
'D' : Global.NetAddr := Configuration_EchoMailAddress(False);
#21 : If ShowMsgBox(1, 'Update with these settings?') Then Begin
For Count := 1 to List.ListMax Do
If List.List[Count]^.Tagged = 1 Then Begin
MBaseFile.Seek (Count - 1);
MBaseFile.Read (MBase);
If Active[01] Then MBase.Path := Global.Path;
If Active[02] Then MBase.ListACS := Global.ListACS;
If Active[03] Then MBase.ReadACS := Global.ReadACS;
If Active[04] Then MBase.PostACS := Global.PostACS;
If Active[05] Then MBase.SysopACS := Global.SysopACS;
If Active[06] Then MBase.NetAddr := Global.NetAddr;
If Active[07] Then MBase.Origin := Global.Origin;
If Active[08] Then MBase.Sponsor := Global.Sponsor;
If Active[09] Then MBase.Header := Global.Header;
If Active[10] Then MBase.RTemplate := Global.RTemplate;
If Active[11] Then MBase.ITemplate := Global.ITemplate;
If Active[12] Then MBase.NetType := Global.NetType;
If Active[13] Then MBase.BaseType := Global.BaseType;
If Active[14] Then MBase.ColQuote := Global.ColQuote;
If Active[15] Then MBase.ColText := Global.ColText;
If Active[16] Then MBase.ColTear := Global.ColTear;
If Active[17] Then MBase.ColOrigin := Global.ColOrigin;
If Active[18] Then MBase.ColKludge := Global.ColKludge;
If Active[19] Then MBase.MaxMsgs := Global.MaxMsgs;
If Active[20] Then MBase.MaxAge := Global.MaxAge;
If Active[21] Then MBase.DefNScan := Global.DefNScan;
If Active[22] Then MBase.DefQScan := Global.DefQScan;
If Active[23] Then BitSet(MBRealNames, SizeOf(MBase.Flags), MBase.Flags, (Global.Flags AND MBRealNames <> 0));
If Active[24] Then BitSet(MBAutoSigs, SizeOf(MBase.Flags), MBase.Flags, (Global.Flags AND MBAutoSigs <> 0));
If Active[25] Then BitSet(MBKillKludge, SizeOf(MBase.Flags), MBase.Flags, (Global.Flags AND MBKillKludge <> 0));
If Active[26] Then BitSet(MBPrivate, SizeOf(MBase.Flags), MBase.Flags, (Global.Flags AND MBPrivate <> 0));
MBaseFile.Seek (Count - 1);
MBaseFile.Write (MBase);
End;
Break;
End;
#27 : Break;
End;
Until False;
Form.Free;
GBox.Close;
GBox.Free;
End;
Procedure MakeList;
@ -240,8 +349,14 @@ Begin
End;
'G' : If List.Marked = 0 Then
ShowMsgBox(0, 'You must tag areas for global edit')
Else
GlobalEdit;
Else Begin
If List.Picked > 1 Then Begin
MBaseFile.Seek (List.Picked - 1);
MBaseFile.Read (MBase);
End;
GlobalEdit (MBase);
End;
End;
#13 : If List.Picked < List.ListMax Then Begin
MBaseFile.Seek (List.Picked - 1);

View File

@ -670,9 +670,9 @@ Begin
Form.AddBits ('C', ' Allow ASCII' , 10, 14, 25, 14, 13, ThmAllowASCII, @Theme.Flags, Topic + 'Allow ASCII users to use this theme?');
Form.AddBits ('N', ' Allow ANSI' , 11, 15, 25, 15, 12, ThmAllowANSI, @Theme.Flags, Topic + 'Allow ANSI users to use this theme?');
Form.AddNone ('1', ' 1: Prompts' , 57, 7, 17, Topic + 'Edit prompts for this theme');
Form.AddNone ('2', ' 2: Options' , 57, 8, 17, Topic + 'Edit general options for this theme');
Form.AddNone ('3', ' 3: Percent Bars', 57, 9, 17, Topic + 'Edit percentage bars used in this theme');
Form.AddNone ('1', ' 1: Prompts' , 57, 7, 57, 7, 17, Topic + 'Edit prompts for this theme');
Form.AddNone ('2', ' 2: Options' , 57, 8, 57, 8, 17, Topic + 'Edit general options for this theme');
Form.AddNone ('3', ' 3: Percent Bars', 57, 9, 57, 9, 17, Topic + 'Edit percentage bars used in this theme');
Repeat
Case Form.Execute of