diff --git a/help/h22.html b/help/h22.html
index 44fa886..a2b2a52 100644
--- a/help/h22.html
+++ b/help/h22.html
@@ -109,6 +109,14 @@ For LoTW operations see here.
+
In order to keep the structure of the exported csv file you can check
+ checkbox 'Keep csv structure'. This the number of columns will always be the same and not
+ depend on whether specific export items are selected or not. Thus the number for each
+ column will stay the same and you do not need to re-design your glabels template upon
+ (un-)selecting items to export. Not selected items are simply exported as empty values.
+
+
+
For both methods, the filtering potential can be utilized.
For example, you can filter out all QSOs with DJ3 stations and print QSL labels for them.
You will get such output:
diff --git a/help/img/h70.png b/help/img/h70.png
index 61541f4..1216964 100644
Binary files a/help/img/h70.png and b/help/img/h70.png differ
diff --git a/src/fExLabelPrint.lfm b/src/fExLabelPrint.lfm
index 8509d59..642fbcc 100644
--- a/src/fExLabelPrint.lfm
+++ b/src/fExLabelPrint.lfm
@@ -1,7 +1,7 @@
object frmExLabelPrint: TfrmExLabelPrint
- Left = 709
+ Left = 2485
Height = 522
- Top = 11
+ Top = 248
Width = 424
HelpType = htKeyword
HelpKeyword = 'help/h22.html#bh4'
@@ -14,15 +14,15 @@ object frmExLabelPrint: TfrmExLabelPrint
OnClose = FormClose
OnShow = FormShow
Position = poMainFormCenter
- LCLVersion = '2.0.4.0'
+ LCLVersion = '2.0.10.0'
object Label1: TLabel
AnchorSideLeft.Control = gchkExport
AnchorSideTop.Control = edtQSOsToLabel
AnchorSideTop.Side = asrCenter
Left = 5
- Height = 17
+ Height = 15
Top = 139
- Width = 34
+ Width = 36
BorderSpacing.Top = 11
Caption = 'Print '
ParentColor = False
@@ -32,21 +32,21 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtQSOsToLabel
AnchorSideTop.Side = asrCenter
- Left = 94
- Height = 17
+ Left = 96
+ Height = 15
Top = 139
- Width = 119
+ Width = 121
BorderSpacing.Left = 4
Caption = 'QSOs on one label'
ParentColor = False
end
object lblProgress: TLabel
AnchorSideLeft.Control = chkMarkSent
- AnchorSideTop.Control = chkMarkSent
+ AnchorSideTop.Control = chkKeepCsvStructure
AnchorSideTop.Side = asrBottom
Left = 5
Height = 20
- Top = 431
+ Top = 456
Width = 412
Alignment = taCenter
AutoSize = False
@@ -93,7 +93,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 5
Height = 97
- Top = 303
+ Top = 302
Width = 412
Caption = ' Export to '
ClientHeight = 79
@@ -106,7 +106,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideRight.Side = asrBottom
Left = 320
Height = 25
- Top = 43
+ Top = 42
Width = 75
Anchors = [akTop, akRight]
BorderSpacing.Top = 3
@@ -119,7 +119,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = GroupBox1
Left = 16
- Height = 34
+ Height = 33
Top = 6
Width = 379
BorderSpacing.Top = 6
@@ -131,8 +131,8 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gchkExport
AnchorSideTop.Side = asrBottom
- Left = 42
- Height = 34
+ Left = 44
+ Height = 33
Top = 130
Width = 48
BorderSpacing.Left = 3
@@ -147,7 +147,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 5
Height = 136
- Top = 167
+ Top = 166
Width = 412
BorderSpacing.Top = 3
Caption = ' Remarks '
@@ -160,7 +160,7 @@ object frmExLabelPrint: TfrmExLabelPrint
Left = 9
Height = 23
Top = 3
- Width = 198
+ Width = 203
BorderSpacing.Left = 9
BorderSpacing.Top = 3
Caption = 'Print ''Comment(s) to QSO'''
@@ -185,7 +185,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Control = rbOwnRemarks
AnchorSideTop.Side = asrBottom
Left = 17
- Height = 34
+ Height = 33
Top = 52
Width = 376
BorderSpacing.Top = 3
@@ -198,8 +198,8 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 9
Height = 23
- Top = 87
- Width = 256
+ Top = 86
+ Width = 262
BorderSpacing.Top = 1
Caption = 'Remove separator (;) from remarks'
TabOrder = 3
@@ -211,8 +211,8 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 5
Height = 23
- Top = 403
- Width = 208
+ Top = 402
+ Width = 215
BorderSpacing.Top = 3
Caption = 'Mark QSLs sent after export'
TabOrder = 4
@@ -223,7 +223,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 11
Height = 25
- Top = 463
+ Top = 488
Width = 75
BorderSpacing.Left = 6
BorderSpacing.Top = 12
@@ -238,7 +238,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideTop.Side = asrBottom
Left = 174
Height = 25
- Top = 463
+ Top = 488
Width = 75
BorderSpacing.Top = 12
Caption = 'Help'
@@ -252,7 +252,7 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideRight.Side = asrBottom
Left = 336
Height = 25
- Top = 463
+ Top = 488
Width = 75
Anchors = [akTop, akRight]
BorderSpacing.Top = 12
@@ -268,7 +268,7 @@ object frmExLabelPrint: TfrmExLabelPrint
Left = 5
Height = 23
Top = 3
- Width = 127
+ Width = 131
BorderSpacing.Left = 5
BorderSpacing.Top = 3
Caption = 'Export all QSOs'
@@ -280,19 +280,31 @@ object frmExLabelPrint: TfrmExLabelPrint
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtQSOsToLabel
AnchorSideTop.Side = asrCenter
- Left = 229
+ Left = 233
Height = 25
- Top = 135
+ Top = 134
Width = 184
BorderSpacing.Left = 16
Caption = 'Choose fields for export'
OnClick = btnExportFieldsPrefClick
TabOrder = 9
end
+ object chkKeepCsvStructure: TCheckBox
+ AnchorSideLeft.Control = GroupBox1
+ AnchorSideTop.Control = chkMarkSent
+ AnchorSideTop.Side = asrBottom
+ Left = 5
+ Height = 23
+ Top = 428
+ Width = 149
+ BorderSpacing.Top = 3
+ Caption = 'Keep csv structure'
+ TabOrder = 10
+ end
object dlgSave: TSaveDialog
DefaultExt = '.csv'
Filter = 'CSV files|*.csv'
- left = 360
- top = 192
+ Left = 360
+ Top = 192
end
end
diff --git a/src/fExLabelPrint.pas b/src/fExLabelPrint.pas
index 1148928..88483dd 100644
--- a/src/fExLabelPrint.pas
+++ b/src/fExLabelPrint.pas
@@ -22,6 +22,7 @@ type
btnHelp: TButton;
btnExportFieldsPref : TButton;
Cancel: TButton;
+ chkKeepCsvStructure: TCheckBox;
chkRemoveSep: TCheckBox;
chkAllQSOs: TCheckBox;
chkMarkSent: TCheckBox;
@@ -87,6 +88,8 @@ begin
edtQSOsToLabel.Text := cqrini.ReadString('QslExport','QSOs','6');
edtRemarks.Text := cqrini.ReadString('QslExport','Remarks','');
chkRemoveSep.Checked := cqrini.ReadBool('QslExport','RemoveSep',True);
+ chkKeepCsvStructure.Checked := cqrini.ReadBool('QSLExport', 'KeepCsvStructure', False);
+
if edtRemarks.Text <> '' then
rbOwnRemarks.Checked
end;
@@ -327,17 +330,36 @@ var
Write(f,FormatDateTime('mm/dd/yyyy',dmData.Q.FieldByName('qsodate').AsDateTime),C_SEP);
FormatSettings.DateSeparator:=sep;
end;
+ end
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
end;
if cqrini.ReadBool('QSLExport', 'time_on', True) then
- Write(f,dmData.Q.FieldByName('time_on').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('time_on').AsString,C_SEP)
+ else
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
if cqrini.ReadBool('QSLExport', 'time_off', True) then
- Write(f,dmData.Q.FieldByName('time_off').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('time_off').AsString,C_SEP)
+ else
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
if cqrini.ReadBool('QSLExport', 'CallSign', True) then
- Write(f,dmData.Q.FieldByName('callsign').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('callsign').AsString,C_SEP)
+ else
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
if cqrini.ReadBool('QSLExport', 'Mode', True) then
- Write(f,dmData.Q.FieldByName('mode').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('mode').AsString,C_SEP)
+ else
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
if cqrini.ReadBool('QSLExport', 'Freq', True) then
- Write(f,FloatToStr(dmData.Q.FieldByName('freq').AsFloat),C_SEP);
+ Write(f,FloatToStr(dmData.Q.FieldByName('freq').AsFloat),C_SEP)
+ else
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
if cqrini.ReadBool('QSLExport', 'RST_S', True) then
begin
@@ -351,6 +373,15 @@ var
Write(f,rst_tmp[2],C_SEP);
Write(f,rst_tmp[3],C_SEP);
end;
+ end
+ else begin
+ if chkKeepCsvStructure.Checked then
+ begin
+ if not cqrini.ReadBool('QSLExport','SplitRST_R',False) then
+ Write(f,C_SEP)
+ else
+ Write(f,C_SEP,C_SEP,C_SEP);
+ end;
end;
if cqrini.ReadBool('QSLExport', 'RST_R', True) then
begin
@@ -364,49 +395,142 @@ var
Write(f,rst_tmp[2],C_SEP);
Write(f,rst_tmp[3],C_SEP);
end;
+ end
+ else begin
+ if chkKeepCsvStructure.Checked then
+ begin
+ if not cqrini.ReadBool('QSLExport','SplitRST_R',False) then
+ Write(f,C_SEP)
+ else
+ Write(f,C_SEP,C_SEP,C_SEP);
+ end;
end;
if cqrini.ReadBool('QSLExport', 'Name', True) then
- Write(f,dmData.Q.FieldByName('name').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('name').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'QTH', True) then
- Write(f,dmData.Q.FieldByName('qth').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('qth').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'band', True) then
- Write(f,dmData.Q.FieldByName('band').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('band').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'Propagation', True) then
- Write(f,dmData.Q.FieldByName('prop_mode').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('prop_mode').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'Satellite', True) then
- Write(f,dmData.Q.FieldByName('satellite').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('satellite').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'ContestName', True) then
- Write(f, dmData.Q.FieldByName('contestname').AsString,C_SEP);
+ Write(f, dmData.Q.FieldByName('contestname').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'QSL_S', True) then
- Write(f,dmData.Q.FieldByName('qsl_s').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('qsl_s').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'QSL_R', True) then
- Write(f,dmData.Q.FieldByName('qsl_r').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('qsl_r').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'QSL_VIA', True) then
- Write(f,dmData.Q.FieldByName('qsl_via').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('qsl_via').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'locator', True) then
- Write(f,dmData.Q.FieldByName('loc').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('loc').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'MyLoc', True) then
- Write(f,dmData.Q.FieldByName('my_loc').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('my_loc').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'Distance', True) then
- Write(f,frmMain.CalcQrb(dmData.Q.FieldByName('my_loc').AsString,dmData.Q.FieldByName('loc').AsString,False),C_SEP);
+ Write(f,frmMain.CalcQrb(dmData.Q.FieldByName('my_loc').AsString,dmData.Q.FieldByName('loc').AsString,False),C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'IOTA', True) then
- Write(f,dmData.Q.FieldByName('iota').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('iota').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'award', True) then
- Write(f,dmData.Q.FieldByName('award').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('award').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'power', True) then
- Write(f,dmData.Q.FieldByName('pwr').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('pwr').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'Remarks', True) then
- Write(f,dmData.Q.FieldByName('remarks').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('remarks').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'QSLMsg', True) then
- Write(f,dmData.Q.FieldByName('qslmsg').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('qslmsg').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'ContestNrS', True) then
- Write(f,dmData.Q.FieldByName('stx').AsString ,C_SEP);
+ Write(f,dmData.Q.FieldByName('stx').AsString ,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'ContestMsgS', True) then
- Write(f,dmData.Q.FieldByName('stx_string').AsString,C_SEP);
+ Write(f,dmData.Q.FieldByName('stx_string').AsString,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'ContestNrR', True) then
- Write(f,dmData.Q.FieldByName('srx').AsString ,C_SEP);
+ Write(f,dmData.Q.FieldByName('srx').AsString ,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
if cqrini.ReadBool('QSLExport', 'ContestMsgR', True) then
- Write(f,dmData.Q.FieldByName('srx_string').AsString ,C_SEP);
+ Write(f,dmData.Q.FieldByName('srx_string').AsString ,C_SEP)
+ else begin
+ if chkKeepCsvStructure.Checked then
+ Write(f,C_SEP);
+ end;
end;
@@ -540,7 +664,8 @@ begin
cqrini.WriteString('QslExport','Path',edtFile.Text);
cqrini.WriteString('QslExport','QSOs',edtQSOsToLabel.Text);
cqrini.WriteString('QslExport','Remarks',edtRemarks.Text);
- cqrini.ReadBool('QslExport','RemoveSep',chkRemoveSep.Checked)
+ cqrini.WriteBool('QSLExport', 'KeepCsvStructure', chkKeepCsvStructure.Checked);
+ cqrini.WriteBool('QslExport','RemoveSep',chkRemoveSep.Checked)
end;
procedure TfrmExLabelPrint.btnExportFieldsPrefClick(Sender : TObject);