Fixes and additions to Contest form

- Fixed non working dupe check (was upside down & NoMode4dupe not working at all)
    	- Fixed some texts,  anchoring and layouts
    	- Fixed tabulation stops setting
    	- Fixed status bar [0] text filtering (change 0x0A to | )
    	- Fixed help page

    	- Added contest name saving/loading with other settings
    	- Added "Clear all"-button to remove all saved settings (when start of new contest)

    	- Tested. Should now work as intended.
This commit is contained in:
OH1KH 2021-11-22 14:06:29 +02:00
parent 30264390d9
commit ad5b4bceed
5 changed files with 197 additions and 150 deletions

View File

@ -65,16 +65,20 @@ Contest window has a simple dupe check that turns typed duplicate callsign bold
<p>
Contest window has following fields and checkboxes:<br>
<ul>
<li><b>Tab All</b> when checked overrides all other Tab settings (below) and Tab Order is Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll</li>
<li><b>Tab in order</b> when checked overrides all other Tab settings (below) and Tab Order is Call-RSTs-NRs-MSGs-RSTr-NRr-MSGr-SaveQSO-ClearAll</li>
<li><b>Call</b> when you leave this field callsign is moved to NewQSO. Callsign turns BOLD RED if it is duplicate.</li>
<li><b>SPACE is TAB</b> when checked space bar acts like TAB-key moving to next field. <b>Note:</b>This prevents typing space (perhaps needed in MSG fields).</li>
<li><b>NoMode4Dupe</b> Default checked. Means that callsign is duplicate if it is worked on that band in any mode. There are contests where you can work same station again on same band if mode is different (separate CW,SBB,RTTY sections). In that case uncheck this checkbox.
<li><b>Dupe check</b> Default checked.
<li><b>NoMode4Dupe</b> Means that same callsign can be worked again on same band if mode is different.
</li>
<li><b>Ignore dupes</b> Do not check duplicate qsos at all.</li>
<br>
<li><b>RST s</b> copied from NewQSO, so should correspond used mode. Can be changed.</li>
<li><b>RST s</b> copied from NewQSO, so should correspond used mode. Can be changed.
<br><b> Note:</b> defaults to 599 (as NewQSO) If mode is not CW it will change after cursor leaves callsign column. So do not worry when working non-cw contest!</li>
<li><b>Tru</b> means you like to exchange true reports. Makes Tab order to stop at RST (s & r) fields. Useful in some high band contests, Es and tropo openings.</li>
<br>
<li><b>NR s</b> serial number to send. <b>Note:</b> you can type only numbers to NR s field.</li>
<li><b>NR s</b> serial number to send.
<br><b> Note:</b> you can type only numbers to NR s field.</li>
<li> <b>Inc</b> if checked it will auto increment serial number. You may change this number at any time. Increment goes on from typed number.</li>
<br>
<li><b>MSG s</b> sometimes you may need an additional message with number, or just a message with no number. On high band contests you may type your locator here.</li>
@ -82,15 +86,22 @@ Contest window has following fields and checkboxes:<br>
<br>
<li><b>RST r</b> copied from NewQSO, so should correspond used mode. Can be changed.</li>
<br>
<li><b>NR r</b> serial number you receive. <b>Note:</b> you can type only numbers to NR r field. </li>
<li><b>NR r</b> serial number you receive.
<br><b> Note:</b> you can type only numbers to NR r field. </li>
<li><b>No </b> if no serial number then setting this changes tab order so that it jumps directly to MSG r. </li>
<br>
<li><b>MSG r</b> message you receive</li>
<li> <b>MSG is LOC</b> if checked then message will be logged <b>ALSO</b> as locator grid <b>AND</b> SRX String</li>
<br>
<li><b>Save QSO</b> Save QSO button at NewQSO, increments NR and clears all fields. <b>Note:</b> pressing <b>ENTER at any time</b> after Call field is filled does the same.</li>
<li><b>Clear all</b> Clear all fields. <b>Note:</b> Pressing 2x ESC key does the same.</li>
<li><b>Save QSO</b> Save QSO button at NewQSO, increments NR and clears all fields.
<br><b> Note:</b> pressing <b>ENTER at any time</b> after Call field is filled does the same.</li>
<li><b>Clear QSO</b> Clear all QSO information.
<br><b> Note:</b> Pressing 2x ESC key does the same.</li>
<br><li><b>Clear all</b> Clear all fields. Usefull when starting a new contest to remove saved settings.</li>
</ul>
<br>
All settings, including contest name, are saved when closing contest form. When opening cqrlog and contest form again after rest period you can directly continue contest working.
</p>
<p>
<b>Typical contest qso goes like this:</b><br>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,26 +1,26 @@
object frmContest: TfrmContest
Left = 370
Height = 177
Height = 178
Top = 281
Width = 700
Width = 697
HelpType = htKeyword
HelpKeyword = 'help/contest.html'
Caption = 'Contest'
ClientHeight = 177
ClientWidth = 700
ClientHeight = 178
ClientWidth = 697
OnClose = FormClose
OnCreate = FormCreate
OnHide = FormHide
OnKeyDown = FormKeyDown
OnShow = FormShow
LCLVersion = '2.0.6.0'
LCLVersion = '2.0.12.0'
object edtCall: TEdit
AnchorSideLeft.Control = lblContestName
AnchorSideTop.Control = lblCall
AnchorSideTop.Side = asrBottom
Left = 17
Height = 25
Top = 59
Height = 33
Top = 55
Width = 140
AutoSelect = False
CharCase = ecUppercase
@ -35,20 +35,20 @@ object frmContest: TfrmContest
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtCall
Left = 157
Height = 25
Top = 59
Height = 33
Top = 55
Width = 50
OnKeyDown = edtCallKeyDown
TabOrder = 6
TabOrder = 7
end
object edtSTX: TEdit
AnchorSideLeft.Control = edtRSTs
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTs
Left = 207
Height = 25
Height = 33
Hint = 'contest serial number sent, max 6 characters'
Top = 59
Top = 55
Width = 50
MaxLength = 6
OnExit = edtSTXExit
@ -56,16 +56,16 @@ object frmContest: TfrmContest
OnKeyPress = edtSTXKeyPress
ParentShowHint = False
ShowHint = True
TabOrder = 7
TabOrder = 8
end
object edtSTXStr: TEdit
AnchorSideLeft.Control = edtSTX
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtSTX
Left = 257
Height = 25
Height = 33
Hint = 'contest exchange message sent, max 50 characters'
Top = 59
Top = 55
Width = 100
MaxLength = 50
OnEnter = edtSTXStrEnter
@ -73,15 +73,15 @@ object frmContest: TfrmContest
OnKeyDown = edtCallKeyDown
ParentShowHint = False
ShowHint = True
TabOrder = 8
TabOrder = 9
end
object edtRSTr: TEdit
AnchorSideLeft.Control = edtSTXStr
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtSTXStr
Left = 373
Height = 25
Top = 59
Height = 33
Top = 55
Width = 50
BorderSpacing.Left = 16
OnKeyDown = edtCallKeyDown
@ -92,9 +92,9 @@ object frmContest: TfrmContest
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTr
Left = 423
Height = 25
Height = 33
Hint = 'contest serial number received, max 6 characters'
Top = 59
Top = 55
Width = 50
MaxLength = 6
OnExit = edtSRXExit
@ -110,7 +110,7 @@ object frmContest: TfrmContest
AnchorSideTop.Control = lblMSGr
Left = 589
Height = 30
Top = 42
Top = 40
Width = 80
BorderSpacing.Left = 16
Caption = 'Save QSO'
@ -122,9 +122,9 @@ object frmContest: TfrmContest
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtRSTr
Left = 473
Height = 25
Height = 33
Hint = 'contest exchange message sent, max 50 characters'
Top = 59
Top = 55
Width = 100
MaxLength = 50
OnChange = edtSRXStrChange
@ -138,9 +138,9 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkTabAll
AnchorSideTop.Side = asrBottom
Left = 17
Height = 17
Top = 42
Width = 26
Height = 15
Top = 40
Width = 25
BorderSpacing.Top = 1
Caption = 'Call'
ParentColor = False
@ -148,8 +148,8 @@ object frmContest: TfrmContest
object lblRSTs: TLabel
AnchorSideTop.Control = lblCall
Left = 161
Height = 17
Top = 42
Height = 15
Top = 40
Width = 36
Caption = 'RST s'
ParentColor = False
@ -157,36 +157,36 @@ object frmContest: TfrmContest
object lblMSGs: TLabel
AnchorSideTop.Control = lblNRs
Left = 257
Height = 17
Top = 42
Width = 42
Height = 15
Top = 40
Width = 41
Caption = 'MSG s'
ParentColor = False
end
object lblRSTr: TLabel
AnchorSideTop.Control = lblMSGs
Left = 377
Height = 17
Top = 42
Width = 36
Height = 15
Top = 40
Width = 34
Caption = 'RST r'
ParentColor = False
end
object lblNRr: TLabel
AnchorSideTop.Control = lblRSTr
Left = 425
Height = 17
Top = 42
Width = 30
Height = 15
Top = 40
Width = 28
Caption = 'NR r'
ParentColor = False
end
object lblMSGr: TLabel
AnchorSideTop.Control = lblNRr
Left = 481
Height = 17
Top = 42
Width = 41
Height = 15
Top = 40
Width = 39
Caption = 'MSG r'
ParentColor = False
end
@ -195,20 +195,20 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkTrueRST
Left = 207
Height = 23
Top = 84
Top = 88
Width = 45
Caption = 'Inc'
OnChange = chkNRIncChange
OnClick = chkNRIncClick
TabOrder = 13
TabOrder = 14
TabStop = False
end
object lblNRs: TLabel
AnchorSideTop.Control = lblRSTs
Left = 209
Height = 17
Top = 42
Width = 31
Height = 15
Top = 40
Width = 30
Caption = 'NR s'
ParentColor = False
end
@ -217,10 +217,10 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkNoNr
Left = 473
Height = 23
Top = 84
Width = 102
Top = 88
Width = 101
Caption = 'MSG is LOC'
TabOrder = 14
TabOrder = 15
TabStop = False
end
object chkSpace: TCheckBox
@ -229,10 +229,10 @@ object frmContest: TfrmContest
AnchorSideTop.Side = asrBottom
Left = 17
Height = 23
Top = 84
Width = 114
Top = 88
Width = 113
Caption = 'SPACE is TAB'
TabOrder = 10
TabOrder = 11
TabStop = False
end
object chkNoNr: TCheckBox
@ -240,11 +240,11 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkNRInc
Left = 423
Height = 23
Top = 84
Width = 45
Top = 88
Width = 44
Caption = 'No'
OnChange = chkNoNrChange
TabOrder = 12
TabOrder = 13
TabStop = False
end
object chkTrueRST: TCheckBox
@ -252,31 +252,31 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkSpace
Left = 157
Height = 23
Top = 84
Width = 48
Top = 88
Width = 46
Caption = 'Tru'
OnChange = chkTrueRSTChange
TabOrder = 11
TabOrder = 12
TabStop = False
end
object btClearAll: TButton
object btClearQso: TButton
AnchorSideLeft.Control = btSave
AnchorSideTop.Control = btSave
AnchorSideTop.Side = asrBottom
Left = 589
Height = 30
Top = 74
Top = 72
Width = 80
BorderSpacing.Top = 2
Caption = 'Clear all'
OnClick = btClearAllClick
TabOrder = 5
Caption = 'Clear QSO'
OnClick = btClearQsoClick
TabOrder = 6
end
object btnHelp: TSpeedButton
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 672
Left = 669
Height = 25
Hint = 'Help'
Top = 3
@ -324,27 +324,29 @@ object frmContest: TfrmContest
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbContestName
Left = 17
Height = 17
Height = 15
Top = 1
Width = 95
Width = 91
BorderSpacing.Left = 17
Caption = 'Contest name'
ParentColor = False
end
object cmbContestName: TComboBox
AnchorSideLeft.Control = lblContestName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Owner
Left = 118
Height = 25
AnchorSideRight.Control = edtSRXStr
AnchorSideRight.Side = asrBottom
Left = 141
Height = 33
Hint = 'contestname, choose ADIF contest_id via combobox or type freestyle max 40 characters'
Top = 1
Width = 432
Anchors = [akTop, akRight]
AutoComplete = True
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending]
BorderSpacing.Left = 6
BorderSpacing.Left = 30
BorderSpacing.Top = 1
ItemHeight = 17
ItemHeight = 0
Items.Strings = (
'070-160M-SPRINT'
'070-3-DAY'
@ -574,7 +576,7 @@ object frmContest: TfrmContest
MaxLength = 40
ParentShowHint = False
ShowHint = True
TabOrder = 9
TabOrder = 10
TabStop = False
end
object chkQsp: TCheckBox
@ -582,11 +584,11 @@ object frmContest: TfrmContest
AnchorSideTop.Control = chkNRInc
Left = 257
Height = 23
Top = 84
Width = 53
Top = 88
Width = 51
Caption = 'Qsp'
OnChange = chkQspChange
TabOrder = 15
TabOrder = 16
TabStop = False
end
object chkTabAll: TCheckBox
@ -595,11 +597,11 @@ object frmContest: TfrmContest
AnchorSideTop.Side = asrBottom
Left = 17
Height = 23
Top = 18
Width = 74
Caption = 'TAB All'
Top = 16
Width = 106
Caption = 'TAB in order'
OnChange = chkTabAllChange
TabOrder = 16
TabOrder = 17
TabStop = False
end
object sbContest: TStatusBar
@ -607,9 +609,9 @@ object frmContest: TfrmContest
AnchorSideRight.Control = Owner
AnchorSideBottom.Control = Owner
Left = 0
Height = 22
Top = 155
Width = 700
Height = 18
Top = 160
Width = 697
Panels = <
item
Text = '0'
@ -638,9 +640,9 @@ object frmContest: TfrmContest
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbContestName
AnchorSideTop.Side = asrCenter
Left = 568
Left = 591
Height = 1
Top = 13
Top = 17
Width = 1
BorderSpacing.Left = 18
ParentColor = False
@ -651,41 +653,59 @@ object frmContest: TfrmContest
AnchorSideTop.Side = asrBottom
Left = 17
Height = 23
Top = 115
Width = 104
Top = 119
Width = 102
BorderSpacing.Left = 17
BorderSpacing.Top = 8
Caption = 'Dupe check'
Checked = True
TabOrder = 20
TabStop = True
TabOrder = 21
end
object rbNoMode4Dupe: TRadioButton
AnchorSideLeft.Control = rbDupeCheck
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = chkTrueRST
AnchorSideTop.Side = asrBottom
Left = 152
Left = 157
Height = 23
Top = 115
Width = 129
Top = 119
Width = 122
BorderSpacing.Left = 38
BorderSpacing.Top = 8
Caption = 'NoMode4Dupe'
TabOrder = 18
TabOrder = 19
end
object rbIgnoreDupes: TRadioButton
AnchorSideLeft.Control = rbNoMode4Dupe
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtSTXStr
AnchorSideTop.Side = asrBottom
Left = 311
Left = 317
Height = 23
Top = 115
Width = 115
Top = 119
Width = 110
BorderSpacing.Left = 38
BorderSpacing.Top = 31
Caption = 'Ignore dupes'
TabOrder = 19
TabOrder = 20
end
object btClearAll: TButton
AnchorSideLeft.Control = btSave
AnchorSideTop.Control = rbDupeCheck
AnchorSideTop.Side = asrCenter
Left = 589
Height = 30
Top = 115
Width = 80
Caption = 'Clear All'
OnClick = btClearAllClick
TabOrder = 5
TabStop = False
end
object tmrESC2: TTimer
Enabled = False
OnTimer = tmrESC2Timer
left = 672
top = 112
Left = 672
Top = 112
end
end

View File

@ -13,8 +13,9 @@ type
{ TfrmContest }
TfrmContest = class(TForm)
btClearAll: TButton;
btSave: TButton;
btClearAll : TButton;
btClearQso : TButton;
chkTabAll: TCheckBox;
chkQsp: TCheckBox;
chkTrueRST: TCheckBox;
@ -45,8 +46,9 @@ type
rbIgnoreDupes: TRadioButton;
sbContest: TStatusBar;
tmrESC2: TTimer;
procedure btClearAllClick(Sender: TObject);
procedure btSaveClick(Sender: TObject);
procedure btClearAllClick(Sender : TObject);
procedure btClearQsoClick(Sender : TObject);
procedure chkNoNrChange(Sender: TObject);
procedure chkNRIncChange(Sender: TObject);
procedure chkNRIncClick(Sender : TObject);
@ -78,7 +80,8 @@ type
procedure TabStopAllOn;
procedure QspMsg;
procedure ClearStatusBar;
procedure ShowStatusBarInfo();
procedure ShowStatusBarInfo;
procedure SaveSettings;
public
{ public declarations }
end;
@ -209,30 +212,26 @@ begin
frmNewQSO.edtCall.Text := edtCall.Text;
if (rbIgnoreDupes.Checked) then
if not (rbIgnoreDupes.Checked) then
begin
//dupe check
dupe := frmWorkedGrids.WkdCall(edtCall.Text, dmUtils.GetBandFromFreq(frmNewQSO.cmbFreq.Text) ,frmNewQSO.cmbMode.Text);
// 1= wkd this band and mode
// 2= wkd this band but NOT this mode
if ((dupe = 1 ) or ((dupe = 2 ) and (rbNoMode4Dupe.Checked ))) then
begin //dupe
edtCall.Font.Color:=clRed;
edtCall.Font.Style:= [fsBold];
frmNewQSO.edtRemQSO.Caption:='Dupe';
end
else begin //clear dupe if user press 1xESC and change call not to be dupe
edtCall.Font.Color:=clDefault;
edtCall.Font.Style:= [];
frmNewQSO.edtRemQSO.Caption:='';
end;
end
else begin
edtCall.Font.Color:=clDefault;
edtCall.Font.Style:= [];
frmNewQSO.edtRemQSO.Caption:='';
end;
if ( (rbNoMode4Dupe.Checked) and (dupe = 1) )
or ( (not rbNoMode4Dupe.Checked) and ((dupe = 1) or (dupe=2)) )then
Begin
edtCall.Font.Color:=clRed;
edtCall.Font.Style:= [fsBold];
frmNewQSO.edtRemQSO.Caption:='Dupe';
end
else
Begin
edtCall.Font.Color:=clDefault;
edtCall.Font.Style:= [];
frmNewQSO.edtRemQSO.Caption:='';
end;
end;
//report in NEwQSO changes to 59 to late (after passing cmbMode)
//NOTE! if mode is not in list program dies! In that case skip next
if frmNewQSO.cmbMode.ItemIndex >=0 then
@ -277,9 +276,29 @@ begin
Writeln('input finale');
ChkSerialNrUpd(chkNRInc.Checked);
initInput;
SaveSettings; //we have to do this here,
//otherwise saved serial number fails if cqrlog is closed without first closing contest form
end;
procedure TfrmContest.btClearAllClick(Sender : TObject);
procedure TfrmContest.btClearAllClick(Sender: TObject);
begin
rbDupeCheck.Checked := True;
rbNoMode4Dupe.Checked := False;
rbIgnoreDupes.Checked := False;
chkSpace.Checked := False;
chkTrueRST.Checked := False;
chkNRInc.Checked := False;
chkQsp.Checked := False;
chkNoNr.Checked := False;
chkLoc.Checked := False;
edtSTX.Text := '';
edtSTXStr.Text := '';
cmbContestName.Text:= '';
end;
procedure TfrmContest.btClearQsoClick(Sender : TObject);
begin
frmNewQSO.ClearAll;
initInput
@ -385,8 +404,7 @@ begin
frmContest.KeyPreview := True;
dmUtils.InsertContests(cmbContestName);
end;
procedure TfrmContest.FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure TfrmContest.SaveSettings;
begin
dmUtils.SaveWindowPos(frmContest);
@ -403,6 +421,11 @@ begin
cqrini.WriteString('frmContest', 'STX', edtSTX.Text);
cqrini.WriteString('frmContest', 'STXStr', edtSTXStr.Text);
cqrini.WriteString('frmContest', 'ContestName', cmbContestName.Text);
end;
procedure TfrmContest.FormClose(Sender: TObject; var CloseAction: TCloseAction);
Begin
SaveSettings;
end;
procedure TfrmContest.FormHide(Sender: TObject);
@ -439,6 +462,7 @@ begin
sbContest.Panels[3].Width := 65;
sbContest.Panels[4].Width := 20;
lblSpeed.Caption:= frmNewQSO.sbNewQSO.Panels[4].Text;
cmbContestName.Text := cqrini.ReadString('frmContest', 'ContestName','');
end;
procedure TfrmContest.btnHelpClick(Sender : TObject);
@ -469,22 +493,7 @@ begin
edtCall.Font.Style:= [];
edtCall.Clear;
EscFirstTime := True;
{
Next 3 lines of procedure will cause
----
either (dbg msg:input finale):
NOTE: Window with stalled focus found!, faking focus-out event
(cqrlog:2643): Pango-CRITICAL **: pango_layout_get_cursor_pos: assertion 'index >= 0 && index <= layout->length' failed
----
or(dbg msg: Clear all done next focus ):
NOTE: Window with stalled focus found!, faking focus-out event
----
All works, but this needs attention and I can not resolve this at the moment.
}
SetTabOrders;
frmContest.ShowOnTop;
frmContest.SetFocus;
@ -574,8 +583,15 @@ Begin
btSave.TabStop := True;
btSave.TabOrder := 7;
btClearAll.TabStop := True;
btClearAll.TabOrder := 8;
btClearQso.TabStop := True;
btClearQso.TabOrder := 8;
rbDupeCheck.TabStop:=false;
rbNoMode4Dupe.TabStop:=false;
rbIgnoreDupes.TabStop:=false;
btClearAll.TabStop:=false;
chkTabAll.TabStop:=false;
cmbContestName.TabStop:=false;
end;
procedure TfrmContest.QspMsg;
Begin
@ -597,7 +613,7 @@ Begin
end;
end;
procedure TfrmContest.ClearStatusBar();
procedure TfrmContest.ClearStatusBar;
var
i : Integer;
begin
@ -605,9 +621,9 @@ begin
sbContest.Panels.Items[i].Text := '';
end;
procedure TfrmContest.ShowStatusBarInfo();
procedure TfrmContest.ShowStatusBarInfo;
begin
sbContest.Panels.Items[0].Text := Trim(frmNewQSO.mCountry.Text);
sbContest.Panels.Items[0].Text := StringReplace(Trim(frmNewQSO.mCountry.Text),#$0A,'|',[rfReplaceAll]);
sbContest.Panels.Items[1].Text := 'WAZ: ' + frmNewQSO.lblWAZ.Caption;
sbContest.Panels.Items[2].Text := 'ITU: ' + frmNewQSO.lblITU.Caption;
sbContest.Panels.Items[3].Text := 'AZ: ' + frmNewQSO.lblAzi.Caption;

View File

@ -11,7 +11,7 @@ const
cBUILD = 1;
cBUILD_DATE = '2021-11-20';
cBUILD_DATE = '2021-11-22';
implementation