diff --git a/components/lazmapviewer/examples/fulldemo/configframe.lfm b/components/lazmapviewer/examples/fulldemo/configframe.lfm
new file mode 100644
index 000000000..4b7a66bfc
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/configframe.lfm
@@ -0,0 +1,547 @@
+object CfgFrame: TCfgFrame
+ Left = 0
+ Height = 682
+ Top = 0
+ Width = 287
+ ClientHeight = 682
+ ClientWidth = 287
+ TabOrder = 0
+ DesignLeft = 1150
+ DesignTop = 210
+ object LblProviders: TLabel
+ AnchorSideLeft.Control = cmbProviders
+ AnchorSideTop.Control = Owner
+ Left = 4
+ Height = 15
+ Top = 8
+ Width = 52
+ BorderSpacing.Top = 8
+ Caption = 'Providers:'
+ FocusControl = cmbProviders
+ ParentColor = False
+ end
+ object cmbProviders: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = LblProviders
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = btnLoadMapProviders
+ Left = 4
+ Height = 23
+ Top = 25
+ Width = 213
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 4
+ BorderSpacing.Top = 2
+ BorderSpacing.Right = 2
+ DropDownCount = 24
+ ItemHeight = 15
+ Style = csDropDownList
+ TabOrder = 0
+ OnChange = cmbProvidersChange
+ end
+ object btnLoadMapProviders: TSpeedButton
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = cmbProviders
+ AnchorSideTop.Side = asrCenter
+ AnchorSideRight.Control = btnSaveMapProviders
+ Left = 219
+ Height = 28
+ Top = 22
+ Width = 30
+ Anchors = [akTop, akRight]
+ BorderSpacing.Right = 2
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000003591
+ DBFA439FDDFA439FDDFA429FDDFA429EDDFA419EDCFA419EDCFA419EDCFA419E
+ DCFA419EDCFA419EDCFA419EDCFA3792DAFB3080DF100000000000000000429C
+ DEF76EC7EBFF6DC7EAFF6BC6EAFF6AC5E9FF68C4E9FF67C3E8FF65C2E8FF64C1
+ E7FF63C0E7FF61BFE6FF60BEE5FF51AFE3FE308CD6450000000000000000409A
+ DDF47CD0F1FF7BD0F0FF7ACFEFFF79CEEFFF77CDEEFF76CCEEFF74CBEDFF73CA
+ EDFF71C9ECFF70C8ECFF6EC7EBFF6AC3E9FF3993DB8E00000000000000003E99
+ DCEC7ECEF1FF8AD9F6FF89D8F5FF87D7F4FF86D6F4FF84D5F3FF83D5F3FF81D4
+ F2FF80D3F2FF7ED2F1FF7DD1F1FF7BD0F0FF439ADEB40000000000000000409B
+ DDE470C1EDFF99E2FBFF97E2FBFF96E1FAFF94E0F9FF93DFF9FF91DEF8FF90DD
+ F8FF8EDCF7FF8DDBF7FF8CDAF6FF8AD9F6FF4EA4E2CD00000000000000004AA5
+ E0DF61B3E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA2E8FEFFA0E7FEFF9FE6
+ FDFF9DE5FDFF9CE4FCFF9AE3FCFF99E2FBFF5FB3E9E33080DF100000000051A8
+ E2DF5EB2E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9
+ FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFF84CFF5FB348CDA450000000058AD
+ E5DF60B3E8FF61B3E9FF61B3E9FF60B2E9FF60B2E8FF60B2E8FF5FB1E8FF5FB1
+ E8FF5EB1E8FF5EB1E8FF5EB1E7FF59ADE7FB55A9E5E33B94DC85000000005FB0
+ E8DF9DE4FBFF9AE3FAFF97E1F9FF94DFF8FF91DDF7FF8EDBF5FF8BD9F4FF88D8
+ F3FF85D6F2FF82D4F1FF7FD2F0FF4FA7E1DF00000000000000000000000061B1
+ E8DFA6EAFFFFA6EAFFFFA6EAFFFFA3E8FEFF7AC6F1ED59ACE6DF58AAE5DF57AA
+ E5DF56AAE5DF53A9E4DF53A8E4DF3C94DCE20000000000000000000000004096
+ DEE25DAEE7DF5DAEE7DF5DAEE7DF57A9E6DF4399DF6E00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = btnLoadMapProvidersClick
+ end
+ object btnSaveMapProviders: TSpeedButton
+ AnchorSideLeft.Control = btnLoadMapProviders
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = cmbProviders
+ AnchorSideTop.Side = asrCenter
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 251
+ Height = 28
+ Top = 22
+ Width = 32
+ Anchors = [akTop, akRight]
+ BorderSpacing.Right = 4
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000A4653455A465
+ 34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
+ BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
+ 34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
+ 34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
+ 34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
+ EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FF5959
+ F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
+ F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000A46534FF5959
+ F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
+ F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000
+ }
+ OnClick = btnSaveMapProvidersClick
+ end
+ object gbProxy: TGroupBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = cmbProviders
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 4
+ Height = 185
+ Top = 56
+ Width = 279
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 4
+ BorderSpacing.Around = 4
+ Caption = 'Proxy'
+ ClientHeight = 165
+ ClientWidth = 275
+ TabOrder = 1
+ object lblProxyHost: TLabel
+ AnchorSideLeft.Control = rbNoProxy
+ AnchorSideTop.Control = edProxyHost
+ AnchorSideTop.Side = asrCenter
+ Left = 20
+ Height = 15
+ Top = 65
+ Width = 28
+ BorderSpacing.Left = 10
+ Caption = 'Host:'
+ ParentColor = False
+ end
+ object edProxyHost: TEdit
+ AnchorSideLeft.Control = edProxyUserName
+ AnchorSideTop.Control = rbProxyData
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = gbProxy
+ AnchorSideRight.Side = asrBottom
+ Left = 85
+ Height = 23
+ Top = 61
+ Width = 184
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Right = 6
+ TabOrder = 3
+ end
+ object lblProxyPort: TLabel
+ AnchorSideLeft.Control = lblProxyHost
+ AnchorSideTop.Control = seProxyPort
+ AnchorSideTop.Side = asrCenter
+ Left = 20
+ Height = 15
+ Top = 90
+ Width = 22
+ Caption = 'Port'
+ ParentColor = False
+ end
+ object seProxyPort: TSpinEdit
+ AnchorSideLeft.Control = lblProxyUserName
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = edProxyHost
+ AnchorSideTop.Side = asrBottom
+ Left = 85
+ Height = 23
+ Top = 86
+ Width = 70
+ BorderSpacing.Top = 2
+ MaxValue = 65535
+ TabOrder = 4
+ end
+ object lblProxyUserName: TLabel
+ AnchorSideLeft.Control = lblProxyHost
+ AnchorSideTop.Control = edProxyUserName
+ AnchorSideTop.Side = asrCenter
+ Left = 20
+ Height = 15
+ Top = 115
+ Width = 59
+ BorderSpacing.Right = 6
+ Caption = 'User name:'
+ ParentColor = False
+ end
+ object edProxyUserName: TEdit
+ AnchorSideLeft.Control = lblProxyUserName
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = seProxyPort
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = gbProxy
+ AnchorSideRight.Side = asrBottom
+ Left = 85
+ Height = 23
+ Top = 111
+ Width = 184
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 2
+ BorderSpacing.Right = 6
+ TabOrder = 5
+ end
+ object lblProxyPassword: TLabel
+ AnchorSideLeft.Control = lblProxyHost
+ AnchorSideTop.Control = edProxyPassword
+ AnchorSideTop.Side = asrCenter
+ Left = 20
+ Height = 15
+ Top = 140
+ Width = 50
+ Caption = 'Password'
+ ParentColor = False
+ end
+ object edProxyPassword: TEdit
+ AnchorSideLeft.Control = edProxyUserName
+ AnchorSideTop.Control = edProxyUserName
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = gbProxy
+ AnchorSideRight.Side = asrBottom
+ Left = 85
+ Height = 23
+ Top = 136
+ Width = 184
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 2
+ BorderSpacing.Right = 6
+ BorderSpacing.Bottom = 6
+ TabOrder = 6
+ end
+ object rbProxyData: TRadioButton
+ AnchorSideLeft.Control = rbNoProxy
+ AnchorSideTop.Control = rbSystemProxy
+ AnchorSideTop.Side = asrBottom
+ Left = 10
+ Height = 19
+ Top = 42
+ Width = 74
+ BorderSpacing.Top = 2
+ Caption = 'Proxy data'
+ TabOrder = 2
+ OnChange = rbProxyDataChange
+ end
+ object rbNoProxy: TRadioButton
+ AnchorSideLeft.Control = gbProxy
+ AnchorSideTop.Control = gbProxy
+ Left = 10
+ Height = 19
+ Top = 0
+ Width = 67
+ BorderSpacing.Left = 10
+ Caption = 'No proxy'
+ TabOrder = 0
+ OnChange = rbNoProxyChange
+ end
+ object rbSystemProxy: TRadioButton
+ AnchorSideLeft.Control = rbNoProxy
+ AnchorSideTop.Control = rbNoProxy
+ AnchorSideTop.Side = asrBottom
+ Left = 10
+ Height = 19
+ Top = 21
+ Width = 110
+ BorderSpacing.Top = 2
+ Caption = 'Use system proxy'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ OnChange = rbSystemProxyChange
+ end
+ end
+ object cbZoomToCursor: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = gbProxy
+ AnchorSideTop.Side = asrBottom
+ Left = 4
+ Height = 19
+ Top = 249
+ Width = 100
+ BorderSpacing.Left = 4
+ BorderSpacing.Top = 8
+ BorderSpacing.Right = 16
+ Caption = 'Zoom to cursor'
+ Checked = True
+ State = cbChecked
+ TabOrder = 2
+ OnChange = cbZoomToCursorChange
+ end
+ object cbUseThreads: TCheckBox
+ AnchorSideLeft.Control = cbZoomToCursor
+ AnchorSideTop.Control = cbZoomToCursor
+ AnchorSideTop.Side = asrBottom
+ Left = 4
+ Height = 19
+ Top = 272
+ Width = 79
+ BorderSpacing.Top = 4
+ Caption = 'Use threads'
+ Checked = True
+ State = cbChecked
+ TabOrder = 3
+ OnChange = cbUseThreadsChange
+ end
+ object cbDoubleBuffer: TCheckBox
+ AnchorSideLeft.Control = cbUseThreads
+ AnchorSideTop.Control = cbUseThreads
+ AnchorSideTop.Side = asrBottom
+ Left = 4
+ Height = 19
+ Top = 295
+ Width = 85
+ BorderSpacing.Top = 4
+ BorderSpacing.Right = 6
+ Caption = 'DblBuffering'
+ Checked = True
+ State = cbChecked
+ TabOrder = 4
+ OnChange = cbDoubleBufferChange
+ end
+ object cbDebugTiles: TCheckBox
+ AnchorSideLeft.Control = cbDoubleBuffer
+ AnchorSideTop.Control = cbDoubleBuffer
+ AnchorSideTop.Side = asrBottom
+ Left = 4
+ Height = 19
+ Top = 318
+ Width = 77
+ BorderSpacing.Top = 4
+ Caption = 'Debug tiles'
+ TabOrder = 5
+ OnChange = cbDebugTilesChange
+ end
+ object cbCyclicView: TCheckBox
+ AnchorSideLeft.Control = cbZoomToCursor
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = cbZoomToCursor
+ Left = 120
+ Height = 19
+ Top = 249
+ Width = 77
+ Caption = 'Cyclic view'
+ Checked = True
+ State = cbChecked
+ TabOrder = 6
+ OnChange = cbCyclicViewChange
+ end
+ object cbPreviewTiles: TCheckBox
+ AnchorSideLeft.Control = cbCyclicView
+ AnchorSideTop.Control = cbUseThreads
+ Left = 120
+ Height = 19
+ Top = 272
+ Width = 83
+ Caption = 'Preview tiles'
+ Checked = True
+ State = cbChecked
+ TabOrder = 7
+ OnChange = cbPreviewTilesChange
+ end
+ object clbBackColor: TColorButton
+ AnchorSideLeft.Control = cbCyclicView
+ AnchorSideTop.Control = cbDoubleBuffer
+ AnchorSideTop.Side = asrCenter
+ Left = 120
+ Height = 28
+ Top = 290
+ Width = 108
+ BorderWidth = 2
+ ButtonColorAutoSize = False
+ ButtonColorSize = 15
+ ButtonColor = clWhite
+ Caption = 'Map backgr.'
+ Margin = 4
+ OnColorChanged = clbBackColorColorChanged
+ end
+ object Bevel1: TBevel
+ AnchorSideLeft.Control = cbDebugTiles
+ AnchorSideTop.Control = cbDebugTiles
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Side = asrBottom
+ Left = 4
+ Height = 2
+ Top = 343
+ Width = 257
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Shape = bsTopLine
+ end
+ object rgPOIMode: TRadioGroup
+ AnchorSideLeft.Control = cmbProviders
+ AnchorSideTop.Control = Bevel1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 4
+ Height = 128
+ Top = 351
+ Width = 279
+ Anchors = [akTop, akLeft, akRight]
+ AutoFill = False
+ BorderSpacing.Top = 6
+ BorderSpacing.Right = 4
+ Caption = 'POI Mode'
+ ChildSizing.LeftRightSpacing = 12
+ ChildSizing.TopBottomSpacing = 4
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclTopToBottomThenLeftToRight
+ ChildSizing.ControlsPerLine = 4
+ ClientHeight = 108
+ ClientWidth = 275
+ ItemIndex = 0
+ Items.Strings = (
+ 'default drawing'
+ 'default POI image'
+ 'image from imagelist'
+ 'custom drawing'
+ )
+ TabOrder = 8
+ OnClick = rgPOIModeClick
+ object Bevel3: TBevel
+ Left = 151
+ Height = 25
+ Top = 4
+ Width = 66
+ Constraints.MaxHeight = 25
+ Shape = bsSpacer
+ end
+ object btnSelectPOIImage: TButton
+ Left = 151
+ Height = 25
+ Top = 29
+ Width = 66
+ AutoSize = True
+ BorderSpacing.Left = 8
+ Caption = 'Select...'
+ Enabled = False
+ TabOrder = 4
+ OnClick = btnSelectPOIImageClick
+ end
+ object Bevel4: TBevel
+ Left = 151
+ Height = 25
+ Top = 54
+ Width = 66
+ Constraints.MaxHeight = 25
+ Shape = bsSpacer
+ end
+ object Bevel5: TBevel
+ Left = 151
+ Height = 25
+ Top = 79
+ Width = 66
+ Constraints.MaxHeight = 25
+ Shape = bsSpacer
+ end
+ end
+ object btnPOITextFont: TButton
+ AnchorSideLeft.Control = rgPOIMode
+ AnchorSideTop.Control = rgPOIMode
+ AnchorSideTop.Side = asrBottom
+ Left = 4
+ Height = 30
+ Top = 487
+ Width = 87
+ BorderSpacing.Top = 8
+ Caption = 'POI text font'
+ TabOrder = 9
+ OnClick = btnPOITextFontClick
+ end
+ object LblPOITextBgColor: TLabel
+ AnchorSideLeft.Control = btnPOITextFont
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = btnPOITextFont
+ AnchorSideTop.Side = asrCenter
+ Left = 97
+ Height = 15
+ Top = 495
+ Width = 39
+ BorderSpacing.Left = 6
+ Caption = 'Backgr.'
+ ParentColor = False
+ end
+ object cbPOITextBgColor: TColorBox
+ AnchorSideLeft.Control = LblPOITextBgColor
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = btnPOITextFont
+ AnchorSideTop.Side = asrCenter
+ AnchorSideRight.Control = rgPOIMode
+ AnchorSideRight.Side = asrBottom
+ Left = 142
+ Height = 21
+ Top = 492
+ Width = 141
+ NoneColorColor = clWhite
+ Style = [cbStandardColors, cbExtendedColors, cbIncludeNone, cbCustomColor, cbPrettyNames, cbCustomColors]
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ ItemHeight = 15
+ TabOrder = 10
+ OnChange = cbPOITextBgColorChange
+ end
+ object OpenPictureDialog: TOpenPictureDialog
+ Left = 184
+ Top = 344
+ end
+ object FontDialog: TFontDialog
+ MinFontSize = 0
+ MaxFontSize = 0
+ Left = 40
+ Top = 528
+ end
+end
diff --git a/components/lazmapviewer/examples/fulldemo/configframe.pas b/components/lazmapviewer/examples/fulldemo/configframe.pas
new file mode 100644
index 000000000..e459d68c0
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/configframe.pas
@@ -0,0 +1,359 @@
+unit ConfigFrame;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, IniFiles,
+ Graphics,
+ Forms, Controls, StdCtrls, Buttons, Dialogs, ExtCtrls, ColorBox, ExtDlgs, Spin,
+ mvMapViewer, mvEngine,
+ globals;
+
+type
+ { TCfgFrame }
+
+ TCfgFrame = class(TFrame)
+ Bevel1: TBevel;
+ Bevel3: TBevel;
+ Bevel4: TBevel;
+ Bevel5: TBevel;
+ btnLoadMapProviders: TSpeedButton;
+ btnPOITextFont: TButton;
+ btnSaveMapProviders: TSpeedButton;
+ btnSelectPOIImage: TButton;
+ cbCyclicView: TCheckBox;
+ cbDebugTiles: TCheckBox;
+ cbDoubleBuffer: TCheckBox;
+ cbPOITextBgColor: TColorBox;
+ cbPreviewTiles: TCheckBox;
+ cmbProviders: TComboBox;
+ cbUseThreads: TCheckBox;
+ cbZoomToCursor: TCheckBox;
+ clbBackColor: TColorButton;
+ edProxyHost: TEdit;
+ edProxyPassword: TEdit;
+ edProxyUserName: TEdit;
+ FontDialog: TFontDialog;
+ gbProxy: TGroupBox;
+ LblPOITextBgColor: TLabel;
+ LblProviders: TLabel;
+ lblProxyHost: TLabel;
+ lblProxyPassword: TLabel;
+ lblProxyPort: TLabel;
+ lblProxyUserName: TLabel;
+ OpenPictureDialog: TOpenPictureDialog;
+ rbNoProxy: TRadioButton;
+ rbProxyData: TRadioButton;
+ rbSystemProxy: TRadioButton;
+ rgPOIMode: TRadioGroup;
+ seProxyPort: TSpinEdit;
+ procedure btnLoadMapProvidersClick(Sender: TObject);
+ procedure btnPOITextFontClick(Sender: TObject);
+ procedure btnSaveMapProvidersClick(Sender: TObject);
+ procedure btnSelectPOIImageClick(Sender: TObject);
+ procedure cbCyclicViewChange(Sender: TObject);
+ procedure cbDebugTilesChange(Sender: TObject);
+ procedure cbDoubleBufferChange(Sender: TObject);
+ procedure cbPOITextBgColorChange(Sender: TObject);
+ procedure cbPreviewTilesChange(Sender: TObject);
+ procedure cbUseThreadsChange(Sender: TObject);
+ procedure cbZoomToCursorChange(Sender: TObject);
+ procedure clbBackColorColorChanged(Sender: TObject);
+ procedure cmbProvidersChange(Sender: TObject);
+ procedure rbNoProxyChange(Sender: TObject);
+ procedure rgPOIModeClick(Sender: TObject);
+ procedure rbProxyDataChange(Sender: TObject);
+ procedure rbSystemProxyChange(Sender: TObject);
+ private
+ FMapView: TMapView;
+ FPOIImage: TCustomBitmap;
+ FDrawGPSPointEvent: TDrawGpsPointEvent;
+ FUpdateLayersEvent: TNotifyEvent;
+ function GetMapProviders: TStrings;
+ function GetPOIMode: TPOIMode;
+ function GetPOITextBkColor: TColor;
+ procedure SetMapView(AValue: TMapView);
+ protected
+ procedure DoUpdateLayers; virtual;
+ procedure UpdateDownloadEngineProxy;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ procedure ReadFromIni(ini: TCustomIniFile); virtual;
+ procedure WriteToIni(ini: TCustomIniFile); virtual;
+
+ property MapView: TMapView read FMapView write SetMapView;
+ property MapProviders: TStrings read GetMapProviders;
+ property POIMode: TPOIMode read GetPOIMode;
+ property POITextBkColor: TColor read GetPOITextBkColor;
+ property OnDrawGPSPoint: TDrawGpsPointEvent read FDrawGPSPointEvent write FDrawGPSPointEvent;
+ property OnUpdateLayers: TNotifyEvent read FUpdateLayersEvent write FUpdateLayersEvent;
+ end;
+
+implementation
+
+{$R *.lfm}
+
+{ TCfgFrame }
+
+constructor TCfgFrame.Create(AOwner: TComponent);
+var
+ fn: String;
+begin
+ inherited;
+
+ fn := Application.Location + 'mapmarker.png';
+ if not FileExists(fn) then
+ MessageDlg('Copy the file "mapmarker.png" from the source folder to the folder with the executable.',
+ mtError, [mbOK], 0)
+ else
+ begin
+ FPOIImage := TPortableNetworkGraphic.Create;
+ FPOIImage.PixelFormat := pf32bit;
+ FPOIImage.LoadFromFile(fn);
+ end;
+end;
+
+destructor TCfgFrame.Destroy;
+begin
+ FPOIImage.Free;
+ inherited;
+end;
+
+procedure TCfgFrame.btnLoadMapProvidersClick(Sender: TObject);
+var
+ fn: String;
+ msg: String;
+begin
+ fn := Application.Location + MAP_PROVIDER_FILENAME;
+ if FileExists(fn) then begin
+ if MapView.Engine.ReadProvidersFromXML(fn, msg) then begin
+ MapView.GetMapProviders(cmbProviders.Items);
+ cmbProviders.ItemIndex := 0;
+ MapView.MapProvider := cmbProviders.Text;
+ // sgLayers.Columns[1].PickList.Assign(cmbProviders.Items); // <<--- FIXME
+ end else
+ ShowMessage(msg);
+ end;
+end;
+
+procedure TCfgFrame.btnPOITextFontClick(Sender: TObject);
+begin
+ FontDialog.Font.Assign(MapView.Font);
+ if FontDialog.Execute then
+ MapView.Font.Assign(FontDialog.Font);
+end;
+
+procedure TCfgFrame.btnSaveMapProvidersClick(Sender: TObject);
+begin
+ MapView.Engine.WriteProvidersToXML(Application.Location + MAP_PROVIDER_FILENAME);
+end;
+
+procedure TCfgFrame.btnSelectPOIImageClick(Sender: TObject);
+begin
+ OpenPictureDialog.Filter := 'PNG files|*.png|BMP files|*.bmp';
+ OpenPictureDialog.DefaultExt := '.png';
+ if OpenPictureDialog.Execute then
+ begin
+ FPOIImage.LoadFromFile(OpenPictureDialog.FileName);
+ MapView.POIImage.Assign(FPOIImage);
+ end;
+end;
+
+procedure TCfgFrame.cbCyclicViewChange(Sender: TObject);
+begin
+ MapView.Cyclic := cbCyclicView.Checked;
+ DoUpdateLayers;
+end;
+
+procedure TCfgFrame.cbDebugTilesChange(Sender: TObject);
+begin
+ MapView.DebugTiles := CbDebugTiles.Checked;
+ MapView.Invalidate;
+end;
+
+procedure TCfgFrame.cbDoubleBufferChange(Sender: TObject);
+begin
+ MapView.DoubleBuffered := cbDoubleBuffer.Checked;
+end;
+
+procedure TCfgFrame.cbPOITextBgColorChange(Sender: TObject);
+begin
+ MapView.POITextBgColor := cbPOITextBgColor.Selected;
+end;
+
+procedure TCfgFrame.cbPreviewTilesChange(Sender: TObject);
+begin
+ MapView.DrawPreviewTiles := cbPreviewTiles.Checked;
+end;
+
+procedure TCfgFrame.cbUseThreadsChange(Sender: TObject);
+begin
+ MapView.UseThreads := cbUseThreads.Checked;
+ DoUpdateLayers;
+end;
+
+procedure TCfgFrame.clbBackColorColorChanged(Sender: TObject);
+begin
+ MapView.InactiveColor := clbBackColor.ButtonColor;
+end;
+
+procedure TCfgFrame.cbZoomToCursorChange(Sender: TObject);
+begin
+ MapView.ZoomToCursor := CbZoomToCursor.Checked;
+end;
+
+procedure TCfgFrame.cmbProvidersChange(Sender: TObject);
+begin
+ MapView.MapProvider := cmbProviders.Text;
+end;
+
+procedure TCfgFrame.DoUpdateLayers;
+begin
+ if Assigned(FUpdateLayersEvent) then
+ FUpdateLayersEvent(Self);
+end;
+
+function TCfgFrame.GetMapProviders: TStrings;
+begin
+ Result := cmbProviders.Items;
+end;
+
+function TCfgFrame.GetPOIMode: TPOIMode;
+begin
+ Result := TPOIMode(rgPOIMode.ItemIndex);
+end;
+
+function TCfgFrame.GetPOITextBkColor: TColor;
+begin
+ Result := cbPOITextBgColor.Selected;
+end;
+
+procedure TCfgFrame.ReadFromIni(ini: TCustomIniFile);
+var
+ n: Integer;
+ s: String;
+begin
+ n := ini.ReadInteger('Proxy', 'UseProxy', 0);
+ case n of
+ 0: rbNoProxy.Checked := true;
+ 1: rbSystemProxy.Checked := true;
+ 2: rbProxyData.Checked := true;
+ end;
+ edProxyHost.Text := ini.ReadString('Proxy', 'ProxyHost', edProxyHost.Text);
+ seProxyPort.Value := ini.ReadInteger('Proxy', 'ProxyPort', seProxyPort.Value);
+ edProxyUserName.Text := ini.ReadString('Proxy', 'ProxyName', edProxyUserName.Text);
+ edProxyPassword.Text := ini.ReadString('Proxy', 'ProxyPassword', edProxyPassword.Text);
+
+ UpdateDownloadEngineProxy;
+
+ // The following parameters already have been read by the main form,
+ // we still must update the frame controls.
+ MapView.GetMapProviders(cmbProviders.Items);
+ cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(MapView.MapProvider);
+ clbBackColor.ButtonColor := MapView.InactiveColor;
+end;
+
+procedure TCfgFrame.rbNoProxyChange(Sender: TObject);
+begin
+ UpdateDownloadEngineProxy;
+end;
+
+procedure TCfgFrame.rbProxyDataChange(Sender: TObject);
+begin
+ UpdateDownloadEngineProxy;
+end;
+
+procedure TCfgFrame.rbSystemProxyChange(Sender: TObject);
+begin
+ UpdateDownloadEngineProxy;
+end;
+
+procedure TCfgFrame.rgPOIModeClick(Sender: TObject);
+begin
+ case rgPOIMode.ItemIndex of
+ 0: begin // default symbol
+ if MapView.POIImage <> nil then MapView.POIImage.Clear;
+ MapView.OnDrawGPSPoint := nil;
+ end;
+ 1: begin // default POI image
+ MapView.POIImage := FPOIImage;
+ MapView.OnDrawGPSPoint := nil;
+ end;
+ 2: begin // image from image list, to be applied to the next POI only
+ //
+ end;
+ 3: begin // custom-drawn symbol
+ if MapView.POIImage <> nil then MapView.POIImage.Clear;
+ MapView.OnDrawGPSPoint := FDrawGpsPointEvent;
+ end;
+ end;
+ MapView.Invalidate;
+ btnSelectPOIImage.Enabled := (rgPOIMode.ItemIndex = 1);
+end;
+
+procedure TCfgFrame.SetMapView(AValue: TMapView);
+begin
+ if FMapView = AValue then
+ exit;
+ FMapView := AValue;
+ if FMapView = nil then
+ raise Exception.Create('[TCfgFrame.SetMapView] New mapview is nil.');
+
+ FMapView.GetMapProviders(cmbProviders.Items);
+ cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(FMapView.MapProvider);
+ //sgLayers.Columns[1].PickList.Assign(CbProviders.Items); // << --- FIX ME
+ FMapView.DoubleBuffered := true;
+ FMapView.Zoom := 1;
+ cbZoomToCursor.Checked := FMapView.ZoomToCursor;
+ cbUseThreads.Checked := FMapView.UseThreads;
+ cbDoubleBuffer.Checked := FMapView.DoubleBuffered;
+ cbPOITextBgColor.Selected := FMapView.POITextBgColor;
+ cbPOITextBgColor.ItemHeight := cmbProviders.ItemHeight + 2;
+ clbBackColor.ButtonColor := FMapView.InactiveColor;
+
+ FDrawGPSpointEvent := FMapView.OnDrawGPSPoint;
+end;
+
+procedure TCfgFrame.UpdateDownloadEngineProxy;
+begin
+ if MapView.DownloadEngine.HasProxySupport then
+ begin
+ MapView.DownloadEngine.SetProxy(
+ rbSystemProxy.Checked, rbProxyData.Checked,
+ edProxyHost.Name, seProxyPort.Value, edProxyUserName.Text, edProxyPassword.Text
+ );
+ rbSystemProxy.Enabled := MapView.DownloadEngine.SupportsSystemProxy;
+ lblProxyHost.Enabled := rbProxyData.Checked;
+ edProxyHost.Enabled := rbProxyData.Checked;
+ lblProxyPort.Enabled := rbProxyData.Checked;
+ seProxyPort.Enabled := rbProxyData.Checked;
+ lblProxyUserName.Enabled := rbProxyData.Checked;
+ edProxyUserName.Enabled := rbProxyData.Checked;
+ lblProxyPassword.Enabled := rbProxyData.Checked;
+ edProxyPassword.Enabled := rbProxyData.Checked;
+ end;
+end;
+
+procedure TCfgFrame.WriteToIni(ini: TCustomIniFile);
+var
+ n: Integer = 0;
+begin
+ if rbSystemProxy.Checked then
+ n := 1
+ else if rbProxyData.Checked then
+ n := 2;
+ ini.EraseSection('Proxy');
+ ini.WriteInteger('Proxy', 'UseProxy', n);
+ ini.WriteString('Proxy', 'ProxyHost', edProxyHost.Text);
+ ini.WriteInteger('Proxy', 'ProxyPort', seProxyPort.Value);
+ ini.WriteString('Proxy', 'ProxyName', edProxyUserName.Text);
+ ini.WriteString('Proxy', 'ProxyPassword', edProxyPassword.Text);
+end;
+
+
+end.
+
diff --git a/components/lazmapviewer/examples/fulldemo/configframe_with_addons.lfm b/components/lazmapviewer/examples/fulldemo/configframe_with_addons.lfm
new file mode 100644
index 000000000..8a68ceb3c
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/configframe_with_addons.lfm
@@ -0,0 +1,139 @@
+inherited CfgFrame_with_addons: TCfgFrame_with_addons
+ inherited LblProviders: TLabel
+ AnchorSideTop.Control = Owner
+ end
+ inherited cmbProviders: TComboBox
+ AnchorSideLeft.Control = Owner
+ end
+ inherited btnSaveMapProviders: TSpeedButton
+ AnchorSideRight.Control = Owner
+ end
+ inherited gbProxy: TGroupBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = cbDownloadEngine
+ AnchorSideRight.Control = Owner
+ Top = 154
+ BorderSpacing.Top = 6
+ end
+ inherited cbZoomToCursor: TCheckBox
+ AnchorSideLeft.Control = Owner
+ Top = 347
+ end
+ inherited cbUseThreads: TCheckBox
+ Top = 370
+ end
+ inherited cbDoubleBuffer: TCheckBox
+ Top = 393
+ end
+ inherited cbDebugTiles: TCheckBox
+ Top = 416
+ end
+ inherited cbCyclicView: TCheckBox
+ Top = 347
+ end
+ inherited cbPreviewTiles: TCheckBox
+ Top = 370
+ end
+ inherited clbBackColor: TColorButton
+ Top = 388
+ end
+ inherited Bevel1: TBevel
+ Top = 441
+ end
+ inherited rgPOIMode: TRadioGroup
+ AnchorSideRight.Control = Owner
+ Top = 449
+ end
+ inherited btnPOITextFont: TButton
+ Top = 585
+ end
+ inherited LblPOITextBgColor: TLabel
+ Top = 593
+ end
+ inherited cbPOITextBgColor: TColorBox
+ Top = 590
+ end
+ object Label1: TLabel[17]
+ AnchorSideLeft.Control = cbDrawingEngine
+ AnchorSideTop.Control = cmbProviders
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 15
+ Top = 56
+ Width = 86
+ BorderSpacing.Top = 8
+ Caption = 'Drawing engine:'
+ ParentColor = False
+ end
+ object cbDrawingEngine: TComboBox[18]
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 73
+ Width = 275
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 2
+ BorderSpacing.Right = 6
+ ItemHeight = 15
+ ItemIndex = 0
+ Items.Strings = (
+ 'default'
+ 'RGBGraphics'
+ 'BGRABitmap'
+ 'LCL'
+ )
+ Style = csDropDownList
+ TabOrder = 11
+ Text = 'default'
+ OnChange = cbDrawingEngineChange
+ end
+ object Label2: TLabel[19]
+ AnchorSideLeft.Control = cbDownloadEngine
+ AnchorSideTop.Control = cbDrawingEngine
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 15
+ Top = 104
+ Width = 96
+ BorderSpacing.Top = 8
+ Caption = 'Download engine:'
+ ParentColor = False
+ end
+ object cbDownloadEngine: TComboBox[20]
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 121
+ Width = 275
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 2
+ BorderSpacing.Right = 6
+ ItemHeight = 15
+ ItemIndex = 0
+ Items.Strings = (
+ 'default'
+ 'Synapse'
+ 'FpHTTPClient'
+ 'WinInet'
+ )
+ Style = csDropDownList
+ TabOrder = 12
+ Text = 'default'
+ OnChange = cbDownloadEngineChange
+ end
+ inherited OpenPictureDialog: TOpenPictureDialog[21]
+ end
+ inherited FontDialog: TFontDialog[22]
+ Top = 616
+ end
+end
diff --git a/components/lazmapviewer/examples/fulldemo/configframe_with_addons.pas b/components/lazmapviewer/examples/fulldemo/configframe_with_addons.pas
new file mode 100644
index 000000000..ed4517cd3
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/configframe_with_addons.pas
@@ -0,0 +1,108 @@
+unit ConfigFrame_with_Addons;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ mvDrawingEngine, mvDE_RGBGraphics, mvDE_BGRA, mvDE_LCL,
+ mvDLEFPC, mvDLEWin, mvDLESynapse,
+ ConfigFrame;
+
+type
+
+ { TCfgFrame_with_addons }
+
+ TCfgFrame_with_addons = class(TCfgFrame)
+ cbDownloadEngine: TComboBox;
+ cbDrawingEngine: TComboBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ procedure cbDownloadEngineChange(Sender: TObject);
+ procedure cbDrawingEngineChange(Sender: TObject);
+ private
+ FRGBGraphicsDrawingEngine: TMvRGBGraphicsDrawingEngine;
+ FBGRADrawingEngine: TMvBGRADrawingEngine;
+ FLCLDrawingEngine: TMvLCLDrawingEngine;
+ FSynapseDownloadEngine: TMvDESynapse;
+ FFpHttpClientDownloadEngine: TMvDEFPC;
+ {$IFDEF MSWINDOWS}
+ FWinDownloadEngine: TMvDEWin;
+ {$ENDIF}
+
+ public
+ destructor Destroy; override;
+
+ end;
+
+implementation
+
+{$R *.lfm}
+
+{ TCfgFrame_with_addons }
+
+destructor TCfgFrame_with_addons.Destroy;
+begin
+ FreeAndNil(FRGBGraphicsDrawingEngine);
+ FreeAndNil(FBGRADrawingEngine);
+ FreeAndNil(FSynapseDownloadEngine);
+ FreeAndNil(FFpHttpClientDownloadEngine);
+ {$IFDEF MSWINDOWS}
+ FreeAndNil(FWinDownloadEngine);
+ {$ENDIF}
+ inherited;
+end;
+
+procedure TCfgFrame_with_addons.cbDrawingEngineChange(Sender: TObject);
+begin
+ case cbDrawingEngine.ItemIndex of
+ 0: MapView.DrawingEngine := nil;
+ 1: begin
+ if FRGBGraphicsDrawingEngine = nil then
+ FRGBGraphicsDrawingEngine := TMvRGBGraphicsDrawingEngine.Create(self);
+ MapView.DrawingEngine := FRGBGraphicsDrawingEngine;
+ end;
+ 2: begin
+ if FBGRADrawingEngine = nil then
+ FBGRADrawingEngine := TMvBGRADrawingEngine.Create(self);
+ MapView.DrawingEngine := FBGRADrawingEngine;
+ end;
+ 3: begin
+ if FLCLDrawingEngine = nil then
+ FLCLDrawingEngine := TMvLCLDrawingEngine.Create(self);
+ MapView.DrawingEngine := FLCLDrawingEngine;
+ end;
+ end;
+ DoUpdateLayers;
+end;
+
+procedure TCfgFrame_with_addons.cbDownloadEngineChange(Sender: TObject);
+begin
+ case cbDownloadEngine.ItemIndex of
+ 0: MapView.DownloadEngine := nil;
+ 1: begin
+ if FSynapseDownloadEngine = nil then
+ FSynapseDownloadEngine := TMvDESynapse.Create(self);
+ MapView.DownloadEngine := FSynapseDownloadEngine;
+ end;
+ 2: begin
+ if FFpHttpClientDownloadEngine = nil then
+ FFpHttpClientDownloadEngine := TMvDEFPC.Create(self);
+ MapView.DownloadEngine := FFpHttpClientDownloadEngine;
+ end;
+ 3: begin
+ {$IFDEF MSWINDOWS}
+ if FWinDownloadEngine = nil then
+ FWinDownloadEngine := TMvDEWin.Create(Self);
+ MapView.DownloadEngine := FWinDownloadEngine;
+ {$ELSE}
+ ShowMessage('WinInet download engine can only be used in Windows.');
+ {$ENDIF}
+ end;
+ end;
+ UpdateDownloadEngineProxy;
+end;
+
+end.
+
diff --git a/components/lazmapviewer/examples/fulldemo/globals.pas b/components/lazmapviewer/examples/fulldemo/globals.pas
index 2e11a8882..8b78a2f20 100644
--- a/components/lazmapviewer/examples/fulldemo/globals.pas
+++ b/components/lazmapviewer/examples/fulldemo/globals.pas
@@ -7,9 +7,14 @@ interface
uses
Classes, SysUtils, mvEngine;
+type
+ TPOIMode = (pmDefaultDrawing, pmDefaultImage, pmImageList, pmCustomDrawing);
+
+const
+ MAP_PROVIDER_FILENAME = 'map-providers.xml';
+
const
DistanceUnit_Names: array[TDistanceUnits] of string = ('m', 'km', 'miles');
-
var
DistanceUnit: TDistanceUnits = duKilometers;
diff --git a/components/lazmapviewer/examples/fulldemo/main.lfm b/components/lazmapviewer/examples/fulldemo/main.lfm
index 2ee8f893c..c66d05512 100644
--- a/components/lazmapviewer/examples/fulldemo/main.lfm
+++ b/components/lazmapviewer/examples/fulldemo/main.lfm
@@ -1,7 +1,7 @@
object MainForm: TMainForm
- Left = 381
+ Left = 375
Height = 586
- Top = 187
+ Top = 177
Width = 750
Caption = 'LazMapViewer'
ClientHeight = 586
@@ -40,9 +40,9 @@ object MainForm: TMainForm
Height = 586
Top = 0
Width = 275
- ActivePage = PgConfig
+ ActivePage = PgData
Align = alRight
- TabIndex = 2
+ TabIndex = 0
TabOrder = 1
object PgData: TTabSheet
Caption = 'Data'
@@ -715,534 +715,6 @@ object MainForm: TMainForm
end
object PgConfig: TTabSheet
Caption = 'Config'
- ClientHeight = 558
- ClientWidth = 267
- object LblProviders: TLabel
- AnchorSideLeft.Control = CbProviders
- AnchorSideTop.Control = PgConfig
- Left = 4
- Height = 15
- Top = 8
- Width = 52
- BorderSpacing.Top = 8
- Caption = 'Providers:'
- FocusControl = CbProviders
- ParentColor = False
- end
- object CbProviders: TComboBox
- AnchorSideLeft.Control = PgConfig
- AnchorSideTop.Control = LblProviders
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = BtnLoadMapProviders
- Left = 4
- Height = 23
- Top = 25
- Width = 193
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Left = 4
- BorderSpacing.Top = 2
- BorderSpacing.Right = 2
- DropDownCount = 24
- ItemHeight = 15
- Style = csDropDownList
- TabOrder = 0
- OnChange = CbProvidersChange
- end
- object BtnLoadMapProviders: TSpeedButton
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = CbProviders
- AnchorSideTop.Side = asrCenter
- AnchorSideRight.Control = BtnSaveMapProviders
- Left = 199
- Height = 28
- Top = 22
- Width = 30
- Anchors = [akTop, akRight]
- BorderSpacing.Right = 2
- Glyph.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000003591
- DBFA439FDDFA439FDDFA429FDDFA429EDDFA419EDCFA419EDCFA419EDCFA419E
- DCFA419EDCFA419EDCFA419EDCFA3792DAFB3080DF100000000000000000429C
- DEF76EC7EBFF6DC7EAFF6BC6EAFF6AC5E9FF68C4E9FF67C3E8FF65C2E8FF64C1
- E7FF63C0E7FF61BFE6FF60BEE5FF51AFE3FE308CD6450000000000000000409A
- DDF47CD0F1FF7BD0F0FF7ACFEFFF79CEEFFF77CDEEFF76CCEEFF74CBEDFF73CA
- EDFF71C9ECFF70C8ECFF6EC7EBFF6AC3E9FF3993DB8E00000000000000003E99
- DCEC7ECEF1FF8AD9F6FF89D8F5FF87D7F4FF86D6F4FF84D5F3FF83D5F3FF81D4
- F2FF80D3F2FF7ED2F1FF7DD1F1FF7BD0F0FF439ADEB40000000000000000409B
- DDE470C1EDFF99E2FBFF97E2FBFF96E1FAFF94E0F9FF93DFF9FF91DEF8FF90DD
- F8FF8EDCF7FF8DDBF7FF8CDAF6FF8AD9F6FF4EA4E2CD00000000000000004AA5
- E0DF61B3E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA2E8FEFFA0E7FEFF9FE6
- FDFF9DE5FDFF9CE4FCFF9AE3FCFF99E2FBFF5FB3E9E33080DF100000000051A8
- E2DF5EB2E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9
- FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFF84CFF5FB348CDA450000000058AD
- E5DF60B3E8FF61B3E9FF61B3E9FF60B2E9FF60B2E8FF60B2E8FF5FB1E8FF5FB1
- E8FF5EB1E8FF5EB1E8FF5EB1E7FF59ADE7FB55A9E5E33B94DC85000000005FB0
- E8DF9DE4FBFF9AE3FAFF97E1F9FF94DFF8FF91DDF7FF8EDBF5FF8BD9F4FF88D8
- F3FF85D6F2FF82D4F1FF7FD2F0FF4FA7E1DF00000000000000000000000061B1
- E8DFA6EAFFFFA6EAFFFFA6EAFFFFA3E8FEFF7AC6F1ED59ACE6DF58AAE5DF57AA
- E5DF56AAE5DF53A9E4DF53A8E4DF3C94DCE20000000000000000000000004096
- DEE25DAEE7DF5DAEE7DF5DAEE7DF57A9E6DF4399DF6E00000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000
- }
- OnClick = BtnLoadMapProvidersClick
- end
- object BtnSaveMapProviders: TSpeedButton
- AnchorSideLeft.Control = BtnLoadMapProviders
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = CbProviders
- AnchorSideTop.Side = asrCenter
- AnchorSideRight.Control = PgConfig
- AnchorSideRight.Side = asrBottom
- Left = 231
- Height = 28
- Top = 22
- Width = 32
- Anchors = [akTop, akRight]
- BorderSpacing.Right = 4
- Glyph.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000A4653455A465
- 34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
- BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
- 34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
- 34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
- 34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
- EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FF5959
- F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
- F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000A46534FF5959
- F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
- F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000
- }
- OnClick = BtnSaveMapProvidersClick
- end
- object CbUseThreads: TCheckBox
- AnchorSideLeft.Control = PgConfig
- AnchorSideTop.Control = CbZoomToCursor
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 19
- Top = 272
- Width = 79
- BorderSpacing.Left = 4
- BorderSpacing.Top = 4
- Caption = 'Use threads'
- Checked = True
- State = cbChecked
- TabOrder = 4
- OnChange = CbUseThreadsChange
- end
- object CbDoubleBuffer: TCheckBox
- AnchorSideLeft.Control = CbUseThreads
- AnchorSideTop.Control = CbUseThreads
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 19
- Top = 295
- Width = 85
- BorderSpacing.Top = 4
- BorderSpacing.Right = 6
- Caption = 'DblBuffering'
- Checked = True
- State = cbChecked
- TabOrder = 6
- OnChange = CbDoubleBufferChange
- end
- object CbDebugTiles: TCheckBox
- AnchorSideLeft.Control = CbDoubleBuffer
- AnchorSideTop.Control = CbDoubleBuffer
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 19
- Top = 318
- Width = 77
- BorderSpacing.Top = 4
- Caption = 'Debug tiles'
- TabOrder = 7
- OnChange = CbDebugTilesChange
- end
- object BtnPOITextFont: TButton
- AnchorSideLeft.Control = rgPOIMode
- AnchorSideTop.Control = rgPOIMode
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 30
- Top = 487
- Width = 87
- BorderSpacing.Top = 8
- Caption = 'POI text font'
- TabOrder = 9
- OnClick = BtnPOITextFontClick
- end
- object cbPOITextBgColor: TColorBox
- AnchorSideLeft.Control = LblPOITextBgColor
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = BtnPOITextFont
- AnchorSideTop.Side = asrCenter
- AnchorSideRight.Side = asrBottom
- Left = 142
- Height = 21
- Top = 492
- Width = 119
- NoneColorColor = clWhite
- Style = [cbStandardColors, cbExtendedColors, cbIncludeNone, cbCustomColor, cbPrettyNames, cbCustomColors]
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Left = 6
- ItemHeight = 15
- TabOrder = 10
- OnChange = cbPOITextBgColorChange
- end
- object LblPOITextBgColor: TLabel
- AnchorSideLeft.Control = BtnPOITextFont
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = BtnPOITextFont
- AnchorSideTop.Side = asrCenter
- Left = 97
- Height = 15
- Top = 495
- Width = 39
- BorderSpacing.Left = 6
- Caption = 'Backgr.'
- ParentColor = False
- end
- object Bevel1: TBevel
- AnchorSideLeft.Control = CbDebugTiles
- AnchorSideTop.Control = CbDebugTiles
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Side = asrBottom
- Left = 4
- Height = 2
- Top = 343
- Width = 257
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Top = 6
- Shape = bsTopLine
- end
- object rgPOIMode: TRadioGroup
- AnchorSideLeft.Control = CbProviders
- AnchorSideTop.Control = Bevel1
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 128
- Top = 351
- Width = 233
- AutoFill = False
- BorderSpacing.Top = 6
- Caption = 'POI Mode'
- ChildSizing.LeftRightSpacing = 12
- ChildSizing.TopBottomSpacing = 4
- ChildSizing.ShrinkHorizontal = crsScaleChilds
- ChildSizing.ShrinkVertical = crsScaleChilds
- ChildSizing.Layout = cclTopToBottomThenLeftToRight
- ChildSizing.ControlsPerLine = 4
- ClientHeight = 108
- ClientWidth = 229
- ItemIndex = 0
- Items.Strings = (
- 'default drawing'
- 'default POI image'
- 'image from imagelist'
- 'custom drawing'
- )
- TabOrder = 8
- OnClick = rgPOIModeClick
- object Bevel3: TBevel
- Left = 151
- Height = 25
- Top = 4
- Width = 66
- Constraints.MaxHeight = 25
- Shape = bsSpacer
- end
- object BtnSelectPOIImage: TButton
- Left = 151
- Height = 25
- Top = 29
- Width = 66
- AutoSize = True
- BorderSpacing.Left = 8
- Caption = 'Select...'
- Enabled = False
- TabOrder = 4
- OnClick = BtnSelectPOIImageClick
- end
- object Bevel4: TBevel
- Left = 151
- Height = 25
- Top = 54
- Width = 66
- Constraints.MaxHeight = 25
- Shape = bsSpacer
- end
- object Bevel5: TBevel
- Left = 151
- Height = 25
- Top = 79
- Width = 66
- Constraints.MaxHeight = 25
- Shape = bsSpacer
- end
- end
- object CbZoomToCursor: TCheckBox
- AnchorSideLeft.Control = PgConfig
- AnchorSideTop.Control = gbProxy
- AnchorSideTop.Side = asrBottom
- Left = 4
- Height = 19
- Top = 249
- Width = 100
- BorderSpacing.Left = 4
- BorderSpacing.Top = 8
- BorderSpacing.Right = 16
- Caption = 'Zoom to cursor'
- Checked = True
- State = cbChecked
- TabOrder = 2
- OnChange = CbZoomToCursorChange
- end
- object cbCyclicView: TCheckBox
- AnchorSideLeft.Control = CbZoomToCursor
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = CbZoomToCursor
- Left = 120
- Height = 19
- Top = 249
- Width = 77
- Caption = 'Cyclic view'
- Checked = True
- State = cbChecked
- TabOrder = 3
- OnChange = cbCyclicViewChange
- end
- object clbBackColor: TColorButton
- AnchorSideLeft.Control = cbCyclicView
- AnchorSideTop.Control = CbDoubleBuffer
- AnchorSideTop.Side = asrCenter
- Left = 120
- Height = 28
- Top = 290
- Width = 108
- BorderWidth = 2
- ButtonColorAutoSize = False
- ButtonColorSize = 15
- ButtonColor = clWhite
- Caption = 'Map backgr.'
- Margin = 4
- OnColorChanged = clbBackColorColorChanged
- end
- object CbPreviewTiles: TCheckBox
- AnchorSideLeft.Control = cbCyclicView
- AnchorSideTop.Control = CbUseThreads
- Left = 120
- Height = 19
- Top = 272
- Width = 83
- Caption = 'Preview tiles'
- Checked = True
- State = cbChecked
- TabOrder = 5
- OnChange = CbPreviewTilesChange
- end
- object gbProxy: TGroupBox
- AnchorSideLeft.Control = PgConfig
- AnchorSideTop.Control = CbProviders
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = PgConfig
- AnchorSideRight.Side = asrBottom
- Left = 4
- Height = 185
- Top = 56
- Width = 259
- Anchors = [akTop, akLeft, akRight]
- AutoSize = True
- BorderSpacing.Top = 4
- BorderSpacing.Around = 4
- Caption = 'Proxy'
- ClientHeight = 165
- ClientWidth = 255
- TabOrder = 1
- object lblProxyHost: TLabel
- AnchorSideLeft.Control = rbNoProxy
- AnchorSideTop.Control = edProxyHost
- AnchorSideTop.Side = asrCenter
- Left = 20
- Height = 15
- Top = 65
- Width = 28
- BorderSpacing.Left = 10
- Caption = 'Host:'
- ParentColor = False
- end
- object edProxyHost: TEdit
- AnchorSideLeft.Control = edProxyUserName
- AnchorSideTop.Control = rbProxyData
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = gbProxy
- AnchorSideRight.Side = asrBottom
- Left = 85
- Height = 23
- Top = 61
- Width = 164
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Right = 6
- TabOrder = 3
- OnChange = rbProxyChange
- end
- object lblProxyPort: TLabel
- AnchorSideLeft.Control = lblProxyHost
- AnchorSideTop.Control = seProxyPort
- AnchorSideTop.Side = asrCenter
- Left = 20
- Height = 15
- Top = 90
- Width = 22
- Caption = 'Port'
- ParentColor = False
- end
- object seProxyPort: TSpinEdit
- AnchorSideLeft.Control = lblProxyUserName
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = edProxyHost
- AnchorSideTop.Side = asrBottom
- Left = 85
- Height = 23
- Top = 86
- Width = 70
- BorderSpacing.Top = 2
- MaxValue = 65535
- TabOrder = 4
- OnChange = rbProxyChange
- end
- object lblProxyUserName: TLabel
- AnchorSideLeft.Control = lblProxyHost
- AnchorSideTop.Control = edProxyUserName
- AnchorSideTop.Side = asrCenter
- Left = 20
- Height = 15
- Top = 115
- Width = 59
- BorderSpacing.Right = 6
- Caption = 'User name:'
- ParentColor = False
- end
- object edProxyUserName: TEdit
- AnchorSideLeft.Control = lblProxyUserName
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = seProxyPort
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = gbProxy
- AnchorSideRight.Side = asrBottom
- Left = 85
- Height = 23
- Top = 111
- Width = 164
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Top = 2
- BorderSpacing.Right = 6
- TabOrder = 5
- OnChange = rbProxyChange
- end
- object lblProxyPassword: TLabel
- AnchorSideLeft.Control = lblProxyHost
- AnchorSideTop.Control = edProxyPassword
- AnchorSideTop.Side = asrCenter
- Left = 20
- Height = 15
- Top = 140
- Width = 50
- Caption = 'Password'
- ParentColor = False
- end
- object edProxyPassword: TEdit
- AnchorSideLeft.Control = edProxyUserName
- AnchorSideTop.Control = edProxyUserName
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = gbProxy
- AnchorSideRight.Side = asrBottom
- Left = 85
- Height = 23
- Top = 136
- Width = 164
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Top = 2
- BorderSpacing.Right = 6
- BorderSpacing.Bottom = 6
- TabOrder = 6
- OnChange = rbProxyChange
- end
- object rbProxyData: TRadioButton
- AnchorSideLeft.Control = rbNoProxy
- AnchorSideTop.Control = rbSystemProxy
- AnchorSideTop.Side = asrBottom
- Left = 10
- Height = 19
- Top = 42
- Width = 74
- BorderSpacing.Top = 2
- Caption = 'Proxy data'
- TabOrder = 2
- OnChangeBounds = rbProxyChange
- end
- object rbNoProxy: TRadioButton
- AnchorSideLeft.Control = gbProxy
- AnchorSideTop.Control = gbProxy
- Left = 10
- Height = 19
- Top = 0
- Width = 67
- BorderSpacing.Left = 10
- Caption = 'No proxy'
- TabOrder = 0
- OnChange = rbProxyChange
- end
- object rbSystemProxy: TRadioButton
- AnchorSideLeft.Control = rbNoProxy
- AnchorSideTop.Control = rbNoProxy
- AnchorSideTop.Side = asrBottom
- Left = 10
- Height = 19
- Top = 21
- Width = 110
- BorderSpacing.Top = 2
- Caption = 'Use system proxy'
- Checked = True
- TabOrder = 1
- TabStop = True
- OnChange = rbProxyChange
- end
- end
end
end
object GeoNames: TMVGeoNames
diff --git a/components/lazmapviewer/examples/fulldemo/main.pas b/components/lazmapviewer/examples/fulldemo/main.pas
index 7ecb63175..6c66d9834 100644
--- a/components/lazmapviewer/examples/fulldemo/main.pas
+++ b/components/lazmapviewer/examples/fulldemo/main.pas
@@ -1,3 +1,10 @@
+{ This file is used by the "MapViewer_Demo" and the "MapViewer_Demo_with_Addons"
+ projects.
+
+ Active define WITH_ADDONS in the project options for "MapViewer_Demo_with_Addons"
+ and make sure that the addon packages are listed as requirements.
+}
+
unit Main;
{$mode objfpc}{$H+}
@@ -6,65 +13,39 @@ interface
uses
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls,
- StdCtrls, ComCtrls, Buttons, IntfGraphics, ColorBox, Spin, PrintersDlgs,
- mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine, Grids, ExtDlgs;
+ StdCtrls, ComCtrls, Buttons, IntfGraphics, PrintersDlgs,
+ Grids, ExtDlgs,
+ mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine,
+ {$IFDEF WITH_ADDONS}ConfigFrame_with_Addons{$ELSE}ConfigFrame{$ENDIF};
type
-
{ TMainForm }
TMainForm = class(TForm)
- Bevel1: TBevel;
Bevel2: TBevel;
- Bevel3: TBevel;
- Bevel4: TBevel;
- Bevel5: TBevel;
BtnSearch: TButton;
BtnGoTo: TButton;
BtnGPSPoints: TButton;
BtnSaveToFile: TButton;
BtnLoadGPXFile: TButton;
- BtnPOITextFont: TButton;
BtnPrintMap: TButton;
- BtnSelectPOIImage: TButton;
- CbDoubleBuffer: TCheckBox;
CbFoundLocations: TComboBox;
CbLocations: TComboBox;
- CbProviders: TComboBox;
OpenPictureDialog: TOpenPictureDialog;
PgLayers: TTabSheet;
- rbSystemProxy: TRadioButton;
- rbNoProxy: TRadioButton;
- rbProxyData: TRadioButton;
- CbUseThreads: TCheckBox;
CbMouseCoords: TGroupBox;
CbDistanceUnits: TComboBox;
- CbDebugTiles: TCheckBox;
- cbPOITextBgColor: TColorBox;
- CbZoomToCursor: TCheckBox;
- cbCyclicView: TCheckBox;
- CbPreviewTiles: TCheckBox;
- clbBackColor: TColorButton;
- edProxyHost: TEdit;
- edProxyUserName: TEdit;
- edProxyPassword: TEdit;
FontDialog: TFontDialog;
GbCenterCoords: TGroupBox;
GbScreenSize: TGroupBox;
GbSearch: TGroupBox;
GbGPS: TGroupBox;
- gbProxy: TGroupBox;
InfoCenterLatitude: TLabel;
InfoViewportHeight: TLabel;
InfoCenterLongitude: TLabel;
InfoBtnGPSPoints: TLabel;
GPSPointInfo: TLabel;
InfoViewportWidth: TLabel;
- lblProxyUserName: TLabel;
- lblProxyPort: TLabel;
- lblProxyHost: TLabel;
- LblPOITextBgColor: TLabel;
- lblProxyPassword: TLabel;
LblSelectLocation: TLabel;
LblCenterLatitude: TLabel;
LblViewportHeight: TLabel;
@@ -74,20 +55,15 @@ type
InfoPositionLongitude: TLabel;
InfoPositionLatitude: TLabel;
LblCenterLongitude: TLabel;
- LblProviders: TLabel;
LblZoom: TLabel;
MapView: TMapView;
GeoNames: TMVGeoNames;
- BtnLoadMapProviders: TSpeedButton;
- BtnSaveMapProviders: TSpeedButton;
OpenDialog: TOpenDialog;
PageControl: TPageControl;
PgData: TTabSheet;
PgConfig: TTabSheet;
POIImages: TImageList;
PrintDialog: TPrintDialog;
- rgPOIMode: TRadioGroup;
- seProxyPort: TSpinEdit;
sgLayers: TStringGrid;
rgDrawMode: TRadioGroup;
lblOpacity: TLabel;
@@ -100,21 +76,9 @@ type
procedure BtnGPSPointsClick(Sender: TObject);
procedure BtnSaveToFileClick(Sender: TObject);
procedure BtnPOITextFontClick(Sender: TObject);
- procedure BtnSelectPOIImageClick(Sender: TObject);
- procedure cbCyclicViewChange(Sender: TObject);
- procedure CbDebugTilesChange(Sender: TObject);
- procedure CbDoubleBufferChange(Sender: TObject);
procedure CbFoundLocationsDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
- procedure cbPOITextBgColorChange(Sender: TObject);
- procedure CbPreviewTilesChange(Sender: TObject);
- procedure CbProvidersChange(Sender: TObject);
- procedure rbProxyChange(Sender: TObject);
- procedure CbShowPOIImageChange(Sender: TObject);
- procedure CbUseThreadsChange(Sender: TObject);
procedure CbDistanceUnitsChange(Sender: TObject);
- procedure CbZoomToCursorChange(Sender: TObject);
- procedure clbBackColorColorChanged(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
@@ -128,23 +92,18 @@ type
procedure MapViewMouseUp(Sender: TObject; Button: TMouseButton;
{%H-}Shift: TShiftState; X, Y: Integer);
procedure MapViewZoomChange(Sender: TObject);
- procedure BtnLoadMapProvidersClick(Sender: TObject);
- procedure BtnSaveMapProvidersClick(Sender: TObject);
procedure rgDrawModeSelectionChanged(Sender: TObject);
- procedure rgPOIModeClick(Sender: TObject);
- procedure sgLayersCheckboxToggled(sender: TObject; aCol, aRow: Integer;
- aState: TCheckboxState);
+ procedure sgLayersCheckboxToggled({%H-}Sender: TObject; {%H-}aCol, {%H-}aRow: Integer; aState: TCheckboxState);
procedure sgLayersEditingDone(Sender: TObject);
- procedure sgLayersSelection(Sender: TObject; aCol, aRow: Integer);
+ procedure sgLayersSelection(Sender: TObject; {%H-}aCol, aRow: Integer);
procedure tbOpacityChange(Sender: TObject);
- procedure UpdateLayers;
+ procedure UpdateLayers(Sender: TObject);
procedure ZoomTrackBarChange(Sender: TObject);
private
- POIImage: TCustomBitmap;
+ CfgFrame: {$IFDEF WITH_ADDONS}TCfgFrame_with_Addons{$ELSE}TCfgFrame{$ENDIF};
procedure ClearFoundLocations;
procedure UpdateCoords(X, Y: Integer);
- procedure UpdateDownloadEngineProxy;
procedure UpdateDropdownWidth(ACombobox: TCombobox);
procedure UpdateLocationHistory(ALocation: String);
procedure UpdateViewportSize;
@@ -177,7 +136,6 @@ type
const
MAX_LOCATIONS_HISTORY = 50;
- MAP_PROVIDER_FILENAME = 'map-providers.xml';
USE_DMS = true;
_TILELAYERS_ID_ = 42;
@@ -193,28 +151,6 @@ end;
{ TMainForm }
-procedure TMainForm.BtnLoadMapProvidersClick(Sender: TObject);
-var
- fn: String;
- msg: String;
-begin
- fn := Application.Location + MAP_PROVIDER_FILENAME;
- if FileExists(fn) then begin
- if MapView.Engine.ReadProvidersFromXML(fn, msg) then begin
- MapView.GetMapProviders(CbProviders.Items);
- CbProviders.ItemIndex := 0;
- MapView.MapProvider := CbProviders.Text;
- sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
- end else
- ShowMessage(msg);
- end;
-end;
-
-procedure TMainForm.BtnSaveMapProvidersClick(Sender: TObject);
-begin
- MapView.Engine.WriteProvidersToXML(Application.Location + MAP_PROVIDER_FILENAME);
-end;
-
procedure TMainForm.rgDrawModeSelectionChanged(Sender: TObject);
begin
TileLayer[Pred(sgLayers.Row)].DrawMode := TItemDrawMode(rgDrawMode.ItemIndex);
@@ -374,34 +310,6 @@ begin
MapView.Font.Assign(FontDialog.Font);
end;
-procedure TMainForm.BtnSelectPOIImageClick(Sender: TObject);
-begin
- OpenPictureDialog.Filter := 'PNG files|*.png|BMP files|*.bmp';
- OpenPictureDialog.DefaultExt := '.png';
- if OpenPictureDialog.Execute then
- begin
- POIImage.LoadFromFile(OpenPictureDialog.FileName);
- MapView.POIImage.Assign(POIImage);
- end;
-end;
-
-procedure TMainForm.cbCyclicViewChange(Sender: TObject);
-begin
- MapView.Cyclic := cbCyclicView.Checked;
- UpdateLayers;
-end;
-
-procedure TMainForm.CbDebugTilesChange(Sender: TObject);
-begin
- MapView.DebugTiles := CbDebugTiles.Checked;
- MapView.Invalidate;
-end;
-
-procedure TMainForm.CbDoubleBufferChange(Sender: TObject);
-begin
- MapView.DoubleBuffered := CbDoubleBuffer.Checked;
-end;
-
procedure TMainForm.CbFoundLocationsDrawItem(Control: TWinControl;
Index: Integer; ARect: TRect; State: TOwnerDrawState);
var
@@ -431,58 +339,12 @@ begin
combo.Canvas.TextOut(x, y, P.Descr);
end;
-procedure TMainForm.cbPOITextBgColorChange(Sender: TObject);
-begin
- MapView.POITextBgColor := cbPOITextBgColor.Selected;
-end;
-
-procedure TMainForm.CbPreviewTilesChange(Sender: TObject);
-begin
- MapView.DrawPreviewTiles := CbPreviewTiles.Checked;
-end;
-
-procedure TMainForm.CbProvidersChange(Sender: TObject);
-begin
- MapView.MapProvider := CbProviders.Text;
-end;
-
-procedure TMainForm.rbProxyChange(Sender: TObject);
-begin
- UpdateDownloadEngineProxy;
-end;
-
-procedure TMainForm.CbShowPOIImageChange(Sender: TObject);
-begin
- {
- if CbShowPOIImage.Checked then
- MapView.POIImage.Assign(POIImage)
- else
- MapView.POIImage.Clear;
- }
-end;
-
-procedure TMainForm.CbUseThreadsChange(Sender: TObject);
-begin
- MapView.UseThreads := CbUseThreads.Checked;
- UpdateLayers;
-end;
-
procedure TMainForm.CbDistanceUnitsChange(Sender: TObject);
begin
DistanceUnit := TDistanceUnits(CbDistanceUnits.ItemIndex);
UpdateViewPortSize;
end;
-procedure TMainForm.CbZoomToCursorChange(Sender: TObject);
-begin
- MapView.ZoomToCursor := CbZoomToCursor.Checked;
-end;
-
-procedure TMainForm.clbBackColorColorChanged(Sender: TObject);
-begin
- MapView.InactiveColor := clbBackColor.ButtonColor;
-end;
-
procedure TMainForm.ClearFoundLocations;
var
i: Integer;
@@ -497,35 +359,17 @@ end;
procedure TMainForm.FormCreate(Sender: TObject);
var
- fn: String;
I: Integer;
begin
+ CfgFrame := {$IFDEF WITH_ADDONS}TCfgFrame_with_Addons{$ELSE}TCfgFrame{$ENDIF}.Create(self);
+ CfgFrame.Parent := pgConfig;
+ CfgFrame.Align := alClient;
+ CfgFrame.MapView := MapView;
+ CfgFrame.OnDrawGPSPoint := @MapViewDrawGpsPoint;
+ CfgFrame.OnUpdateLayers := @UpdateLayers;
+
cInputQueryEditSizePercents := 0;
- fn := Application.Location + 'mapmarker.png';
- if not FileExists(fn) then
- MessageDlg('Copy the file "mapmarker.png" from the source folder to the folder with the executable.',
- mtError, [mbOK], 0)
- else
- begin
- // FMapMarker := CreateMapMarker(32, clRed, clBlack);
- POIImage := TPortableNetworkGraphic.Create;
- POIImage.PixelFormat := pf32bit;
- POIImage.LoadFromFile(fn);
- end;
-
- MapView.GetMapProviders(CbProviders.Items);
- CbProviders.ItemIndex := CbProviders.Items.IndexOf(MapView.MapProvider);
- sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
- MapView.DoubleBuffered := true;
- MapView.Zoom := 1;
- CbZoomToCursor.Checked := MapView.ZoomToCursor;
- CbUseThreads.Checked := MapView.UseThreads;
- CbDoubleBuffer.Checked := MapView.DoubleBuffered;
- CbPOITextBgColor.Selected := MapView.POITextBgColor;
- CbPOITextBgColor.ItemHeight := CbProviders.ItemHeight + 2;
- ClbBackColor.ButtonColor := MapView.InactiveColor;
-
InfoPositionLongitude.Caption := '';
InfoPositionLatitude.Caption := '';
InfoCenterLongitude.Caption := '';
@@ -567,7 +411,6 @@ begin
for I := 0 to High(TileLayer) do
MapView.GPSLayer[I].Delete(TileLayer[I]);
ClearFoundLocations;
- FreeAndNil(POIImage)
end;
procedure TMainForm.FormShow(Sender: TObject);
@@ -599,22 +442,30 @@ var
sym: TGPSSymbol;
clr: TColor;
extent: TSize;
+ lMapView: TMapView;
begin
+ lMapView := TMapView(Sender);
+
// Screen coordinates of the GPS point
- P := TMapView(Sender).LatLonToScreen(APoint.RealPoint);
+ P := lMapView.LatLonToScreen(APoint.RealPoint);
// Draw the GPS point as specified by the data in the point's ExtraData
- if not (APoint.ExtraData is TGPSExtraData) then
- exit;
-
- // Get the POI attributes
- with TGPSExtraData(APoint.ExtraData) do
+ if (APoint.ExtraData is TGPSExtraData) then
+ // Get the POI attributes
+ with TGPSExtraData(APoint.ExtraData) do
+ begin
+ clr := Color;
+ sym := Symbol;
+ d := Size div 2;
+ end
+ else
begin
- clr := Color;
- sym := Symbol;
- d := Size div 2;
+ sym := gpsPlus;
+ clr := clRed;
+ d := 5;
end;
+
// Draw the POI symbol
ADrawer.PenColor := clr;
case sym of
@@ -655,12 +506,12 @@ begin
// Prepare text output: background color...
inc(P.Y, d + 4);
extent := ADrawer.TextExtent(APoint.Name);
- if cbPOITextBgColor.selected = clNone then
+ if CfgFrame.POITextBkColor = clNone then
ADrawer.BrushStyle := bsClear
else
begin
ADrawer.BrushStyle := bsSolid;
- ADrawer.BrushColor := cbPOITextBgColor.Selected;
+ ADrawer.BrushColor := CfgFrame.POITextBkColor;
end;
// ... and font
@@ -673,11 +524,6 @@ begin
ADrawer.TextOut(P.X - extent.CX div 2, P.Y, APoint.Name);
end;
-{ ADrawer.BrushColor := clRed;
- ADrawer.BrushStyle := bsSolid;
- ADrawer.Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R);
-end;
- }
procedure TMainForm.MapViewMouseLeave(Sender: TObject);
begin
UpdateCoords(MaxInt, MaxInt);
@@ -733,14 +579,14 @@ begin
if (Button = mbRight) then begin
rPt := MapView.ScreenToLatLon(Point(X, Y));
- case rgPOIMode.ItemIndex of
- 0, 1:
+ case CfgFrame.POIMode of
+ pmDefaultDrawing, pmDefaultImage:
begin
if not InputQuery('Name of GPS location', 'Please enter name', gpsName) then
exit;
gpsPt := TGpsPoint.CreateFrom(rPt);
end;
- 2:
+ pmImageList:
begin
if GPSPointForm = nil then
begin
@@ -754,7 +600,7 @@ begin
GPSPointForm.GetImageIndexData(gpsName, gpsImageIndex);
TGPSPointOfInterest(gpsPt).ImageIndex := gpsImageIndex;
end;
- 3:
+ pmCustomDrawing:
begin
if GPSPointForm = nil then
begin
@@ -796,24 +642,10 @@ var
s: String;
pt: TRealPoint;
du: TDistanceUnits;
+ provider: String;
begin
ini := TMemIniFile.Create(CalcIniName);
try
- HERE_AppID := ini.ReadString('HERE', 'APP_ID', '');
- HERE_AppCode := ini.ReadString('HERE', 'APP_CODE', '');
- OpenWeatherMap_ApiKey := ini.ReadString('OpenWeatherMap', 'API_Key', '');
- ThunderForest_ApiKey := ini.ReadString('ThunderForest', 'API_Key', '');
-
- if ((HERE_AppID <> '') and (HERE_AppCode <> '')) or
- (OpenWeatherMap_ApiKey <> '') or
- (ThunderForest_ApiKey <> '') then
- begin
- MapView.Engine.ClearMapProviders;
- MapView.Engine.RegisterProviders;
- MapView.GetMapProviders(CbProviders.Items);
- sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
- end;
-
R := Screen.DesktopRect;
L := ini.ReadInteger('MainForm', 'Left', Left);
T := ini.ReadInteger('MainForm', 'Top', Top);
@@ -825,20 +657,34 @@ begin
if T < R.Top then T := R.Top;
SetBounds(L, T, W, H);
- s := ini.ReadString('MapView', 'Provider', MapView.MapProvider);
- if CbProviders.Items.IndexOf(s) = -1 then begin
- MessageDlg('Map provider "' + s + '" not found.', mtError, [mbOK], 0);
- s := CbProviders.Items[0];
- end;
- MapView.MapProvider := s;
- CbProviders.Text := MapView.MapProvider;
+ HERE_AppID := ini.ReadString('HERE', 'APP_ID', '');
+ HERE_AppCode := ini.ReadString('HERE', 'APP_CODE', '');
+ OpenWeatherMap_ApiKey := ini.ReadString('OpenWeatherMap', 'API_Key', '');
+ ThunderForest_ApiKey := ini.ReadString('ThunderForest', 'API_Key', '');
+ list := TStringList.Create;
+ try
+ MapView.Engine.ClearMapProviders;
+ MapView.Engine.RegisterProviders;
+ MapView.GetMapProviders(list);
+ sgLayers.Columns[1].PickList.Assign(list);
+
+ provider := ini.ReadString('MapView', 'Provider', MapView.MapProvider);
+ if MapView.Engine.MapProviderByName(provider) = nil then
+ begin
+ MessageDlg('Map provider "' + provider + '" not found.', mtError, [mbOK], 0);
+ provider := list[0];
+ end;
+ MapView.MapProvider := provider;
+ finally
+ list.Free;
+ end;
+
+ MapView.InactiveColor := ini.ReadInteger('MapView', 'MapBkgrColor', MapView.InactiveColor);
MapView.Zoom := ini.ReadInteger('MapView', 'Zoom', MapView.Zoom);
pt.Lon := StrToFloatDef(ini.ReadString('MapView', 'Center.Longitude', ''), 0.0, PointFormatSettings);
pt.Lat := StrToFloatDef(ini.ReadString('MapView', 'Center.Latitude', ''), 0.0, PointFormatSettings);
MapView.Center := pt;
- MapView.InactiveColor := ini.ReadInteger('MapView', 'MapBkgrColor', MapView.InactiveColor);
- clbBackColor.ButtonColor := MapView.InactiveColor;
s := ini.ReadString('MapView', 'DistanceUnits', '');
if s <> '' then begin
@@ -862,47 +708,13 @@ begin
List.Free;
end;
- i := ini.ReadInteger('Proxy', 'UseProxy', 0);
- case i of
- 0: rbNoProxy.Checked := true;
- 1: rbSystemProxy.Checked := true;
- 2: rbProxyData.Checked := true;
- end;
- edProxyHost.Text := ini.ReadString('Proxy', 'ProxyHost', edProxyHost.Text);
- seProxyPort.Value := ini.ReadInteger('Proxy', 'ProxyPort', seProxyPort.Value);
- edProxyUserName.Text := ini.ReadString('Proxy', 'ProxyName', edProxyUserName.Text);
- edProxyPassword.Text := ini.ReadString('Proxy', 'ProxyPassword', edProxyPassword.Text);
-
- UpdateDownloadEngineProxy;
+ CfgFrame.ReadFromIni(ini);
finally
ini.Free;
end;
end;
-procedure TMainForm.rgPOIModeClick(Sender: TObject);
-begin
- case rgPOIMode.ItemIndex of
- 0: begin // default
- if MapView.POIImage <> nil then MapView.POIImage.Clear;
- MapView.OnDrawGPSPoint := nil;
- MapView.Invalidate;
- end;
- 1: begin // default POI image
- MapView.POIImage := POIImage;
- MapView.OnDrawGPSPoint := nil;
- MapView.Invalidate;
- end;
- 2: ; // image from image list
- 3: begin // symbol
- if MapView.POIImage <> nil then MapView.POIImage.Clear;
- MapView.OnDrawGPSPoint := @MapViewDrawGpsPoint;
- MapView.Invalidate;
- end;
- end;
- BtnSelectPOIImage.Enabled := (rgPOIMode.ItemIndex = 1);
-end;
-
procedure TMainForm.sgLayersCheckboxToggled(sender: TObject; aCol,
aRow: Integer; aState: TCheckboxState);
begin
@@ -936,7 +748,7 @@ begin
MapView.Redraw;
end;
-procedure TMainForm.UpdateLayers;
+procedure TMainForm.UpdateLayers(Sender: TObject);
var
TL: TGPSTileLayer;
begin
@@ -964,26 +776,6 @@ begin
end;
end;
-procedure TMainForm.UpdateDownloadEngineProxy;
-begin
- if MapView.DownloadEngine.HasProxySupport then
- begin
- MapView.DownloadEngine.SetProxy(
- rbSystemProxy.Checked, rbProxyData.Checked,
- edProxyHost.Name, seProxyPort.Value, edProxyUserName.Text, edProxyPassword.Text
- );
- rbSystemProxy.Enabled := MapView.DownloadEngine.SupportsSystemProxy;
- lblProxyHost.Enabled := rbProxyData.Checked;
- edProxyHost.Enabled := rbProxyData.Checked;
- lblProxyPort.Enabled := rbProxyData.Checked;
- seProxyPort.Enabled := rbProxyData.Checked;
- lblProxyUserName.Enabled := rbProxyData.Checked;
- edProxyUserName.Enabled := rbProxyData.Checked;
- lblProxyPassword.Enabled := rbProxyData.Checked;
- edProxyPassword.Enabled := rbProxyData.Checked;
- end;
-end;
-
procedure TMainForm.UpdateDropdownWidth(ACombobox: TCombobox);
var
cnv: TControlCanvas;
@@ -1082,18 +874,7 @@ begin
for i := 0 to CbLocations.Items.Count-1 do
ini.WriteString('Locations', 'Item'+IntToStr(i), CbLocations.Items[i]);
- if rbSystemProxy.Checked then
- i := 1
- else if rbProxyData.Checked then
- i := 2
- else
- i := 0;
- ini.EraseSection('Proxy');
- ini.WriteInteger('Proxy', 'UseProxy', i);
- ini.WriteString('Proxy', 'ProxyHost', edProxyHost.Text);
- ini.WriteInteger('Proxy', 'ProxyPort', seProxyPort.Value);
- ini.WriteString('Proxy', 'ProxyName', edProxyUserName.Text);
- ini.WriteString('Proxy', 'ProxyPassword', edProxyPassword.Text);
+ CfgFrame.WriteToIni(ini);
finally
ini.Free;
diff --git a/components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpi b/components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpi
similarity index 86%
rename from components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpi
rename to components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpi
index 750d20610..15761dcc9 100644
--- a/components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpi
+++ b/components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpi
@@ -36,10 +36,11 @@
-
+
-
+
+
@@ -71,13 +72,21 @@
+
+
+
+
+
+
+
+
-
+
diff --git a/components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpr b/components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpr
similarity index 91%
rename from components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpr
rename to components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpr
index 8579b1dda..a6ea80525 100644
--- a/components/lazmapviewer/examples/fulldemo/MapViewer_Demo.lpr
+++ b/components/lazmapviewer/examples/fulldemo/mapviewer_demo.lpr
@@ -6,7 +6,7 @@ uses
{$IFDEF UNIX}cthreads,{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms,
- Main, gpslistform;
+ Main, gpslistform, ConfigFrame;
{$R *.res}
diff --git a/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpi b/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpi
new file mode 100644
index 000000000..27cd00c29
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpi
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpr b/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpr
new file mode 100644
index 000000000..f61b7fed5
--- /dev/null
+++ b/components/lazmapviewer/examples/fulldemo/mapviewer_demo_with_addons.lpr
@@ -0,0 +1,22 @@
+program MapViewer_Demo;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}cthreads,{$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms,
+ Main, gpslistform, ConfigFrame, configframe_with_addons;
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource:=True;
+ Application.Title:='MapViewer_Demo_with_Addons';
+ Application.Scaled:=True;
+ Application.Initialize;
+ Application.CreateForm(TMainForm, MainForm);
+ Application.CreateForm(TGPSListViewer, GPSListViewer);
+ Application.Run;
+end.
+