LazMapViewer: Combine the units of the two fulldemo projects.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9326 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-04-05 14:51:09 +00:00
parent d7ebdbad20
commit 20997f05cc
11 changed files with 1414 additions and 828 deletions

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -7,9 +7,14 @@ interface
uses uses
Classes, SysUtils, mvEngine; Classes, SysUtils, mvEngine;
type
TPOIMode = (pmDefaultDrawing, pmDefaultImage, pmImageList, pmCustomDrawing);
const
MAP_PROVIDER_FILENAME = 'map-providers.xml';
const const
DistanceUnit_Names: array[TDistanceUnits] of string = ('m', 'km', 'miles'); DistanceUnit_Names: array[TDistanceUnits] of string = ('m', 'km', 'miles');
var var
DistanceUnit: TDistanceUnits = duKilometers; DistanceUnit: TDistanceUnits = duKilometers;

View File

@ -1,7 +1,7 @@
object MainForm: TMainForm object MainForm: TMainForm
Left = 381 Left = 375
Height = 586 Height = 586
Top = 187 Top = 177
Width = 750 Width = 750
Caption = 'LazMapViewer' Caption = 'LazMapViewer'
ClientHeight = 586 ClientHeight = 586
@ -40,9 +40,9 @@ object MainForm: TMainForm
Height = 586 Height = 586
Top = 0 Top = 0
Width = 275 Width = 275
ActivePage = PgConfig ActivePage = PgData
Align = alRight Align = alRight
TabIndex = 2 TabIndex = 0
TabOrder = 1 TabOrder = 1
object PgData: TTabSheet object PgData: TTabSheet
Caption = 'Data' Caption = 'Data'
@ -715,534 +715,6 @@ object MainForm: TMainForm
end end
object PgConfig: TTabSheet object PgConfig: TTabSheet
Caption = 'Config' 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
end end
object GeoNames: TMVGeoNames object GeoNames: TMVGeoNames

View File

@ -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; unit Main;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
@ -6,65 +13,39 @@ interface
uses uses
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ComCtrls, Buttons, IntfGraphics, ColorBox, Spin, PrintersDlgs, StdCtrls, ComCtrls, Buttons, IntfGraphics, PrintersDlgs,
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine, Grids, ExtDlgs; Grids, ExtDlgs,
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine,
{$IFDEF WITH_ADDONS}ConfigFrame_with_Addons{$ELSE}ConfigFrame{$ENDIF};
type type
{ TMainForm } { TMainForm }
TMainForm = class(TForm) TMainForm = class(TForm)
Bevel1: TBevel;
Bevel2: TBevel; Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
BtnSearch: TButton; BtnSearch: TButton;
BtnGoTo: TButton; BtnGoTo: TButton;
BtnGPSPoints: TButton; BtnGPSPoints: TButton;
BtnSaveToFile: TButton; BtnSaveToFile: TButton;
BtnLoadGPXFile: TButton; BtnLoadGPXFile: TButton;
BtnPOITextFont: TButton;
BtnPrintMap: TButton; BtnPrintMap: TButton;
BtnSelectPOIImage: TButton;
CbDoubleBuffer: TCheckBox;
CbFoundLocations: TComboBox; CbFoundLocations: TComboBox;
CbLocations: TComboBox; CbLocations: TComboBox;
CbProviders: TComboBox;
OpenPictureDialog: TOpenPictureDialog; OpenPictureDialog: TOpenPictureDialog;
PgLayers: TTabSheet; PgLayers: TTabSheet;
rbSystemProxy: TRadioButton;
rbNoProxy: TRadioButton;
rbProxyData: TRadioButton;
CbUseThreads: TCheckBox;
CbMouseCoords: TGroupBox; CbMouseCoords: TGroupBox;
CbDistanceUnits: TComboBox; CbDistanceUnits: TComboBox;
CbDebugTiles: TCheckBox;
cbPOITextBgColor: TColorBox;
CbZoomToCursor: TCheckBox;
cbCyclicView: TCheckBox;
CbPreviewTiles: TCheckBox;
clbBackColor: TColorButton;
edProxyHost: TEdit;
edProxyUserName: TEdit;
edProxyPassword: TEdit;
FontDialog: TFontDialog; FontDialog: TFontDialog;
GbCenterCoords: TGroupBox; GbCenterCoords: TGroupBox;
GbScreenSize: TGroupBox; GbScreenSize: TGroupBox;
GbSearch: TGroupBox; GbSearch: TGroupBox;
GbGPS: TGroupBox; GbGPS: TGroupBox;
gbProxy: TGroupBox;
InfoCenterLatitude: TLabel; InfoCenterLatitude: TLabel;
InfoViewportHeight: TLabel; InfoViewportHeight: TLabel;
InfoCenterLongitude: TLabel; InfoCenterLongitude: TLabel;
InfoBtnGPSPoints: TLabel; InfoBtnGPSPoints: TLabel;
GPSPointInfo: TLabel; GPSPointInfo: TLabel;
InfoViewportWidth: TLabel; InfoViewportWidth: TLabel;
lblProxyUserName: TLabel;
lblProxyPort: TLabel;
lblProxyHost: TLabel;
LblPOITextBgColor: TLabel;
lblProxyPassword: TLabel;
LblSelectLocation: TLabel; LblSelectLocation: TLabel;
LblCenterLatitude: TLabel; LblCenterLatitude: TLabel;
LblViewportHeight: TLabel; LblViewportHeight: TLabel;
@ -74,20 +55,15 @@ type
InfoPositionLongitude: TLabel; InfoPositionLongitude: TLabel;
InfoPositionLatitude: TLabel; InfoPositionLatitude: TLabel;
LblCenterLongitude: TLabel; LblCenterLongitude: TLabel;
LblProviders: TLabel;
LblZoom: TLabel; LblZoom: TLabel;
MapView: TMapView; MapView: TMapView;
GeoNames: TMVGeoNames; GeoNames: TMVGeoNames;
BtnLoadMapProviders: TSpeedButton;
BtnSaveMapProviders: TSpeedButton;
OpenDialog: TOpenDialog; OpenDialog: TOpenDialog;
PageControl: TPageControl; PageControl: TPageControl;
PgData: TTabSheet; PgData: TTabSheet;
PgConfig: TTabSheet; PgConfig: TTabSheet;
POIImages: TImageList; POIImages: TImageList;
PrintDialog: TPrintDialog; PrintDialog: TPrintDialog;
rgPOIMode: TRadioGroup;
seProxyPort: TSpinEdit;
sgLayers: TStringGrid; sgLayers: TStringGrid;
rgDrawMode: TRadioGroup; rgDrawMode: TRadioGroup;
lblOpacity: TLabel; lblOpacity: TLabel;
@ -100,21 +76,9 @@ type
procedure BtnGPSPointsClick(Sender: TObject); procedure BtnGPSPointsClick(Sender: TObject);
procedure BtnSaveToFileClick(Sender: TObject); procedure BtnSaveToFileClick(Sender: TObject);
procedure BtnPOITextFontClick(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; procedure CbFoundLocationsDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState); 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 CbDistanceUnitsChange(Sender: TObject);
procedure CbZoomToCursorChange(Sender: TObject);
procedure clbBackColorColorChanged(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
@ -128,23 +92,18 @@ type
procedure MapViewMouseUp(Sender: TObject; Button: TMouseButton; procedure MapViewMouseUp(Sender: TObject; Button: TMouseButton;
{%H-}Shift: TShiftState; X, Y: Integer); {%H-}Shift: TShiftState; X, Y: Integer);
procedure MapViewZoomChange(Sender: TObject); procedure MapViewZoomChange(Sender: TObject);
procedure BtnLoadMapProvidersClick(Sender: TObject);
procedure BtnSaveMapProvidersClick(Sender: TObject);
procedure rgDrawModeSelectionChanged(Sender: TObject); procedure rgDrawModeSelectionChanged(Sender: TObject);
procedure rgPOIModeClick(Sender: TObject); procedure sgLayersCheckboxToggled({%H-}Sender: TObject; {%H-}aCol, {%H-}aRow: Integer; aState: TCheckboxState);
procedure sgLayersCheckboxToggled(sender: TObject; aCol, aRow: Integer;
aState: TCheckboxState);
procedure sgLayersEditingDone(Sender: TObject); procedure sgLayersEditingDone(Sender: TObject);
procedure sgLayersSelection(Sender: TObject; aCol, aRow: Integer); procedure sgLayersSelection(Sender: TObject; {%H-}aCol, aRow: Integer);
procedure tbOpacityChange(Sender: TObject); procedure tbOpacityChange(Sender: TObject);
procedure UpdateLayers; procedure UpdateLayers(Sender: TObject);
procedure ZoomTrackBarChange(Sender: TObject); procedure ZoomTrackBarChange(Sender: TObject);
private private
POIImage: TCustomBitmap; CfgFrame: {$IFDEF WITH_ADDONS}TCfgFrame_with_Addons{$ELSE}TCfgFrame{$ENDIF};
procedure ClearFoundLocations; procedure ClearFoundLocations;
procedure UpdateCoords(X, Y: Integer); procedure UpdateCoords(X, Y: Integer);
procedure UpdateDownloadEngineProxy;
procedure UpdateDropdownWidth(ACombobox: TCombobox); procedure UpdateDropdownWidth(ACombobox: TCombobox);
procedure UpdateLocationHistory(ALocation: String); procedure UpdateLocationHistory(ALocation: String);
procedure UpdateViewportSize; procedure UpdateViewportSize;
@ -177,7 +136,6 @@ type
const const
MAX_LOCATIONS_HISTORY = 50; MAX_LOCATIONS_HISTORY = 50;
MAP_PROVIDER_FILENAME = 'map-providers.xml';
USE_DMS = true; USE_DMS = true;
_TILELAYERS_ID_ = 42; _TILELAYERS_ID_ = 42;
@ -193,28 +151,6 @@ end;
{ TMainForm } { 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); procedure TMainForm.rgDrawModeSelectionChanged(Sender: TObject);
begin begin
TileLayer[Pred(sgLayers.Row)].DrawMode := TItemDrawMode(rgDrawMode.ItemIndex); TileLayer[Pred(sgLayers.Row)].DrawMode := TItemDrawMode(rgDrawMode.ItemIndex);
@ -374,34 +310,6 @@ begin
MapView.Font.Assign(FontDialog.Font); MapView.Font.Assign(FontDialog.Font);
end; 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; procedure TMainForm.CbFoundLocationsDrawItem(Control: TWinControl;
Index: Integer; ARect: TRect; State: TOwnerDrawState); Index: Integer; ARect: TRect; State: TOwnerDrawState);
var var
@ -431,58 +339,12 @@ begin
combo.Canvas.TextOut(x, y, P.Descr); combo.Canvas.TextOut(x, y, P.Descr);
end; 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); procedure TMainForm.CbDistanceUnitsChange(Sender: TObject);
begin begin
DistanceUnit := TDistanceUnits(CbDistanceUnits.ItemIndex); DistanceUnit := TDistanceUnits(CbDistanceUnits.ItemIndex);
UpdateViewPortSize; UpdateViewPortSize;
end; 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; procedure TMainForm.ClearFoundLocations;
var var
i: Integer; i: Integer;
@ -497,35 +359,17 @@ end;
procedure TMainForm.FormCreate(Sender: TObject); procedure TMainForm.FormCreate(Sender: TObject);
var var
fn: String;
I: Integer; I: Integer;
begin 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; 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 := ''; InfoPositionLongitude.Caption := '';
InfoPositionLatitude.Caption := ''; InfoPositionLatitude.Caption := '';
InfoCenterLongitude.Caption := ''; InfoCenterLongitude.Caption := '';
@ -567,7 +411,6 @@ begin
for I := 0 to High(TileLayer) do for I := 0 to High(TileLayer) do
MapView.GPSLayer[I].Delete(TileLayer[I]); MapView.GPSLayer[I].Delete(TileLayer[I]);
ClearFoundLocations; ClearFoundLocations;
FreeAndNil(POIImage)
end; end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
@ -599,22 +442,30 @@ var
sym: TGPSSymbol; sym: TGPSSymbol;
clr: TColor; clr: TColor;
extent: TSize; extent: TSize;
lMapView: TMapView;
begin begin
lMapView := TMapView(Sender);
// Screen coordinates of the GPS point // 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 // Draw the GPS point as specified by the data in the point's ExtraData
if not (APoint.ExtraData is TGPSExtraData) then if (APoint.ExtraData is TGPSExtraData) then
exit; // Get the POI attributes
with TGPSExtraData(APoint.ExtraData) do
// Get the POI attributes begin
with TGPSExtraData(APoint.ExtraData) do clr := Color;
sym := Symbol;
d := Size div 2;
end
else
begin begin
clr := Color; sym := gpsPlus;
sym := Symbol; clr := clRed;
d := Size div 2; d := 5;
end; end;
// Draw the POI symbol // Draw the POI symbol
ADrawer.PenColor := clr; ADrawer.PenColor := clr;
case sym of case sym of
@ -655,12 +506,12 @@ begin
// Prepare text output: background color... // Prepare text output: background color...
inc(P.Y, d + 4); inc(P.Y, d + 4);
extent := ADrawer.TextExtent(APoint.Name); extent := ADrawer.TextExtent(APoint.Name);
if cbPOITextBgColor.selected = clNone then if CfgFrame.POITextBkColor = clNone then
ADrawer.BrushStyle := bsClear ADrawer.BrushStyle := bsClear
else else
begin begin
ADrawer.BrushStyle := bsSolid; ADrawer.BrushStyle := bsSolid;
ADrawer.BrushColor := cbPOITextBgColor.Selected; ADrawer.BrushColor := CfgFrame.POITextBkColor;
end; end;
// ... and font // ... and font
@ -673,11 +524,6 @@ begin
ADrawer.TextOut(P.X - extent.CX div 2, P.Y, APoint.Name); ADrawer.TextOut(P.X - extent.CX div 2, P.Y, APoint.Name);
end; 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); procedure TMainForm.MapViewMouseLeave(Sender: TObject);
begin begin
UpdateCoords(MaxInt, MaxInt); UpdateCoords(MaxInt, MaxInt);
@ -733,14 +579,14 @@ begin
if (Button = mbRight) then begin if (Button = mbRight) then begin
rPt := MapView.ScreenToLatLon(Point(X, Y)); rPt := MapView.ScreenToLatLon(Point(X, Y));
case rgPOIMode.ItemIndex of case CfgFrame.POIMode of
0, 1: pmDefaultDrawing, pmDefaultImage:
begin begin
if not InputQuery('Name of GPS location', 'Please enter name', gpsName) then if not InputQuery('Name of GPS location', 'Please enter name', gpsName) then
exit; exit;
gpsPt := TGpsPoint.CreateFrom(rPt); gpsPt := TGpsPoint.CreateFrom(rPt);
end; end;
2: pmImageList:
begin begin
if GPSPointForm = nil then if GPSPointForm = nil then
begin begin
@ -754,7 +600,7 @@ begin
GPSPointForm.GetImageIndexData(gpsName, gpsImageIndex); GPSPointForm.GetImageIndexData(gpsName, gpsImageIndex);
TGPSPointOfInterest(gpsPt).ImageIndex := gpsImageIndex; TGPSPointOfInterest(gpsPt).ImageIndex := gpsImageIndex;
end; end;
3: pmCustomDrawing:
begin begin
if GPSPointForm = nil then if GPSPointForm = nil then
begin begin
@ -796,24 +642,10 @@ var
s: String; s: String;
pt: TRealPoint; pt: TRealPoint;
du: TDistanceUnits; du: TDistanceUnits;
provider: String;
begin begin
ini := TMemIniFile.Create(CalcIniName); ini := TMemIniFile.Create(CalcIniName);
try 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; R := Screen.DesktopRect;
L := ini.ReadInteger('MainForm', 'Left', Left); L := ini.ReadInteger('MainForm', 'Left', Left);
T := ini.ReadInteger('MainForm', 'Top', Top); T := ini.ReadInteger('MainForm', 'Top', Top);
@ -825,20 +657,34 @@ begin
if T < R.Top then T := R.Top; if T < R.Top then T := R.Top;
SetBounds(L, T, W, H); SetBounds(L, T, W, H);
s := ini.ReadString('MapView', 'Provider', MapView.MapProvider); HERE_AppID := ini.ReadString('HERE', 'APP_ID', '');
if CbProviders.Items.IndexOf(s) = -1 then begin HERE_AppCode := ini.ReadString('HERE', 'APP_CODE', '');
MessageDlg('Map provider "' + s + '" not found.', mtError, [mbOK], 0); OpenWeatherMap_ApiKey := ini.ReadString('OpenWeatherMap', 'API_Key', '');
s := CbProviders.Items[0]; ThunderForest_ApiKey := ini.ReadString('ThunderForest', 'API_Key', '');
end;
MapView.MapProvider := s;
CbProviders.Text := MapView.MapProvider;
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); MapView.Zoom := ini.ReadInteger('MapView', 'Zoom', MapView.Zoom);
pt.Lon := StrToFloatDef(ini.ReadString('MapView', 'Center.Longitude', ''), 0.0, PointFormatSettings); pt.Lon := StrToFloatDef(ini.ReadString('MapView', 'Center.Longitude', ''), 0.0, PointFormatSettings);
pt.Lat := StrToFloatDef(ini.ReadString('MapView', 'Center.Latitude', ''), 0.0, PointFormatSettings); pt.Lat := StrToFloatDef(ini.ReadString('MapView', 'Center.Latitude', ''), 0.0, PointFormatSettings);
MapView.Center := pt; MapView.Center := pt;
MapView.InactiveColor := ini.ReadInteger('MapView', 'MapBkgrColor', MapView.InactiveColor);
clbBackColor.ButtonColor := MapView.InactiveColor;
s := ini.ReadString('MapView', 'DistanceUnits', ''); s := ini.ReadString('MapView', 'DistanceUnits', '');
if s <> '' then begin if s <> '' then begin
@ -862,47 +708,13 @@ begin
List.Free; List.Free;
end; end;
i := ini.ReadInteger('Proxy', 'UseProxy', 0); CfgFrame.ReadFromIni(ini);
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;
finally finally
ini.Free; ini.Free;
end; end;
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, procedure TMainForm.sgLayersCheckboxToggled(sender: TObject; aCol,
aRow: Integer; aState: TCheckboxState); aRow: Integer; aState: TCheckboxState);
begin begin
@ -936,7 +748,7 @@ begin
MapView.Redraw; MapView.Redraw;
end; end;
procedure TMainForm.UpdateLayers; procedure TMainForm.UpdateLayers(Sender: TObject);
var var
TL: TGPSTileLayer; TL: TGPSTileLayer;
begin begin
@ -964,26 +776,6 @@ begin
end; end;
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); procedure TMainForm.UpdateDropdownWidth(ACombobox: TCombobox);
var var
cnv: TControlCanvas; cnv: TControlCanvas;
@ -1082,18 +874,7 @@ begin
for i := 0 to CbLocations.Items.Count-1 do for i := 0 to CbLocations.Items.Count-1 do
ini.WriteString('Locations', 'Item'+IntToStr(i), CbLocations.Items[i]); ini.WriteString('Locations', 'Item'+IntToStr(i), CbLocations.Items[i]);
if rbSystemProxy.Checked then CfgFrame.WriteToIni(ini);
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);
finally finally
ini.Free; ini.Free;

View File

@ -36,10 +36,11 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item3> </Item3>
</RequiredPackages> </RequiredPackages>
<Units Count="6"> <Units Count="7">
<Unit0> <Unit0>
<Filename Value="MapViewer_Demo.lpr"/> <Filename Value="mapViewer_demo.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="mapviewer_demo"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
@ -71,13 +72,21 @@
<Filename Value="..\..\source\mvengine_mapreg.inc"/> <Filename Value="..\..\source\mvengine_mapreg.inc"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit5> </Unit5>
<Unit6>
<Filename Value="configframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame"/>
</Unit6>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>
<Version Value="11"/> <Version Value="11"/>
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Target> <Target>
<Filename Value="bin\$(TargetCPU)-$(TargetOS)\MapViewer_Demo"/> <Filename Value="bin\$(TargetCPU)-$(TargetOS)\mapviewer_demo"/>
</Target> </Target>
<SearchPaths> <SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/> <IncludeFiles Value="$(ProjOutDir)"/>

View File

@ -6,7 +6,7 @@ uses
{$IFDEF UNIX}cthreads,{$ENDIF} {$IFDEF UNIX}cthreads,{$ENDIF}
Interfaces, // this includes the LCL widgetset Interfaces, // this includes the LCL widgetset
Forms, Forms,
Main, gpslistform; Main, gpslistform, ConfigFrame;
{$R *.res} {$R *.res}

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="MapViewer_Demo_with_Addons"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<BuildModes Count="1">
<Item1 Name="default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages Count="6">
<Item1>
<PackageName Value="lazmapviewer_bgra"/>
</Item1>
<Item2>
<PackageName Value="lazmapviewer_rgbgraphics"/>
</Item2>
<Item3>
<PackageName Value="lazMapViewer_Synapse"/>
</Item3>
<Item4>
<PackageName Value="Printer4Lazarus"/>
</Item4>
<Item5>
<PackageName Value="lazMapViewerPkg"/>
</Item5>
<Item6>
<PackageName Value="LCL"/>
</Item6>
</RequiredPackages>
<Units Count="8">
<Unit0>
<Filename Value="mapviewer_demo_with_addons.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit1>
<Unit2>
<Filename Value="gpslistform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="GPSListViewer"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit2>
<Unit3>
<Filename Value="globals.pas"/>
<IsPartOfProject Value="True"/>
</Unit3>
<Unit4>
<Filename Value="gpsptform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="GPSPointForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit4>
<Unit5>
<Filename Value="..\..\source\mvengine_mapreg.inc"/>
<IsPartOfProject Value="True"/>
</Unit5>
<Unit6>
<Filename Value="configframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame"/>
</Unit6>
<Unit7>
<Filename Value="configframe_with_addons.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame_with_addons"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame_with_Addons"/>
</Unit7>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="bin\$(TargetCPU)-$(TargetOS)\MapViewer_Demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CustomOptions Value="-dWITH_ADDONS"/>
<OtherDefines Count="1">
<Define0 Value="WITH_ADDONS"/>
</OtherDefines>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="4">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
<Item4>
<Name Value="EHTTPClient"/>
</Item4>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -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.