From 77cf10ddf66d748016eb0e39bbc38a1d721a7079 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Sat, 14 Mar 2015 09:46:57 +0000 Subject: [PATCH] Reverted trunk back to revision 38 (base for 1.0.6 release branch) --- G940LEDControl/Forms/ButtonAssignmentFrm.dfm | 45 - G940LEDControl/Forms/ButtonAssignmentFrm.pas | 87 - G940LEDControl/Forms/MainFrm.dfm | 1906 ++++++++--------- G940LEDControl/Forms/MainFrm.pas | 365 ++-- G940LEDControl/G940LEDControl.dpr | 7 +- G940LEDControl/G940LEDControl.dproj | 7 +- G940LEDControl/G940LEDControl.res | Bin 27760 -> 28524 bytes .../Resources/Icons/DeleteProfile.ico | Bin 1406 -> 0 bytes G940LEDControl/Resources/Icons/NewProfile.ico | Bin 1406 -> 0 bytes .../Resources/Icons/RenameProfile.ico | Bin 1406 -> 0 bytes .../Resources/Icons/RevertProfile.ico | Bin 1406 -> 0 bytes .../Resources/Icons/SaveProfile.ico | Bin 1406 -> 0 bytes .../Resources/Icons/SetActiveProfile.ico | Bin 1406 -> 0 bytes G940LEDControl/Units/FSXSimConnectClient.pas | 17 +- G940LEDControl/Units/Profile.pas | 17 +- G940LEDControl/Units/ProfileManager.pas | 175 +- 16 files changed, 1114 insertions(+), 1512 deletions(-) delete mode 100644 G940LEDControl/Forms/ButtonAssignmentFrm.dfm delete mode 100644 G940LEDControl/Forms/ButtonAssignmentFrm.pas delete mode 100644 G940LEDControl/Resources/Icons/DeleteProfile.ico delete mode 100644 G940LEDControl/Resources/Icons/NewProfile.ico delete mode 100644 G940LEDControl/Resources/Icons/RenameProfile.ico delete mode 100644 G940LEDControl/Resources/Icons/RevertProfile.ico delete mode 100644 G940LEDControl/Resources/Icons/SaveProfile.ico delete mode 100644 G940LEDControl/Resources/Icons/SetActiveProfile.ico diff --git a/G940LEDControl/Forms/ButtonAssignmentFrm.dfm b/G940LEDControl/Forms/ButtonAssignmentFrm.dfm deleted file mode 100644 index 15f4d67..0000000 --- a/G940LEDControl/Forms/ButtonAssignmentFrm.dfm +++ /dev/null @@ -1,45 +0,0 @@ -object ButtonAssignmentFrame: TButtonAssignmentFrame - Left = 0 - Top = 0 - Width = 261 - Height = 41 - TabOrder = 0 - DesignSize = ( - 261 - 41) - object lblFunction: TLabel - Left = 53 - Top = 6 - Width = 208 - Height = 13 - Anchors = [akLeft, akTop, akRight] - AutoSize = False - Caption = '[runtime: function]' - EllipsisPosition = epEndEllipsis - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblCategory: TLabel - Left = 53 - Top = 22 - Width = 208 - Height = 13 - Anchors = [akLeft, akTop, akRight] - AutoSize = False - Caption = '[runtime: category]' - EllipsisPosition = epEndEllipsis - end - object btnConfiguration: TButton - Left = 0 - Top = 0 - Width = 41 - Height = 41 - Caption = 'P&?' - TabOrder = 0 - OnClick = btnConfigurationClick - end -end diff --git a/G940LEDControl/Forms/ButtonAssignmentFrm.pas b/G940LEDControl/Forms/ButtonAssignmentFrm.pas deleted file mode 100644 index 123cdb3..0000000 --- a/G940LEDControl/Forms/ButtonAssignmentFrm.pas +++ /dev/null @@ -1,87 +0,0 @@ -unit ButtonAssignmentFrm; - -interface -uses - System.Classes, - Vcl.Controls, - Vcl.Forms, - Vcl.StdCtrls; - - -type - TButtonAssignmentFrame = class(TFrame) - btnConfiguration: TButton; - lblFunction: TLabel; - lblCategory: TLabel; - - procedure btnConfigurationClick(Sender: TObject); - private - FLEDIndex: Integer; - FOnConfigurationClick: TNotifyEvent; - - function GetCategoryName: string; - function GetFunctionName: string; - procedure SetCategoryName(const Value: string); - procedure SetFunctionName(const Value: string); - public - constructor Create(AOwner: TComponent); override; - - property LEDIndex: Integer read FLEDIndex write FLEDIndex; - property CategoryName: string read GetCategoryName write SetCategoryName; - property FunctionName: string read GetFunctionName write SetFunctionName; - - property OnConfigurationClick: TNotifyEvent read FOnConfigurationClick write FOnConfigurationClick; - end; - - -implementation -uses - Graphics; - - -{$R *.dfm} - - -{ TButtonAssignmentFrame } -constructor TButtonAssignmentFrame.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - - lblCategory.Font.Color := clGrayText; - - SetCategoryName(''); - SetFunctionName(''); -end; - - -function TButtonAssignmentFrame.GetCategoryName: string; -begin - Result := lblCategory.Caption; -end; - - -function TButtonAssignmentFrame.GetFunctionName: string; -begin - Result := lblFunction.Caption; -end; - - -procedure TButtonAssignmentFrame.SetCategoryName(const Value: string); -begin - lblCategory.Caption := Value; -end; - - -procedure TButtonAssignmentFrame.SetFunctionName(const Value: string); -begin - lblFunction.Caption := Value; -end; - - -procedure TButtonAssignmentFrame.btnConfigurationClick(Sender: TObject); -begin - if Assigned(FOnConfigurationClick) then - FOnConfigurationClick(Self); -end; - -end. diff --git a/G940LEDControl/Forms/MainFrm.dfm b/G940LEDControl/Forms/MainFrm.dfm index 55079fe..c2798a3 100644 --- a/G940LEDControl/Forms/MainFrm.dfm +++ b/G940LEDControl/Forms/MainFrm.dfm @@ -1,11 +1,12 @@ object MainForm: TMainForm Left = 0 Top = 0 + ActiveControl = cbProfileMenu BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'G940 LED Control' - ClientHeight = 609 - ClientWidth = 598 + ClientHeight = 548 + ClientWidth = 466 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -22,740 +23,360 @@ object MainForm: TMainForm AlignWithMargins = True Left = 8 Top = 60 - Width = 582 - Height = 541 + Width = 450 + Height = 480 Margins.Left = 8 Margins.Top = 8 Margins.Right = 8 Margins.Bottom = 8 - ActivePage = tsButtons + ActivePage = tsConfiguration Align = alClient TabOrder = 0 - ExplicitHeight = 436 object tsButtons: TTabSheet Caption = ' Button assignment ' - ExplicitHeight = 408 - inline bafP1: TButtonAssignmentFrame - Left = 267 - Top = 134 - Width = 261 - Height = 41 - TabOrder = 0 - ExplicitLeft = 267 - ExplicitTop = 134 - inherited btnConfiguration: TButton - Caption = 'P&1' - end + DesignSize = ( + 442 + 452) + object lblP1Function: TLabel + Left = 64 + Top = 73 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 end - inline bafP2: TButtonAssignmentFrame - Left = 267 - Top = 181 - Width = 261 - Height = 41 - TabOrder = 1 - ExplicitLeft = 267 - ExplicitTop = 181 - inherited btnConfiguration: TButton - Caption = 'P&2' - end + object lblP1Category: TLabel + Left = 64 + Top = 89 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 end - inline bafP3: TButtonAssignmentFrame - Left = 267 - Top = 228 - Width = 261 - Height = 41 - TabOrder = 2 - ExplicitLeft = 267 - ExplicitTop = 228 - inherited btnConfiguration: TButton - Caption = 'P&3' - end + object lblP2Function: TLabel + Left = 64 + Top = 120 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 end - inline bafP4: TButtonAssignmentFrame - Left = 267 - Top = 275 - Width = 261 + object lblP2Category: TLabel + Left = 64 + Top = 136 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP3Function: TLabel + Left = 64 + Top = 167 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP3Category: TLabel + Left = 64 + Top = 183 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP4Function: TLabel + Left = 64 + Top = 214 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP4Category: TLabel + Left = 64 + Top = 230 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP5Function: TLabel + Left = 64 + Top = 261 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP5Category: TLabel + Left = 64 + Top = 277 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP6Function: TLabel + Left = 64 + Top = 308 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP6Category: TLabel + Left = 64 + Top = 324 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP7Function: TLabel + Left = 64 + Top = 355 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP7Category: TLabel + Left = 64 + Top = 371 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblP8Function: TLabel + Left = 64 + Top = 402 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: function]' + EllipsisPosition = epEndEllipsis + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ExplicitWidth = 364 + end + object lblP8Category: TLabel + Left = 64 + Top = 418 + Width = 365 + Height = 13 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Caption = '[runtime: category]' + EllipsisPosition = epEndEllipsis + ExplicitWidth = 364 + end + object lblProfile: TLabel + Left = 11 + Top = 19 + Width = 30 + Height = 13 + Caption = 'Profile' + end + object bvlProfiles: TBevel + Left = 11 + Top = 52 + Width = 418 + Height = 13 + Shape = bsTopLine + end + object btnP1: TButton + Left = 11 + Top = 67 + Width = 41 Height = 41 + Caption = 'P&1' TabOrder = 3 - ExplicitLeft = 267 - ExplicitTop = 275 - inherited btnConfiguration: TButton - Caption = 'P&4' - end end - inline bafP5: TButtonAssignmentFrame - Left = 267 - Top = 322 - Width = 261 + object btnP2: TButton + Left = 11 + Top = 114 + Width = 41 Height = 41 + Caption = 'P&2' TabOrder = 4 - ExplicitLeft = 267 - ExplicitTop = 322 - inherited btnConfiguration: TButton - Caption = 'P&5' - end end - inline bafP6: TButtonAssignmentFrame - Left = 267 - Top = 369 - Width = 261 + object btnP3: TButton + Left = 11 + Top = 161 + Width = 41 Height = 41 + Caption = 'P&3' TabOrder = 5 - ExplicitLeft = 267 - ExplicitTop = 369 - inherited btnConfiguration: TButton - Caption = 'P&6' - end end - inline bafP7: TButtonAssignmentFrame - Left = 267 - Top = 416 - Width = 261 + object btnP4: TButton + Left = 11 + Top = 208 + Width = 41 Height = 41 + Caption = 'P&4' TabOrder = 6 - ExplicitLeft = 267 - ExplicitTop = 416 - inherited btnConfiguration: TButton - Caption = 'P&7' - end end - inline bafP8: TButtonAssignmentFrame - Left = 267 - Top = 463 - Width = 261 + object btnP5: TButton + Left = 11 + Top = 255 + Width = 41 Height = 41 + Caption = 'P&5' TabOrder = 7 - ExplicitLeft = 267 - ExplicitTop = 463 - inherited btnConfiguration: TButton - Caption = 'P&8' - end end - object pnlProfiles: TPanel - AlignWithMargins = True - Left = 8 - Top = 8 - Width = 245 - Height = 497 - Margins.Left = 8 - Margins.Top = 8 - Margins.Right = 8 - Margins.Bottom = 8 - Align = alLeft - BevelOuter = bvNone + object btnP6: TButton + Left = 11 + Top = 302 + Width = 41 + Height = 41 + Caption = 'P&6' TabOrder = 8 - ExplicitHeight = 392 - object vstProfile: TVirtualStringTree - Left = 0 - Top = 22 - Width = 245 - Height = 475 - Align = alClient - Header.AutoSizeIndex = 0 - Header.Font.Charset = DEFAULT_CHARSET - Header.Font.Color = clWindowText - Header.Font.Height = -11 - Header.Font.Name = 'Tahoma' - Header.Font.Style = [] - Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoShowSortGlyphs, hoVisible] - PopupMenu = pmnProfiles - TabOrder = 0 - ExplicitHeight = 370 - Columns = < - item - Position = 0 - Width = 241 - WideText = 'Profile' - end> - end - object tbProfiles: TToolBar - Left = 0 - Top = 0 - Width = 245 - Height = 22 - AutoSize = True - ButtonWidth = 60 - Images = ImageList - List = True - ParentShowHint = False - AllowTextButtons = True - ShowHint = True - TabOrder = 1 - object tbNewProfile: TToolButton - Left = 0 - Top = 0 - Action = actNewProfile - AutoSize = True - end - object tbRenameProfile: TToolButton - Left = 24 - Top = 0 - Action = actRenameProfile - AutoSize = True - end - object tbSaveProfile: TToolButton - Left = 48 - Top = 0 - Action = actSaveProfile - AutoSize = True - Style = tbsTextButton - end - object tbRevertProfile: TToolButton - Left = 103 - Top = 0 - Action = actRevertProfile - AutoSize = True - Style = tbsTextButton - end - object tbDeleteProfile: TToolButton - Left = 167 - Top = 0 - Action = actDeleteProfile - AutoSize = True - end - object ToolButton1: TToolButton - Left = 191 - Top = 0 - Width = 8 - Caption = 'ToolButton1' - ImageIndex = 4 - Style = tbsSeparator - end - object tbSetActiveProfile: TToolButton - Left = 199 - Top = 0 - Action = actSetActiveProfile - end - end end - object pnlG940: TPanel - AlignWithMargins = True - Left = 267 - Top = 26 - Width = 205 - Height = 40 - BevelOuter = bvNone + object btnP7: TButton + Left = 11 + Top = 349 + Width = 41 + Height = 41 + Caption = 'P&7' TabOrder = 9 - object imgStateFound: TImage - Left = 4 - Top = 4 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 - 00200806000000737A7AF4000000097048597300000B1300000B1301009A9C18 - 00000A4F6943435050686F746F73686F70204943432070726F66696C65000078 - DA9D53675453E9163DF7DEF4424B8880944B6F5215082052428B801491262A21 - 09104A8821A1D91551C1114545041BC8A088038E8E808C15512C0C8A0AD807E4 - 21A28E83A3888ACAFBE17BA36BD6BCF7E6CDFEB5D73EE7ACF39DB3CF07C0080C - 9648335135800CA9421E11E083C7C4C6E1E42E40810A2470001008B3642173FD - 230100F87E3C3C2B22C007BE000178D30B0800C04D9BC0301C87FF0FEA42995C - 01808401C07491384B08801400407A8E42A600404601809D98265300A0040060 - CB6362E300502D0060277FE6D300809DF8997B01005B94211501A09100201365 - 884400683B00ACCF568A450058300014664BC43900D82D00304957664800B0B7 - 00C0CE100BB200080C00305188852900047B0060C8232378008499001446F257 - 3CF12BAE10E72A00007899B23CB9243945815B082D710757572E1E28CE49172B - 14366102619A402EC27999193281340FE0F3CC0000A0911511E083F3FD78CE0E - AECECE368EB60E5F2DEABF06FF226262E3FEE5CFAB70400000E1747ED1FE2C2F - B31A803B06806DFEA225EE04685E0BA075F78B66B20F40B500A0E9DA57F370F8 - 7E3C3C45A190B9D9D9E5E4E4D84AC4425B61CA577DFE67C25FC057FD6CF97E3C - FCF7F5E0BEE22481325D814704F8E0C2CCF44CA51CCF92098462DCE68F47FCB7 - 0BFFFC1DD322C44962B9582A14E35112718E449A8CF332A52289429229C525D2 - FF64E2DF2CFB033EDF3500B06A3E017B912DA85D6303F64B27105874C0E2F700 - 00F2BB6FC1D4280803806883E1CF77FFEF3FFD47A02500806649927100005E44 - 242E54CAB33FC708000044A0812AB0411BF4C1182CC0061CC105DCC10BFC6036 - 844224C4C24210420A64801C726029AC82422886CDB01D2A602FD4401D34C051 - 688693700E2EC255B80E3D700FFA61089EC128BC81090441C808136121DA8801 - 628A58238E08179985F821C14804128B2420C9881451224B91354831528A5420 - 55481DF23D720239875C46BA913BC8003282FC86BC47319481B2513DD40CB543 - B9A8371A8446A20BD06474319A8F16A09BD072B41A3D8C36A1E7D0AB680FDA8F - 3E43C730C0E8180733C46C302EC6C342B1382C099363CBB122AC0CABC61AB056 - AC03BB89F563CFB17704128145C0093604774220611E4148584C584ED848A820 - 1C243411DA093709038451C2272293A84BB426BA11F9C4186232318758482C23 - D6128F132F107B8843C437241289433227B9900249B1A454D212D246D26E5223 - E92CA99B34481A2393C9DA646BB20739942C202BC885E49DE4C3E433E41BE421 - F25B0A9D624071A4F853E22852CA6A4A19E510E534E5066598324155A39A52DD - A8A15411358F5A42ADA1B652AF5187A81334759A39CD8316494BA5ADA295D31A - 681768F769AFE874BA11DD951E4E97D057D2CBE947E897E803F4770C0D861583 - C7886728199B18071867197718AF984CA619D38B19C754303731EB98E7990F99 - 6F55582AB62A7C1591CA0A954A9526951B2A2F54A9AAA6AADEAA0B55F355CB54 - 8FA95E537DAE46553353E3A909D496AB55AA9D50EB531B5367A93BA887AA67A8 - 6F543FA47E59FD890659C34CC34F43A451A0B15FE3BCC6200B6319B3782C216B - 0DAB86758135C426B1CDD97C762ABB98FD1DBB8B3DAAA9A13943334A3357B352 - F394663F07E39871F89C744E09E728A797F37E8ADE14EF29E2291BA6344CB931 - 655C6BAA96979658AB48AB51AB47EBBD36AEEDA79DA6BD45BB59FB810E41C74A - 275C2747678FCE059DE753D953DDA70AA7164D3D3AF5AE2EAA6BA51BA1BB4477 - BF6EA7EE989EBE5E809E4C6FA7DE79BDE7FA1C7D2FFD54FD6DFAA7F5470C5806 - B30C2406DB0CCE183CC535716F3C1D2FC7DBF151435DC34043A561956197E184 - 91B9D13CA3D5468D460F8C69C65CE324E36DC66DC6A326062621264B4DEA4DEE - 9A524DB9A629A63B4C3B4CC7CDCCCDA2CDD699359B3D31D732E79BE79BD79BDF - B7605A785A2CB6A8B6B86549B2E45AA659EEB6BC6E855A3959A558555A5DB346 - AD9DAD25D6BBADBBA711A7B94E934EAB9ED667C3B0F1B6C9B6A9B719B0E5D806 - DBAEB66DB67D6167621767B7C5AEC3EE93BD937DBA7D8DFD3D070D87D90EAB1D - 5A1D7E73B472143A563ADE9ACE9CEE3F7DC5F496E92F6758CF10CFD833E3B613 - CB29C4699D539BD347671767B97383F3888B894B82CB2E973E2E9B1BC6DDC8BD - E44A74F5715DE17AD2F59D9BB39BC2EDA8DBAFEE36EE69EE87DC9FCC349F299E - 593373D0C3C843E051E5D13F0B9F95306BDFAC7E4F434F8167B5E7232F632F91 - 57ADD7B0B7A577AAF761EF173EF63E729FE33EE33C37DE32DE595FCC37C0B7C8 - B7CB4FC36F9E5F85DF437F23FF64FF7AFFD100A78025016703898141815B02FB - F87A7C21BF8E3F3ADB65F6B2D9ED418CA0B94115418F82AD82E5C1AD2168C8EC - 90AD21F7E798CE91CE690E85507EE8D6D00761E6618BC37E0C2785878557863F - 8E7088581AD131973577D1DC4373DF44FA449644DE9B67314F39AF2D4A352A3E - AA2E6A3CDA37BA34BA3FC62E6659CCD5589D58496C4B1C392E2AAE366E6CBEDF - FCEDF387E29DE20BE37B17982FC85D7079A1CEC2F485A716A92E122C3A96404C - 884E3894F041102AA8168C25F21377258E0A79C21DC267222FD136D188D8435C - 2A1E4EF2482A4D7A92EC91BC357924C533A52CE5B98427A990BC4C0D4CDD9B3A - 9E169A76206D323D3ABD31839291907142AA214D93B667EA67E66676CBAC6585 - B2FEC56E8BB72F1E9507C96BB390AC05592D0AB642A6E8545A28D72A07B26765 - 5766BFCD89CA3996AB9E2BCDEDCCB3CADB90379CEF9FFFED12C212E192B6A586 - 4B572D1D58E6BDAC6A39B23C7179DB0AE315052B865606AC3CB88AB62A6DD54F - ABED5797AE7EBD267A4D6B815EC1CA82C1B5016BEB0B550AE5857DEBDCD7ED5D - 4F582F59DFB561FA869D1B3E15898AAE14DB1797157FD828DC78E51B876FCABF - 99DC94B4A9ABC4B964CF66D266E9E6DE2D9E5B0E96AA97E6970E6E0DD9DAB40D - DF56B4EDF5F645DB2F97CD28DBBB83B643B9A3BF3CB8BC65A7C9CECD3B3F54A4 - 54F454FA5436EED2DDB561D7F86ED1EE1B7BBCF634ECD5DB5BBCF7FD3EC9BEDB - 5501554DD566D565FB49FBB3F73FAE89AAE9F896FB6D5DAD4E6D71EDC703D203 - FD07230EB6D7B9D4D51DD23D54528FD62BEB470EC71FBEFE9DEF772D0D360D55 - 8D9CC6E223704479E4E9F709DFF71E0D3ADA768C7BACE107D31F761D671D2F6A - 429AF29A469B539AFB5B625BBA4FCC3ED1D6EADE7AFC47DB1F0F9C343C59794A - F354C969DAE982D39367F2CF8C9D959D7D7E2EF9DC60DBA2B67BE763CEDF6A0F - 6FEFBA1074E1D245FF8BE73BBC3BCE5CF2B874F2B2DBE51357B8579AAF3A5F6D - EA74EA3CFE93D34FC7BB9CBB9AAEB95C6BB9EE7ABDB57B66F7E91B9E37CEDDF4 - BD79F116FFD6D59E393DDDBDF37A6FF7C5F7F5DF16DD7E7227FDCECBBBD97727 - EEADBC4FBC5FF440ED41D943DD87D53F5BFEDCD8EFDC7F6AC077A0F3D1DC47F7 - 068583CFFE91F58F0F43058F998FCB860D86EB9E383E3939E23F72FDE9FCA743 - CF64CF269E17FEA2FECBAE17162F7EF8D5EBD7CED198D1A197F29793BF6D7CA5 - FDEAC0EB19AFDBC6C2C61EBEC97833315EF456FBEDC177DC771DEFA3DF0F4FE4 - 7C207F28FF68F9B1F553D0A7FB93199393FF040398F3FC63332DDB000009C549 - 44415478DA9D570B5094D7153EFB7EF0581658965704410444855D23D030680D - AD428805634631C6689B264ECD74DA344D26D3C9A4292A1AED34613A7D68673A - 93345640DB8ACA43790A62001D231A890875C37B9FB00FD85DF6D9732E6068C5 - 84E69FF9877F97FFDEF3DD73BEEF3B67397EBF5F06002EF816977FF6C207FCC0 - 01E072B91C9FCF37FBDDDCC5E170E8A66BB12D841C7C598C0FCE2507F5F961C6 - 3D03629118EC763B381C0E70D81DE072B920441E42A0606A6A8AFDE5F3F92010 - 08402E978350285C6C3B310190E0836329C1BD5E2FDBD86C3607F5F6F6FEC462 - B6C4210091D566155A262DD3098909D78D46E37AAD56CB9B99992150BE808000 - 6FEE86DCBE8D1B37FE01B3E3C52C018FC79BDF52B2240014D4E3F13C4CDBFB47 - DF3FD570B9E179A140083EBF0FA6A7A76164640456AE5C097A9D1E2626275876 - 444211A8D7A961F5EAD570E0A7AF6585CAE5DDB4974C2683B9927C33005A305F - 5342DFD6D6B6FDF59FBD7E363030909D846ECD971AC60379881CEC0E3B389D4E - 569A0D1B363070898989B07BCFEE8308E45DB7DB0D4141414B0380A966279FE7 - 8F542A858AD395C72B4F57FE325C11CEEA4BE0EA2FD7436A4A2A848785B3FAD3 - E969DD9A356BE0CEE7774095A1F2BDF3EE3B7961A1A1AD7494057C581C00D60A - 060606C03C39C94EFDF06D0470BEFAFCC74D8D4D7B140A050344EFD6D6D55210 - 080D0D6527260074D2F4F47470CE38619D7A9D6573FEE60C2CD997A496A8A8A8 - AFCF002D6E6C68983BFD57F2914824505B5BF7AFABED578BC3C3C31900AFCF0B - 1DD73A20636D06FB3CAF0C7AA6F531B131F0E65B6FDE5F959696C1998BB360CF - C50190A42A4E57B05A2ECC80582C063C7D437777F7F7C2C2C2182002DBFB452F - A4A4A4009FC767C14901243D2AC7C4C4041C3B7EEC4F45C545AFC1AC632CBC16 - 07401B9C3C7102377B0400A7B1A1B1FDC68D1B39048000D12989842B56AC60DB - D35ABA294309090960301A61FFFE575F2E78A6E0AFC3C3C30C2071E36B0178F0 - 5475F5F5E0240094AEB99449F1C435B5351FFDE3EC3F5FC4DA734522113324AD - 410BB1D1B12CB51EB7075C6E17E343F2CA6410880490979757A052A9EAABABAB - 19A81776BFF0CD3E407AD66834CCCD18A8391F085728A4D7AE5E5523BBD7F4DF - EFDFD9D2DABAD1ED71832C58F690C06E2CA15C1E0ACB972FA74C18DFFED5DB45 - 28D7818ABF574CA8D42A4FF1B6E279337A3C00EDB81686068700DD0D7A6EF580 - 3252C96A2A100A20521909C343C311353535151F967FB889C7E7416C4C2C8C8C - 8E62C03058BB7A2D984C266BF677B21B91271359D959EDE81B3DB77B6E8F2237 - 2C3B4B76BA29068278BC0AEA6AEB41815A4F4A4E82D6E656C8CECE86F1F17198 - 9A9E02A53272737767E789F3E7CFC7373537B3D344474503DA30E4E4E4C08E9D - 3B08A00BDFB7194D46C7B265CBDA51B6F7925352EA313BD7456211646565F983 - 838317073089FA3FF5C9697C29139627C443DB9536C8CCCC648CBEDFDFFFF33B - 3D3D472E5CB820B6DA6C603018180065849249502215435C5C3CE3008FCB636B - F47A3D58AD36282ADE3651B26B47AEE6C183DEA7729E82E8E8E84701500DC7C6 - C6A0E6621DA8D52A06A0E36A07F9B9E4E6CD9BBFC5BA1FB872A515B45A3DD639 - 84F9BE6BC60564CD1488144046430A898989C1F7B4C82321AC7BF249DC771CB6 - 3F5FFCD6F6E7B61D2762A3C21E05A0D3E9989B353634013217525293A1A9A929 - AEE7B39E13B76FDFDE4206333434C42C988212E3490944565AC7E57001BB2393 - 266545817766661666C00AED6DEDF04C61FEA9575EF9F18BC4AD4748481A45A2 - 40547414D4D75D6275777A3D595567CE7E14201024BB313BF7BEB8079A7FF723 - D3DD730D8A03429463705030604D190FFA07FA41887D4219198D010BC186C1BB - BBAF83C56281F8F8B85B9F9CFA58856D9A7AC97F03C01483C968825569AB3003 - CDB8B1748FAEB9A63CD2E7941B57A9818BF380116B3A643083CBE98269EC7CE6 - 491398903333F8ECC2F493F78B44124C7F2C6CC9DF02668B15BA3A3B1F3A247A - 87FD771F1CDF849ED19D9B9BFBD540423AAF3E57CD1C2C353515FE7CF28FBFFE - FCC167EFE561870B98E2825EA104B5A91F46BC4268E109C0E21A04B9301A7C76 - 1198274C3089249B0DE284106CCB79DFCFC393DBE0DAB54EF61D05273BE360C6 - F47AAD75DFDEBD1F1C2A3B7CF021007AA1E6620D2E0E096969BC523E6CBCF392 - 275407324E1280800F2EEF08240B5240333E090EB1199CBC29F05815F0DD2917 - 4458F4501310099A491B08D1BA373DBD114821D73A3EC57E3283B276314BF7E3 - F0A2D58D3362BEF1C62F4E1E3B76EC000380A396834CA6B9A939AEB6A6EE6F23 - 23A3B951514A6432F56D1EF0653670FB1DE0B7CBC01EA4C1FAFB20DABA02126D - 3AE0E13B7D76005B5018F3FDF5EBD781C3E940C275B066469E32DBFFFD30AE1D - 431E98A1A4A4E46CE9C1D21F29C2154E9A62258383830E742C41E97BA52DCDCD - CD39D4EB674925C3B62A41B2883009B809D78B785C30E57081C2CF851CAF1EFA - 3181B778A13085C155EA74B46C37FA463B7A8283D937C9917A84C1A0071BAA03 - BBE299D2D2DFEC93C982ED229158C2C1BAF1D15223AE775DFFFDC58B179F1B78 - 30C0BC801A4D803480313B147D9D8C854629A9241019CE071FC70F765402FE01 - 271AD0EA356934BF416B6B1B3B39A9C0472A4159EA745AB0A3833EBBB5F0CCC1 - C387F622204708CE85CC8AD1F514BB76EE6AE9EBEB4B9BB64F831E9152BDA412 - 2926CDCF864E1AC5E93BD23B699F864AEAF7418134DB71616D463A8825626869 - 6A65FD22292991AD19191D63B29C98304251D10FAA0E971DDE477C1361568270 - 1FE60338F729F7BFBABF4AA7D5255BAC16331A8B0F3921460B8DC5FF09580D45 - 421020F389C6349A538628AD64C14FC43EC18CC66030B11932252589B88E9D74 - 900537998C74F2AA2347CAF6E1791C344191D2E6E60C2C81DD211A1C1AF44644 - 44C8912CD3B8A91F83F2CF9D3B977CF7EE5D3576B59CEEAE6E954EAF4BC26C89 - 695AA2F290F3111802B12A358DD9AD103BE5F2F87874CA6130A15F188C06282C - 2CA83A7A148303C741F3852C440664420FE7012221DE0EB2548958C2BE259BAD - ACAC64A9A61B1B8E082D38A9ABAB8B0065B7B7B7AB474747D330DD812CE5892B - 90230ADC5C0E5E2421353322DD96822D678E1E3D82C1FD76370E2A544202B0E8 - 4C480E26E00B586AE864980136F3CD8F5D3482D3C2B8B838282F2FE7171414C4 - 5FBA74291D3DFE6994EF4B9111518162EC131ACD005B9F9F9F5F5576A4EC87B8 - 9F9DCC27501AC84AB9A499707E26989F6029232855068ED2D7D383038A520997 - 2F5F86AD5BB7C2D8E8584ED9E1B2BFE0049532E39AF1173E5B5879E8D0A19711 - BC833C804AF6984BF27FFF385DD8B6890F6C644380F7FAFA649D9F76AAB83CAE - A7A46457874824F42FF80DF8B88BF5826FFDF3FC7F2EAC94C73DA70E3A327709 - 6B84FF0180E96622F4B22C130000000049454E44AE426082} - Visible = False - end - object imgStateNotFound: TImage - Left = 4 - Top = 4 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 - 00200806000000737A7AF4000000097048597300000B1300000B1301009A9C18 - 00000A4F6943435050686F746F73686F70204943432070726F66696C65000078 - DA9D53675453E9163DF7DEF4424B8880944B6F5215082052428B801491262A21 - 09104A8821A1D91551C1114545041BC8A088038E8E808C15512C0C8A0AD807E4 - 21A28E83A3888ACAFBE17BA36BD6BCF7E6CDFEB5D73EE7ACF39DB3CF07C0080C - 9648335135800CA9421E11E083C7C4C6E1E42E40810A2470001008B3642173FD - 230100F87E3C3C2B22C007BE000178D30B0800C04D9BC0301C87FF0FEA42995C - 01808401C07491384B08801400407A8E42A600404601809D98265300A0040060 - CB6362E300502D0060277FE6D300809DF8997B01005B94211501A09100201365 - 884400683B00ACCF568A450058300014664BC43900D82D00304957664800B0B7 - 00C0CE100BB200080C00305188852900047B0060C8232378008499001446F257 - 3CF12BAE10E72A00007899B23CB9243945815B082D710757572E1E28CE49172B - 14366102619A402EC27999193281340FE0F3CC0000A0911511E083F3FD78CE0E - AECECE368EB60E5F2DEABF06FF226262E3FEE5CFAB70400000E1747ED1FE2C2F - B31A803B06806DFEA225EE04685E0BA075F78B66B20F40B500A0E9DA57F370F8 - 7E3C3C45A190B9D9D9E5E4E4D84AC4425B61CA577DFE67C25FC057FD6CF97E3C - FCF7F5E0BEE22481325D814704F8E0C2CCF44CA51CCF92098462DCE68F47FCB7 - 0BFFFC1DD322C44962B9582A14E35112718E449A8CF332A52289429229C525D2 - FF64E2DF2CFB033EDF3500B06A3E017B912DA85D6303F64B27105874C0E2F700 - 00F2BB6FC1D4280803806883E1CF77FFEF3FFD47A02500806649927100005E44 - 242E54CAB33FC708000044A0812AB0411BF4C1182CC0061CC105DCC10BFC6036 - 844224C4C24210420A64801C726029AC82422886CDB01D2A602FD4401D34C051 - 688693700E2EC255B80E3D700FFA61089EC128BC81090441C808136121DA8801 - 628A58238E08179985F821C14804128B2420C9881451224B91354831528A5420 - 55481DF23D720239875C46BA913BC8003282FC86BC47319481B2513DD40CB543 - B9A8371A8446A20BD06474319A8F16A09BD072B41A3D8C36A1E7D0AB680FDA8F - 3E43C730C0E8180733C46C302EC6C342B1382C099363CBB122AC0CABC61AB056 - AC03BB89F563CFB17704128145C0093604774220611E4148584C584ED848A820 - 1C243411DA093709038451C2272293A84BB426BA11F9C4186232318758482C23 - D6128F132F107B8843C437241289433227B9900249B1A454D212D246D26E5223 - E92CA99B34481A2393C9DA646BB20739942C202BC885E49DE4C3E433E41BE421 - F25B0A9D624071A4F853E22852CA6A4A19E510E534E5066598324155A39A52DD - A8A15411358F5A42ADA1B652AF5187A81334759A39CD8316494BA5ADA295D31A - 681768F769AFE874BA11DD951E4E97D057D2CBE947E897E803F4770C0D861583 - C7886728199B18071867197718AF984CA619D38B19C754303731EB98E7990F99 - 6F55582AB62A7C1591CA0A954A9526951B2A2F54A9AAA6AADEAA0B55F355CB54 - 8FA95E537DAE46553353E3A909D496AB55AA9D50EB531B5367A93BA887AA67A8 - 6F543FA47E59FD890659C34CC34F43A451A0B15FE3BCC6200B6319B3782C216B - 0DAB86758135C426B1CDD97C762ABB98FD1DBB8B3DAAA9A13943334A3357B352 - F394663F07E39871F89C744E09E728A797F37E8ADE14EF29E2291BA6344CB931 - 655C6BAA96979658AB48AB51AB47EBBD36AEEDA79DA6BD45BB59FB810E41C74A - 275C2747678FCE059DE753D953DDA70AA7164D3D3AF5AE2EAA6BA51BA1BB4477 - BF6EA7EE989EBE5E809E4C6FA7DE79BDE7FA1C7D2FFD54FD6DFAA7F5470C5806 - B30C2406DB0CCE183CC535716F3C1D2FC7DBF151435DC34043A561956197E184 - 91B9D13CA3D5468D460F8C69C65CE324E36DC66DC6A326062621264B4DEA4DEE - 9A524DB9A629A63B4C3B4CC7CDCCCDA2CDD699359B3D31D732E79BE79BD79BDF - B7605A785A2CB6A8B6B86549B2E45AA659EEB6BC6E855A3959A558555A5DB346 - AD9DAD25D6BBADBBA711A7B94E934EAB9ED667C3B0F1B6C9B6A9B719B0E5D806 - DBAEB66DB67D6167621767B7C5AEC3EE93BD937DBA7D8DFD3D070D87D90EAB1D - 5A1D7E73B472143A563ADE9ACE9CEE3F7DC5F496E92F6758CF10CFD833E3B613 - CB29C4699D539BD347671767B97383F3888B894B82CB2E973E2E9B1BC6DDC8BD - E44A74F5715DE17AD2F59D9BB39BC2EDA8DBAFEE36EE69EE87DC9FCC349F299E - 593373D0C3C843E051E5D13F0B9F95306BDFAC7E4F434F8167B5E7232F632F91 - 57ADD7B0B7A577AAF761EF173EF63E729FE33EE33C37DE32DE595FCC37C0B7C8 - B7CB4FC36F9E5F85DF437F23FF64FF7AFFD100A78025016703898141815B02FB - F87A7C21BF8E3F3ADB65F6B2D9ED418CA0B94115418F82AD82E5C1AD2168C8EC - 90AD21F7E798CE91CE690E85507EE8D6D00761E6618BC37E0C2785878557863F - 8E7088581AD131973577D1DC4373DF44FA449644DE9B67314F39AF2D4A352A3E - AA2E6A3CDA37BA34BA3FC62E6659CCD5589D58496C4B1C392E2AAE366E6CBEDF - FCEDF387E29DE20BE37B17982FC85D7079A1CEC2F485A716A92E122C3A96404C - 884E3894F041102AA8168C25F21377258E0A79C21DC267222FD136D188D8435C - 2A1E4EF2482A4D7A92EC91BC357924C533A52CE5B98427A990BC4C0D4CDD9B3A - 9E169A76206D323D3ABD31839291907142AA214D93B667EA67E66676CBAC6585 - B2FEC56E8BB72F1E9507C96BB390AC05592D0AB642A6E8545A28D72A07B26765 - 5766BFCD89CA3996AB9E2BCDEDCCB3CADB90379CEF9FFFED12C212E192B6A586 - 4B572D1D58E6BDAC6A39B23C7179DB0AE315052B865606AC3CB88AB62A6DD54F - ABED5797AE7EBD267A4D6B815EC1CA82C1B5016BEB0B550AE5857DEBDCD7ED5D - 4F582F59DFB561FA869D1B3E15898AAE14DB1797157FD828DC78E51B876FCABF - 99DC94B4A9ABC4B964CF66D266E9E6DE2D9E5B0E96AA97E6970E6E0DD9DAB40D - DF56B4EDF5F645DB2F97CD28DBBB83B643B9A3BF3CB8BC65A7C9CECD3B3F54A4 - 54F454FA5436EED2DDB561D7F86ED1EE1B7BBCF634ECD5DB5BBCF7FD3EC9BEDB - 5501554DD566D565FB49FBB3F73FAE89AAE9F896FB6D5DAD4E6D71EDC703D203 - FD07230EB6D7B9D4D51DD23D54528FD62BEB470EC71FBEFE9DEF772D0D360D55 - 8D9CC6E223704479E4E9F709DFF71E0D3ADA768C7BACE107D31F761D671D2F6A - 429AF29A469B539AFB5B625BBA4FCC3ED1D6EADE7AFC47DB1F0F9C343C59794A - F354C969DAE982D39367F2CF8C9D959D7D7E2EF9DC60DBA2B67BE763CEDF6A0F - 6FEFBA1074E1D245FF8BE73BBC3BCE5CF2B874F2B2DBE51357B8579AAF3A5F6D - EA74EA3CFE93D34FC7BB9CBB9AAEB95C6BB9EE7ABDB57B66F7E91B9E37CEDDF4 - BD79F116FFD6D59E393DDDBDF37A6FF7C5F7F5DF16DD7E7227FDCECBBBD97727 - EEADBC4FBC5FF440ED41D943DD87D53F5BFEDCD8EFDC7F6AC077A0F3D1DC47F7 - 068583CFFE91F58F0F43058F998FCB860D86EB9E383E3939E23F72FDE9FCA743 - CF64CF269E17FEA2FECBAE17162F7EF8D5EBD7CED198D1A197F29793BF6D7CA5 - FDEAC0EB19AFDBC6C2C61EBEC97833315EF456FBEDC177DC771DEFA3DF0F4FE4 - 7C207F28FF68F9B1F553D0A7FB93199393FF040398F3FC63332DDB000007EF49 - 44415478DAA557494C5459147D9FFA50C52020833289322B4A83A248DA38A431 - 22A24C894A42ECD00BDDB831313171E1C279484C74D5B8E9EE841834B62DA0E0 - 80A222600403E21845914150041151849AFB9C177E350A38F54F7EA07EFDF7EE - B9E79E73EF2BC56EB71B841016F10317D63A6E455184939393B0D96CF2B376F1 - B9768F73A90A5E56BF070003984C26613018C4C78F1FC5D0D090FCCB6793274F - 96C13F7CF820FFAAAA2A9C9D9DE573171797FF0FC06AB5CA8DFBFBFBF50F1F3E - 5CF0EEDD3B2F00500706067478660A0F0FEFECEDED0DEEEEEE5686878709CAEE - EEEE6E5FB26449EFD2A54BEB00DE4E96743ADDF70160508BC5F18AEEE0C18339 - 972E5D5A80EC6CF8CE3E3838285EBC78618F8E8EB622B8FAF6ED5BC90AB34E4C - 4C749A33678E69F3E6CD053E3E3E9DDCCBCBCB4B2BC9D7016835E645F4555555 - B15BB66CC9F3F0F0B020133BB379FEFCB9FC1E542B086C67F62C0D3217040766 - F41B366CA800904AB3D92C264D9AF46D0040EBE8CC859B9B9B3871E2C40ADCBF - F8FBFB0FB3BE0477F1E2453173E64CE1E7E727EBCFECB92E2E2E4EDCBB774F99 - 3B77AE7DC78E1D7F818156EE334A0FE303A0D09E3E7D2A4825B31E0DA0A4A424 - FBCA952B490060E467BE5B5E5E2E10442080CC980098697C7CBC001B3A946130 - 3535B50080FB99796060E09719E0E28A8A0A99C568FBB8BABA32586E7575F54F - C8D6440014666D6DAD0CC6CF9A33F83FD7070707ABDBB66DEB9E3D7BF6EF5A9C - 517B8E0F80962A2A2A22FA4F18A0F590FDAF75757531BEBEBE660222583842CC - 9A354BAA9BC18D46A3B41ECBD1D7D7E772E8D0A19AACACAC724AEA9B6CC80D8E - 1D3B2637FB0C8072F9F2E5DF6EDFBE1D0900260262961461545494D403D7F2A6 - 1E203E015B3A6FDAB4E9EF55AB5635767474C83DA98D2F026056172E5C180380 - B4969595659F3E7D3A11B577D2EBF53680B0C07AA45A52CBB5BCA907D85281E0 - 949494944268A419FA91A0F2F2F2BEDE07B829336337E3A5B901E273AEA9A909 - 82BAFD9F3C791277EDDAB5307C67A3B7C900454900B4645858980E4C0C6CDFBE - BD08E5E943598700C4969D9DAD35A38901BC7AF54AB4B5B549C477EEDC110101 - 01B2A6B4D0D4A95305E874071B6B8F1C391201905632D0D9D929A907C5CA9B37 - 6F869393935BA09321FC6D43DFE86E6A6A1A0033C3EBD7AFB7C98EA6D34D5C82 - F3E7CFCBCD626262446565A5C026E2E5CB97D26600107EEBD6ADACD2D2523F88 - D2C46C828282586FB168D122B16EDD3A02B4E27D239E59A64F9FDE0EE67AB157 - 3304DE492D2D5CB8D0EEE9E9393E00FAFFF8F1E3022F09D028AE5FBF2E929292 - A868D1DCDC9C7CF7EEDD1567CF9ED5BF7FFFDEFCFAF56B492759A105E90C0494 - 1AC073056B14BC23E705A8EFCBCDCDFDE3D9B3673D040AD06301B0865D5D5D14 - 9B98376F9E0400DF0BB451B5A1A12115007E06201B4A64A5D5088AB605C58260 - E800361A3A84656129D931E7CF9FAF605F7D4E4E4E29EEDA91F13D1600C5479A - 6137D9DDD86241B317749081CC63E104537B7B3B67900CAA8D668A95EBE81A64 - 2B054C56A64C992299E433CC117D5A5A5AFDC68D1BFF898888182B42DA0E4291 - F5A40D597704083975EA540E8204A2EB191F3D7A245A5A5A64A6DA41037614A8 - A7BCA903B024C54AE1A6A7A7CBE0F5F5F502E3DB79C68C191D8585850518D364 - E65300A0586E80B62919C0C6F100948EE0EEB099995943DD92256DE2B104D40C - FF271B7C4E4021212102FD9F410504AB7548F60EE3E1C387FF04F0AEC58B17FF - 07803E2F2E2EA6CF655B2D28285876FFFEFD94D8D85805F44A80DC7864F6CBA0 - DEDEDEB26C04C1405A1BE6F3E5CB97CBCC6FDEBCE9E88EBC502227E8C2949F9F - 5FBD77EFDE2A0700BE70EEDC393610036C97D6DADABA00945BF0D9C6BA327068 - 68A8B422B3A4557951686486CFC90CB5B06CD9324770ED5DEEA1BD0700EE5BB7 - 6EADC28C28930018884D0662F3C6B4CB41438946FD8CC8D8AED559DB449BF5B4 - 19EB4C85B32CFC8EE583DA2513748E169CEF69C1799C83151B77EFDE5D02B62D - 0A6CA7A2E359E05FDDCE9D3BF3917D140F1B9AA8D8FFB981D692695306A08830 - 9024F5CC9625A16B18F0C68D1B0EA0740813A045D137F49999998DBB76ED3A83 - BDCDF84E55B09902CF7B60C4A6A304716812161E1E596F06270866CB9B47290D - 9036F934F750B8BCD8B4983999D1663F4B0386F5AB57AF6EDCB367CF193C3353 - 27B21503B91B28C97FFCF87118501B891474DAC1886D24633BB366B723287A9F - 83874D888078252424C80E78F5EA55392F2223232540CE06960525D267646434 - ECDBB7AF989D9EFB8CAC5515D4C403F37A2D50FA81CE61506887265428DB93F5 - C26727646CE50998070A7C27013133829A366D9A6CD30CC4332467072F88D811 - 1CBDA061FFFEFD67008AECCA193332E6559E6275EC6CE858060432F3A48BA03A - 58D2EFC1830701D82014E50984727D10C000AFEB780EE0042418BE0FAB4ACA79 - B375633F69CD9E9E1E47703A8DA522F5D48FE33C4011E2B6B08990465EA4EFE4 - C993926ADED84887DAFBA2A1040250084416047AFD41B72B6E15949BA1111B75 - 42116AC157AE5CD978E0C0817F189CCF493D018C7B26D484436A78D064532220 - EDD8C5EFB89093EEE8D1A34EE8E9DE388E07C00161B06F02FABE1B32B340C45C - EFC2E0CC1CFB99B98EDA19E7E7D9C40712ADD1703119E1E184E0481FE705070D - 7E1D89356BD6506CA1105826EAEE0F6728A0BD096A2F0178338332F309AEEFFF - 713A7A6CB36CEC0F04081719D0F902A1091B5CD5CE2636EA37E01701FCF0CFF3 - CF31F16C38E20E4656BE618DFA2FD3308F8CBFBD23FB0000000049454E44AE42 - 6082} - end - object lblG940Throttle: TLabel - Left = 42 - Top = 4 - Width = 114 - Height = 19 - Caption = 'G940 Throttle' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblG940ThrottleState: TLabel - Left = 42 - Top = 23 - Width = 59 - Height = 13 - Caption = 'Searching...' - end end - object pnlFSX: TPanel - AlignWithMargins = True - Left = 267 - Top = 75 - Width = 221 - Height = 40 - BevelOuter = bvNone + object btnP8: TButton + Left = 11 + Top = 396 + Width = 41 + Height = 41 + Caption = 'P&8' TabOrder = 10 - object imgFSXStateNotConnected: TImage - Left = 4 - Top = 4 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 - 00200806000000737A7AF40000001974455874536F6674776172650041646F62 - 6520496D616765526561647971C9653C000005774944415478DAC597C74B6C59 - 10C64F9B737A9815DA8839A388115C28032266915988CE6660FE9199EDB8706F - C4D1850CA2A8288A2898338AA298033EF3336B4F7DA5E77A5B6DB5DF660E1CEE - EDDBB74FFD4ED55755A7353A9D4EFC9F4303008D46A33C282E2E76373535B536 - 333313262626FC9DFC5EFDDE47436E0A57CCC7C747F1F0F08079DEDCDCFC5DFD - 9E02505A5AEA78727252ECECECEC636969C9CF2480BC1A33A461F5F5EAEA4A77 - 7676B6E2E2E2D2DAD0D070AD07909D9DFD5B4040808F56AB153E3E3EC2C2C242 - D9BDDA0B3FE301CCDBDB5BB1B5B525565757C5FAFAFA7C4747C73F0A40414181 - 3BEDFAF798981891989868D0A8B121C0FBD8C8DDDD9DB8BFBFE7E7232323988F - E6E6E67F3535355D33406161A1D6DEDEBE22232343F8FAFAEAC55E6DD41800D2 - 91080B0B131452717979294647471962737353747777E39DEAC6C6C6430620E1 - 31406666A6F0F0F07803606C0820E0F0F070E1E4E4A400F5F7F7731876777745 - 5757171E57D7D7D73F0194949430404A4A8AF0F2F262B7595959899B9B1B1690 - 3100F86D545494A0F594671473B1B4B4C46B6D6F6F8BDEDE5EAC575D5757F704 - 4019C000494949C2DFDF5F242424080707074E9DF3F37341CAE5EBE9E929EFC2 - 50ED00747474B4B0B5B5559EEDEDED89E9E969FE0DD6DBD9D9110303031C0205 - A0ACAC4C4B062BE2E3E35984212121BCD8EB5D630710D4F1F131C715D78B8B0B - 7E6663632362636385B5B5B5F23EA5B5127B590B00303C3C8CCFD5B5B5B52F00 - 8E8E8E15701D42400A156E6E6E9C8E521386C4F69CDF1C77D40F39E0B5B1B131 - 0E230C030020D000A0E8D95B808888083688C5A062188627BCBDBD393BE0DAAF - 68E1F0F0504C4D4D291A820D18070800262626DE07080D0D6500189710EA4A48 - 158C61E0194320070707627C7C9C8DBD2AC30C2135F1068052A622282848B8BB - BB2BC6E57C5D8AE10D84EB3D0800A0D8C0B09CD238E6FEFEBE989B9BC3BDBE08 - 01E0E7E7A700A821A406A4417C4E4F4F17E4B53700D003F25C6D5CC61F6205C0 - E2E2E2FB00308E459182883DC408636A0FE01E9902B11A126667672767897AF7 - 00432A2373500DDF0580F26118C5048AC60484DA1B308E8605202CBEBCBC2C82 - 8383F53265707050ACADADB161D40D881113F7D7D7D75F07901E9061409141AE - C338DC89F28A0E87D0A5A5A529109393932C44E901BCFB2900B2002130040081 - C2088C63319453C4530E9471BC8381546B6F6FFF10809EBDF482CF0002030305 - 1A15EE115B7433C4523D90BE3939397C0F4394624AFABD06D8D8D8600FE801A0 - 1463113A98700B45DC2500F21E5E4075EBE9E9E1EB7B83CE152C60ACD9DADA2A - 8E8E8EBE0680662401D090D013E00DB5B0D088A4BA0D0DFC0EF501030DE739DD - 18408A510D40C7B297760C0018453341083C3D3D051DD178413B3B3B313F3FCF - 4DE4A381142E2A2A629D2C2C2C30C47B1E407B46257C73208107A406301182E4 - E4646ECFB3B3B39F0260E4E5E5B1F720508441ED017508004047B243BD23995A - 84302EBB627979B9989999114343439F024446468AD4D454365C5353C3460120 - 21641600808EE84F00F9F9F90CE0EAEAAAE701D9942A2B2BF9348B02F3D9C0EF - ABAAAAB8E1F4F5F5293D00531624D40E00B4B4B43C01E4E6E6B206D0EDD4BB97 - 15302E2E8EC5B7B2B2F22980AC0908973C0B604A4FE08A8645DFFDDDD6D6F69D - 01B2B2B2BE11C01FD4EF35EA562CA7B187520CD98AD5FD40C250463D5028FEA4 - 7A72CB00546235B4E35F290401A09667007523FA993F261240FDEF08058E0EA6 - 13B4C97FE960A263003A649850A7FA4622FC853CA125A38A3575173466C0A01A - E6F9D9239D1397E850D249E23EA386F50440954F432EB1A47B7BD2803DD1E164 - 699CCFBFE0188AFF0F0AC5396DE69CDAF3ADDE7F432A4026746F8ACD1A1B6F23 - 43F340000F246A1D3EFF0712759FFDF03F71A80000000049454E44AE426082} - end - object imgFSXStateConnected: TImage - Left = 4 - Top = 4 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 - 00200806000000737A7AF4000000097048597300000EC400000EC401952B0E1B - 000008124944415478DAC5977B7054D51DC7BFF7B177DF9BCDE649221188840D - 2492A243487C2C3E68476D29D599A2A53E3AAD5275A60FFFE91FDAD67F9CB68E - 33AD558A05E91F75C4222DA2B49476B4DD100832986002C612A76D90B0E4BDBB - D9DDECEE7DF677CEEE86242E26FCD53373F7DEB97BEEF97DCEF7F738E708F83F - 3761FE8B8AF61DCD922405645986284AD4837511F37761EE975691D1F83BFAB1 - ACFCDD84699A300C9D2EF3D2E8F1C7078A0254DDBC73693A36F2A6ECAFDB20D8 - 7D648FFDC500A4FC5D2CC67B8596330C187437F8DD2220331DB5AC44E4AFAE40 - CDB648C7A3B13900BEA6674F3856843634D59761ED32179C6E0982457F8B22D9 - 16721D8BCDBA88A656BE8F65E4402CC1443A65A277701A670646A00F75BD19ED - FDE9D61980D2F52F360B8AB7AFF9861B70FFCD15106DB9893315662BCFC558CC - FCF5DC37C40D9743443A6342CD92021AF087E363E8EDEA3414C5563E7A6C7B2C - 07D0FA7248F45487BFFAC5B568A1D98B9200E67E360087B06685C16200A8BF4C - 1F6F5AEF476DB9827852C7BEF7C691552DF49E4FE1E0A11390856C70F4E863E7 - F890810D3B09A02AFC350268AC7390EA050001DCF382B068EFB3E650047CA9B5 - 04D565F63C90855D6F8F209535F1F1A7691CF8731714510B0E87BF9D0768FB6D - 48745785EFDAD88CE6650E2E9BCF2B2291A6E8B5989A020B8585FD4FCD6517F1 - E5363FCA4B6C33EF7A0692F86777028669E1CC600687FFCE007402F856016037 - 77C11DB7AC41FB6A27B6DE164065A90D9A6E612CA66124AA632CAE2132AE619A - 6434CDE2243E9784CDED2528F55E367E8E667CA82B46C6019DBEEBFB4F16EFBE - F73E6C821A1CE978A400F02A01D4846F696BC44377FA70FB3A1FBC349830CFE9 - CC7046353134AA6272CAC0D0988AF1B8C1DFF93D12EE0DF9E173CB33FD2F4DA8 - 78E31F516435529226A3190C4045E7D15390580C743C9403286DDB13927CB5E1 - D61B1BD07CAD02874D44439D82B5F52EACBAC601492A1E013CB7498CA9940E85 - BE713B2EA7C96854C5BE700C094A3F9DFAE99A059520CE7EAAE2FD63DD145B99 - E058C7837980F6DF85244F6D78DD1756A2E95A1B6CB2489700990C7B9D228138 - D052EF44C0277F469562EDBF97B278AB33CE83CE20E306D5225537B94BCF0EAA - E839D9531CA0B979255613804286D9251388C4B281152232BCAC4AC6F52B1C04 - E4BC22C8274359ECEB8843D7993ACCB8C59F5523A740FF7915677A7A28B5B3C1 - F18E6FCE06B8261C0CD623B89400949C028A4DE0F92C3100F1722AAE5B69C7E6 - 365F51884F2E66F1DABB711E2F2CEA59E06979F9558A958F2F6838D7779AFC97 - 094ECC075876DD0A342E5560B793719A3D73814D2A005CAEDB32A9F2E4E600AA - 03B6CF004CA50CFCEC8D711EF50C4033732AB040CCE60106FB3FA4882680A3F3 - 00BC55CB515B21A3DA2FA1C42DC24E81C514281426BE3CD1F38377F8D0B4DC71 - C5C07C6EEF3826E239FFEBCC38F93F963431126399A32139D4474B442638391F - C053B91C5E5A845831712B123C2E114E52C34EAEB0B18B201EBED38BD6602E06 - D8E01D7D296CBCDE3D27535EF94B0C5D1F65C8B085695A079254D05234FB74C6 - E00AA52E2E02C045000EBACBF96C60F7FBDA5DF8FAAD1E6E9C49FAAB8371F4FC - 5BC54D8D763CF99512AE0E6BFB3B93D81B4E72E935EAC7EAC422006AC39E8A15 - F07A8A03DCBED6C18D30E3A9B481170EC4D07F419F99F5E3777B4909177FFEE8 - 7C16CFFC3EFA3900BDB4541340E74C1A5221721340657D518050B3033FBCD7CF - 17A768C2C0CFF74731386ACCF13DAB1F3F7E20C09FD394FFDB9E1FE52E2A0A30 - F42129909D05C02A21956277E57578FA1B65A8ABB471BFB320B451656DA142C4 - 54189ED4F18B3FC61099348A06E0AFB797A1AA54E681F8BD9DE3383FA253F199 - 0540CA4D4D13C085D3D48701144AF186DD548A6BC2AE8A9578645309EEBFCD47 - 25D8CEA3BFD08627353CFB7A0C1309F38A1570DB4637B6B47BF8F3CBEFC4F0B7 - EE3434329CD17200D304902080E9A16E52400D4E1E7BB800B02B2479ABC38EF2 - 551484325F8ED7D4D9716B93135B6EF2A08C4AF0E15329EC3E92F8DC125C1B90 - F0D213E53C4E8E7C90C24B6FC7732EA04294CA92617241825C908E7C4031A006 - A3C7F3CBB1BFF595904C1B12A5BC91528F0148947E221C548C1EBDDB87074891 - 432793D87D38B1E0BEF485EF04D040EA9DBB90C5F77F33CE6B000348AB24FD34 - 2991D6908D9C2205B460B42BBF21F1AFDF41315019B60556C3E950E0A6FCB753 - 39E6AB62AD823D4F55E160570ABB0EC7B150DBD2EEC6F67BFCDCF7773D13E101 - 99290422D5836C3A03F51201587A307A22BF25F3DFF822015485E5400364C53D - A3002B3EAC24EF7F7A098EF7A7B1F3D0C2003E82FFD34F96E0C0B1247EF9568C - AF822A03C8B2A24467032D0575F8347741ECE41339005FCBF321D9571D964B96 - 43905D906C0E329E5F9629FAB76EF4F2F40B9FC92C08C0DA77EFF161CF91295E - 01355A14748D4168B42BCED08E39096D7C809E93ABE2DD4F0D70006FE38F1A24 - F7927F89AE0A41A03DB9202AFC62FB7341620B4EFE847435DBE2FCC1C4A21311 - 4C95CD985E6BFC6E242EAAA63A5596E87F2EC94774D6DC2742741DB1F91B3699 - 6A32B7CC8A32372C08855391781507A3C2B18C00D8E9888E6630753AA0581015 - 0FD491D3AF0A8AE3B1F4D05E8B0F69F3B448E6F4708354B26687E45C12A2A54F - E40315CE857C672C2ED27A9E814E43B95DB48999EDB4A9EB4672E81D3D71F607 - B26FD54535DE65720049AE132C7DCA473D6A04D1552B88F6001B220731F3931F - 7901CBF3552A9CD30416F89951CBCA4428D022A635999CD35D14A88A5826399E - 0E2D10AFE61CB27855F81656D0C8A5AA694DF092FA3F8CC8125D22B18C700000 - 000049454E44AE426082} - Visible = False - end - object lblFSX: TLabel - Left = 42 - Top = 4 - Width = 146 - Height = 19 - Caption = 'Flight Simulator X' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblFSXState: TLabel - Left = 42 - Top = 23 - Width = 70 - Height = 13 - Caption = 'Not connected' - end + end + object cmbProfiles: TComboBox + Left = 64 + Top = 16 + Width = 208 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + Sorted = True + TabOrder = 0 + OnClick = cmbProfilesClick + end + object btnSaveProfile: TButton + Left = 279 + Top = 15 + Width = 72 + Height = 23 + Anchors = [akTop, akRight] + Caption = 'Sa&ve As...' + TabOrder = 1 + OnClick = btnSaveProfileClick + end + object btnDeleteProfile: TButton + Left = 357 + Top = 15 + Width = 72 + Height = 23 + Anchors = [akTop, akRight] + Caption = '&Delete' + TabOrder = 2 + OnClick = btnDeleteProfileClick end end object tsConfiguration: TTabSheet Caption = ' Configuration ' ImageIndex = 2 object lblProfileSwitching: TLabel - Left = 16 - Top = 16 + Left = 11 + Top = 19 Width = 92 Height = 13 Caption = 'Profile switching' @@ -767,15 +388,15 @@ object MainForm: TMainForm ParentFont = False end object bvlProfileSwitching: TBevel - Left = 229 - Top = 23 - Width = 337 + Left = 224 + Top = 26 + Width = 205 Height = 13 Shape = bsTopLine end object cbProfileMenu: TCheckBox - Left = 16 - Top = 41 + Left = 11 + Top = 44 Width = 409 Height = 17 Caption = ' Add profile selection to FSX "Add-ons" menu' @@ -785,8 +406,8 @@ object MainForm: TMainForm OnClick = cbProfileMenuClick end object cbProfileMenuCascaded: TCheckBox - Left = 36 - Top = 64 + Left = 31 + Top = 67 Width = 389 Height = 17 Caption = ' Cascaded menu (profiles in "G940 Profile" submenu)' @@ -890,7 +511,7 @@ object MainForm: TMainForm OnClick = cbCheckUpdatesClick end object btnCheckUpdates: TButton - Left = 461 + Left = 344 Top = 340 Width = 83 Height = 25 @@ -904,360 +525,533 @@ object MainForm: TMainForm AlignWithMargins = True Left = 3 Top = 3 - Width = 592 + Width = 460 Height = 46 Align = alTop BevelOuter = bvNone TabOrder = 1 - end - object TrayIcon: TTrayIcon - Left = 120 - Top = 400 - end - object ActionList: TActionList - Images = ImageList - Left = 48 - Top = 400 - object actNewProfile: TAction - Caption = '&New' - Hint = 'Create a new profile based on the currently selected profile' - ImageIndex = 0 - ShortCut = 16462 - OnExecute = actNewProfileExecute + object pnlFSX: TPanel + AlignWithMargins = True + Left = 233 + Top = 3 + Width = 224 + Height = 40 + Align = alRight + BevelOuter = bvNone + TabOrder = 0 + object imgFSXStateNotConnected: TImage + Left = 4 + Top = 4 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF40000001974455874536F6674776172650041646F62 + 6520496D616765526561647971C9653C000005774944415478DAC597C74B6C59 + 10C64F9B737A9815DA8839A388115C28032266915988CE6660FE9199EDB8706F + C4D1850CA2A8288A2898338AA298033EF3336B4F7DA5E77A5B6DB5DF660E1CEE + EDDBB74FFD4ED55755A7353A9D4EFC9F4303008D46A33C282E2E76373535B536 + 333313262626FC9DFC5EFDDE47436E0A57CCC7C747F1F0F08079DEDCDCFC5DFD + 9E02505A5AEA78727252ECECECEC636969C9CF2480BC1A33A461F5F5EAEA4A77 + 7676B6E2E2E2D2DAD0D070AD07909D9DFD5B4040808F56AB153E3E3EC2C2C242 + D9BDDA0B3FE301CCDBDB5BB1B5B525565757C5FAFAFA7C4747C73F0A40414181 + 3BEDFAF798981891989868D0A8B121C0FBD8C8DDDD9DB8BFBFE7E7232323988F + E6E6E67F3535355D33406161A1D6DEDEBE22232343F8FAFAEAC55E6DD41800D2 + 91080B0B131452717979294647471962737353747777E39DEAC6C6C6430620E1 + 31406666A6F0F0F07803606C0820E0F0F070E1E4E4A400F5F7F7731876777745 + 5757171E57D7D7D73F0194949430404A4A8AF0F2F262B7595959899B9B1B1690 + 3100F86D545494A0F594671473B1B4B4C46B6D6F6F8BDEDE5EAC575D5757F704 + 4019C000494949C2DFDF5F242424080707074E9DF3F37341CAE5EBE9E929EFC2 + 50ED00747474B4B0B5B5559EEDEDED89E9E969FE0DD6DBD9D9110303031C0205 + A0ACAC4C4B062BE2E3E35984212121BCD8EB5D630710D4F1F131C715D78B8B0B + 7E6663632362636385B5B5B5F23EA5B5127B590B00303C3C8CCFD5B5B5B52F00 + 8E8E8E15701D42400A156E6E6E9C8E521386C4F69CDF1C77D40F39E0B5B1B131 + 0E230C030020D000A0E8D95B808888083688C5A062188627BCBDBD393BE0DAAF + 68E1F0F0504C4D4D291A820D18070800262626DE07080D0D6500189710EA4A48 + 158C61E0194320070707627C7C9C8DBD2AC30C2135F1068052A622282848B8BB + BB2BC6E57C5D8AE10D84EB3D0800A0D8C0B09CD238E6FEFEBE989B9BC3BDBE08 + 01E0E7E7A700A821A406A4417C4E4F4F17E4B53700D003F25C6D5CC61F6205C0 + E2E2E2FB00308E459182883DC408636A0FE01E9902B11A126667672767897AF7 + 00432A2373500DDF0580F26118C5048AC60484DA1B308E8605202CBEBCBC2C82 + 8383F53265707050ACADADB161D40D881113F7D7D7D75F07901E9061409141AE + C338DC89F28A0E87D0A5A5A529109393932C44E901BCFB2900B2002130040081 + C2088C63319453C4530E9471BC8381546B6F6FFF10809EBDF482CF0002030305 + 1A15EE115B7433C4523D90BE3939397C0F4394624AFABD06D8D8D8600FE801A0 + 1463113A98700B45DC2500F21E5E4075EBE9E9E1EB7B83CE152C60ACD9DADA2A + 8E8E8EBE0680662401D090D013E00DB5B0D088A4BA0D0DFC0EF501030DE739DD + 18408A510D40C7B297760C0018453341083C3D3D051DD178413B3B3B313F3FCF + 4DE4A381142E2A2A629D2C2C2C30C47B1E407B46257C73208107A406301182E4 + E4646ECFB3B3B39F0260E4E5E5B1F720508441ED017508004047B243BD23995A + 84302EBB627979B9989999114343439F024446468AD4D454365C5353C3460120 + 21641600808EE84F00F9F9F90CE0EAEAAAE701D9942A2B2BF9348B02F3D9C0EF + ABAAAAB8E1F4F5F5293D00531624D40E00B4B4B43C01E4E6E6B206D0EDD4BB97 + 15302E2E8EC5B7B2B2F22980AC0908973C0B604A4FE08A8645DFFDDDD6D6F69D + 01B2B2B2BE11C01FD4EF35EA562CA7B187520CD98AD5FD40C250463D5028FEA4 + 7A72CB00546235B4E35F290401A09667007523FA993F261240FDEF08058E0EA6 + 13B4C97FE960A263003A649850A7FA4622FC853CA125A38A3575173466C0A01A + E6F9D9239D1397E850D249E23EA386F50440954F432EB1A47B7BD2803DD1E164 + 699CCFBFE0188AFF0F0AC5396DE69CDAF3ADDE7F432A4026746F8ACD1A1B6F23 + 43F340000F246A1D3EFF0712759FFDF03F71A80000000049454E44AE426082} + end + object imgFSXStateConnected: TImage + Left = 4 + Top = 4 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF4000000097048597300000EC400000EC401952B0E1B + 000008124944415478DAC5977B7054D51DC7BFF7B177DF9BCDE649221188840D + 2492A243487C2C3E68476D29D599A2A53E3AAD5275A60FFFE91FDAD67F9CB68E + 33AD558A05E91F75C4222DA2B49476B4DD100832986002C612A76D90B0E4BDBB + D9DDECEE7DF677CEEE86242E26FCD53373F7DEB97BEEF97DCEF7F738E708F83F + 3761FE8B8AF61DCD922405645986284AD4837511F37761EE975691D1F83BFAB1 + ACFCDD84699A300C9D2EF3D2E8F1C7078A0254DDBC73693A36F2A6ECAFDB20D8 + 7D648FFDC500A4FC5D2CC67B8596330C187437F8DD2220331DB5AC44E4AFAE40 + CDB648C7A3B13900BEA6674F3856843634D59761ED32179C6E0982457F8B22D9 + 16721D8BCDBA88A656BE8F65E4402CC1443A65A277701A670646A00F75BD19ED + FDE9D61980D2F52F360B8AB7AFF9861B70FFCD15106DB9893315662BCFC558CC + FCF5DC37C40D9743443A6342CD92021AF087E363E8EDEA3414C5563E7A6C7B2C + 07D0FA7248F45487BFFAC5B568A1D98B9200E67E360087B06685C16200A8BF4C + 1F6F5AEF476DB9827852C7BEF7C691552DF49E4FE1E0A11390856C70F4E863E7 + F890810D3B09A02AFC350268AC7390EA050001DCF382B068EFB3E650047CA9B5 + 04D565F63C90855D6F8F209535F1F1A7691CF8731714510B0E87BF9D0768FB6D + 48745785EFDAD88CE6650E2E9BCF2B2291A6E8B5989A020B8585FD4FCD6517F1 + E5363FCA4B6C33EF7A0692F86777028669E1CC600687FFCE007402F856016037 + 77C11DB7AC41FB6A27B6DE164065A90D9A6E612CA66124AA632CAE2132AE619A + 6434CDE2243E9784CDED2528F55E367E8E667CA82B46C6019DBEEBFB4F16EFBE + F73E6C821A1CE978A400F02A01D4846F696BC44377FA70FB3A1FBC349830CFE9 + CC7046353134AA6272CAC0D0988AF1B8C1DFF93D12EE0DF9E173CB33FD2F4DA8 + 78E31F516435529226A3190C4045E7D15390580C743C9403286DDB13927CB5E1 + D61B1BD07CAD02874D44439D82B5F52EACBAC601492A1E013CB7498CA9940E85 + BE713B2EA7C96854C5BE700C094A3F9DFAE99A059520CE7EAAE2FD63DD145B99 + E058C7837980F6DF85244F6D78DD1756A2E95A1B6CB2489700990C7B9D228138 + D052EF44C0277F469562EDBF97B278AB33CE83CE20E306D5225537B94BCF0EAA + E839D9531CA0B979255613804286D9251388C4B281152232BCAC4AC6F52B1C04 + E4BC22C8274359ECEB8843D7993ACCB8C59F5523A740FF7915677A7A28B5B3C1 + F18E6FCE06B8261C0CD623B89400949C028A4DE0F92C3100F1722AAE5B69C7E6 + 365F51884F2E66F1DABB711E2F2CEA59E06979F9558A958F2F6838D7779AFC97 + 094ECC075876DD0A342E5560B793719A3D73814D2A005CAEDB32A9F2E4E600AA + 03B6CF004CA50CFCEC8D711EF50C4033732AB040CCE60106FB3FA4882680A3F3 + 00BC55CB515B21A3DA2FA1C42DC24E81C514281426BE3CD1F38377F8D0B4DC71 + C5C07C6EEF3826E239FFEBCC38F93F963431126399A32139D4474B442638391F + C053B91C5E5A845831712B123C2E114E52C34EAEB0B18B201EBED38BD6602E06 + D8E01D7D296CBCDE3D27535EF94B0C5D1F65C8B085695A079254D05234FB74C6 + E00AA52E2E02C045000EBACBF96C60F7FBDA5DF8FAAD1E6E9C49FAAB8371F4FC + 5BC54D8D763CF99512AE0E6BFB3B93D81B4E72E935EAC7EAC422006AC39E8A15 + F07A8A03DCBED6C18D30E3A9B481170EC4D07F419F99F5E3777B4909177FFEE8 + 7C16CFFC3EFA3900BDB4541340E74C1A5221721340657D518050B3033FBCD7CF + 17A768C2C0CFF74731386ACCF13DAB1F3F7E20C09FD394FFDB9E1FE52E2A0A30 + F42129909D05C02A21956277E57578FA1B65A8ABB471BFB320B451656DA142C4 + 54189ED4F18B3FC61099348A06E0AFB797A1AA54E681F8BD9DE3383FA253F199 + 0540CA4D4D13C085D3D48701144AF186DD548A6BC2AE8A9578645309EEBFCD47 + 25D8CEA3BFD08627353CFB7A0C1309F38A1570DB4637B6B47BF8F3CBEFC4F0B7 + EE3434329CD17200D304902080E9A16E52400D4E1E7BB800B02B2479ABC38EF2 + 551484325F8ED7D4D9716B93135B6EF2A08C4AF0E15329EC3E92F8DC125C1B90 + F0D213E53C4E8E7C90C24B6FC7732EA04294CA92617241825C908E7C4031A006 + A3C7F3CBB1BFF595904C1B12A5BC91528F0148947E221C548C1EBDDB87074891 + 432793D87D38B1E0BEF485EF04D040EA9DBB90C5F77F33CE6B000348AB24FD34 + 2991D6908D9C2205B460B42BBF21F1AFDF41315019B60556C3E950E0A6FCB753 + 39E6AB62AD823D4F55E160570ABB0EC7B150DBD2EEC6F67BFCDCF7773D13E101 + 99290422D5836C3A03F51201587A307A22BF25F3DFF822015485E5400364C53D + A3002B3EAC24EF7F7A098EF7A7B1F3D0C2003E82FFD34F96E0C0B1247EF9568C + AF822A03C8B2A24467032D0575F8347741ECE41339005FCBF321D9571D964B96 + 43905D906C0E329E5F9629FAB76EF4F2F40B9FC92C08C0DA77EFF161CF91295E + 01355A14748D4168B42BCED08E39096D7C809E93ABE2DD4F0D70006FE38F1A24 + F7927F89AE0A41A03DB9202AFC62FB7341620B4EFE847435DBE2FCC1C4A21311 + 4C95CD985E6BFC6E242EAAA63A5596E87F2EC94774D6DC2742741DB1F91B3699 + 6A32B7CC8A32372C08855391781507A3C2B18C00D8E9888E6630753AA0581015 + 0FD491D3AF0A8AE3B1F4D05E8B0F69F3B448E6F4708354B26687E45C12A2A54F + E40315CE857C672C2ED27A9E814E43B95DB48999EDB4A9EB4672E81D3D71F607 + B26FD54535DE65720049AE132C7DCA473D6A04D1552B88F6001B220731F3931F + 7901CBF3552A9CD30416F89951CBCA4428D022A635999CD35D14A88A5826399E + 0E2D10AFE61CB27855F81656D0C8A5AA694DF092FA3F8CC8125D22B18C700000 + 000049454E44AE426082} + Visible = False + end + object lblFSX: TLabel + Left = 42 + Top = 4 + Width = 146 + Height = 19 + Caption = 'Flight Simulator X' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblFSXState: TLabel + Left = 42 + Top = 23 + Width = 70 + Height = 13 + Caption = 'Not connected' + end end - object actSaveProfile: TAction - Caption = '&Save' - Hint = 'Save the changes to the profile' - ImageIndex = 2 - ShortCut = 16467 - OnExecute = actSaveProfileExecute - end - object actRevertProfile: TAction - Caption = '&Revert' - Hint = 'Revert the changes to the profile since it was last saved' - ImageIndex = 3 - ShortCut = 16466 - OnExecute = actRevertProfileExecute - end - object actRenameProfile: TAction - Caption = '&Rename' - Hint = 'Rename the selected profile' - ImageIndex = 1 - ShortCut = 113 - OnExecute = actRenameProfileExecute - end - object actDeleteProfile: TAction - Caption = '&Delete' - Hint = 'Delete the selected profile' - ImageIndex = 4 - ShortCut = 16430 - OnExecute = actDeleteProfileExecute - end - object actSetActiveProfile: TAction - Caption = 'Set &active' - Hint = 'Set the selected profile as the active profile' - ImageIndex = 5 - ShortCut = 16397 - OnExecute = actSetActiveProfileExecute - end - end - object ImageList: TImageList - Left = 192 - Top = 400 - Bitmap = { - 494C0101060009000C0010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000002000000001002000000000000020 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002427AE00161C - AC005A5AA90000000000000000000000000000000000000000005353A9004F4F - A200000000000000000000000000000000000000000000000000000000000000 - 0000000000005C8F5C002979270014700D0014700D00277525005C8F5C000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000004E4EAB001844F600194D - F8001031D2002427AE000000000000000000000000004E4EAB000928D700092E - D7000313B3004E4EAB0000000000000000000000000000000000000000000000 - 00000F7D0F00088800000888000013880000217D000032720000266D0000126D - 0D00000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000002022B1002451F9001F51 - FF00194DF8001744E8001017AF00000000004545AD00092ED7001142F9000D3D - F5000D3DF500041ABC006F6FAA00000000000000000000000000000000000585 - 070004A00800009D010004A00800009D0100009D0100009500001E7E0000396B - 0000106902000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000001832DB00285A - FF002451F9002451F9001A4AF100060EAF000F30DD00164AFE001142F9001041 - F6000D3DF5000D3DF5002C2CA200000000000000000000000000158816000BA8 - 170004A0080036C15400DCF3E9007ADD9B00009D010000950000009D01001285 - 0000396B0000126D0D0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007777B3001832DB004170 - FF002D5DFF00285AFF00285AFF001F51FF00194DF800194DF8001142F9001142 - F9000F3DF200161CAC000000000000000000000000006097600024A82F0008A9 - 1B002BB43E00F6F0F500FCF6FA00FFFEFF007ADD9B00009E0700009D01000095 - 0000217D0000266D00005C8F5C00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000006969B8001A25 - C5003A6DFF003668FF00285AFF00285AFF002451F900194DF8001F51FF00123D - ED002427AE00000000000000000000000000000000002C8E2B0039BF4F0024A8 - 2F00ECE6EA00F5EEF400FCF6FA00FFFEFF00FFFEFF007ADD9B00009E0700009D - 0100009500003671000027752500000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002F2FB3002E4EE7003668FF00285AFF00285AFF002451F900123DED002C2C - A20000000000000000000000000000000000000000001E93220039BF4F00AAC9 - A700FAEAF900D1E1D1001EAF3300DAEEDD00FFFEFF00FFFEFF007ADD9B00009E - 0700009D0100297C000014700D00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000253FDF003A6DFF003668FF002D5DFF00285AFF001B46EA002427 - AE000000000000000000000000000000000000000000219624005DD27C0017A3 - 25008EBF880011AB24001BB940000BAC2600DAEEDD00FFFEFF00FFFEFF007ADD - 9B00009D01001B86000014700D00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002B2CC0004B7CFF004170FF003A6DFF003A6DFF00285AFF00285AFF001031 - D2004A4AB200000000000000000000000000000000002C922C0077DC95002CC5 - 59001BB940002CC5590026C04E0022BB45000BAC2600DAEEDD00FFFEFF00FFFE - FF0078DB960013880000267D2600000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000253FDF00527CFA004170FF003668FF000C13C1003A6DFF00285AFF002451 - F9000B1DC20000000000000000000000000000000000629C620053C66C0061D8 - 890031CA630031CA63002CC5590026C04E0022BB45000BAC2600DAEEDD00FCF6 - FA00CAECD7000E8E08005C905C00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004F4F - BD00527CFA005080FF004B7CFF00181FC500000000001B22C4003A6DFF00285A - FF001A4AF1001419B100000000000000000000000000000000001E9A230083E5 - A7004CD3790031CA630031CA630027C3530022BB45001CB53A000BA81F007ACC - 850011AB24000F7D0F0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000252D - D6006A9CFF005788FF002E4EE7007070B90000000000000000001621C7002D5D - FF002451F9001439DD004545AD000000000000000000000000000000000024A4 - 2D0081E3A6005ED8880031CA630027C3530022BB45001CB53A0016B02E000BAC - 2600058A08000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004B4B - C8003951E2005080FF002929C600000000000000000000000000000000001628 - D300285AFF000F2EE3002123B500000000000000000000000000000000000000 - 00001E9A230056CA730077E09C005DD27C0043C8660036C154001EAA2F001588 - 1600000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000003E3EB90000000000000000000000000000000000000000006B6B - B6002E2EB5000000000000000000000000000000000000000000000000000000 - 000000000000629C62002C922C00229A28001E9322002C922C00609960000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000009B7C6C009B7C - 6C009B7C6C009B7C6C009B7C6C009B7C6C009B7C6C009B7C6C009B7C6C009B7C - 6C00987A69009B7C6C00000000000000000000000000000000009A7C6A009A7C - 6A009A7C6A009A7C6A009A7C6A009A7C6A009A7C6A009A7C6A009A7C6A009A7C - 6A009A7C6A009A7C6A0000000000000000000000000000000000AF704E00A747 - 1100895E4600A7ABAB00B9B2AB00C8C7C300C9C9CC00AFAFAF0099A2A8008238 - 0D00A7471100A34B2100A4776300000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000009B7766000000 - 0000FAF4E900FAF4E900FAF4E900FAF4E900FAF3E800FAF3E800FAF3E800F9EF - E000F9EFE00097796700000000000000000000000000000000009B7766000000 - 0000FAF4E900FAF4E900EEE9DE00EEE9DE00EEE9DE00FAF4E900FAF2E500F9EF - E000F8EDDA0097796700000000000000000000000000BC764500BE631700CD78 - 25009E877000B9875900CE700D00DCAF7A00FEFFFF00FEFFFF00D9E2EA00AD70 - 2400DD943500ECBE7500A4440D00000000000000000000000000C5985E00D88D - 2E00C2813000BC976D0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A27F6F000000 - 0000FCF6EE00FCF6EE00FCF6EE00FAF4E900FAF4E900FAF4E900FAF3E800FAF3 - E800F8EDDA00987A690000000000000000000000000000000000A27F6F000000 - 0000DDC2B500DDC2B500B5A9A400B1A19A00DDC2B500DCBBA900DCBAA500DCBA - A500FAF2E50097796700000000000000000000000000CA680C00C0702800C36C - 1E00A7876B00AE7C5A00BA580800C69A6C00D9DFE500F9F9F900F9FFFF00A363 - 1D00D4852D00E5AF6900A4440D00000000000000000000000000DB963800FFE2 - C300F6C69400EAA04B00D8852500C28649000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A38070000000 - 0000FCF8F100FCF8F100FCF8F100FCF8F100FAF4E900FAF4E900FAF4E900FAF4 - E900FAF3E8009B7C6C0000000000000000000000000000000000A38070000000 - 0000DDC2B500E9DDDA006F6D7100928B9600C3CDB900EAD8CC00DAB8A500DCBA - A500FAF2E5009A7C6A00000000000000000000000000CA680C00BB682300BF66 - 1900B4906E00B37C6000AF490000B5875E00BFC6CD00D9DFE500FEFFFF00A363 - 1D00D4852D00E5AF6900A4440D00000000000000000000000000E4933600FFD9 - B200FFC79000FFC98E00FFC98E00EFA65800D4802600C7864400000000000000 - 000000000000B6886600B0825D00000000000000000000000000A98778000000 - 0000FCF8F100FCF8F100FCF8F100FCF8F100FCF8F100FCF8F100FAF4E900FAF4 - E900FAF4E9009B7C6C0000000000000000000000000000000000A98778000000 - 0000DECAC600E9DDDA00A8BBCE0034B356002CB4440071B46F00ECDBD200DCBA - A500FAF4E9009A7C6A00000000000000000000000000CA680C00BF661900BF66 - 1900B07D5800C0BFBD00B0ACA80098918B009A8E8400A3978A00AEA79F009058 - 1F00A7672300DA954200A4440D000000000000000000BB926700E8A15000FFD5 - A900FFC48B00FFCD9900FFCD9900FFC58300FFCC8700DE862B00000000000000 - 000000000000B5886800AD683200000000000000000000000000AB897A000000 - 000000000000FCF8F10000000000FCF8F10000000000FCF8F100FCF8F100FAF4 - E900FAF4E9009B7C6C0000000000000000000000000000000000AB897A000000 - 0000DBC7C200E6D7D40099D0A70066FF98005AEC86002EAD460087BE8100EAD8 - CC00FAF4E9009A7C6A00000000000000000000000000C8660900B55D1B00B55D - 1B00B85B0F00BA580800BA580800C2620E00C5671000C8691300C8691300CD78 - 2500D4852D00D3893200A4440D000000000000000000B88C5900FFCD9900FFC4 - 8B00FFC58300FFCD9900DE862B00B9733000C27D3800C0956D00000000000000 - 000000000000B5856200B55B1900000000000000000000000000AB897A000000 - 0000EDEEFB00F1F2FB0000000000FCF8F100FCF8F100FCF8F100FCF8F100FCF8 - F100FAF4E9009B7C6C0000000000000000000000000000000000AB897A000000 - 0000DBC7C200DECAC600DBE4D60056E17D006AFF9D0056E17D002AA43C009CC4 - 9400FCF8F2009A7C6A00000000000000000000000000C8680900B0551400B169 - 3300AE703F00AE703F00B1764100B1764100B1764100B1764100B1764100B47D - 4600BD804100D4852D00A4440D000000000000000000BF813A00FFD9B200FFC5 - 8300FFC48B00FFC18000FEBB7500BF7F3E000000000000000000000000000000 - 000000000000B7754200CB661100000000000000000000000000A69DA900A7B3 - FF008391FE00A6CDFF00C7D1FD00F5F5FB000000000000000000FCF8F100FCF8 - F100FAF4E9009B7C6C0000000000000000000000000000000000B19080000000 - 0000000000000000000000000000D1F8DC0054EE83006AFF9D0050DC7700249E - 3800B7DCB600B69F9400000000000000000000000000C2620E00AF490000B39D - 8900E6F2FB00E4EDF300E4EDF300E4EDF300E4EDF300DDE5EC00D5DEE400D1DC - E600AD9A8A00CD782500A74711000000000000000000CA873800FFD9B200D68B - 3400D4882F00FFD9AE00FEBB7500DE8D3500B996750000000000000000000000 - 000000000000C56E2800CD660D000000000000000000000000007890CE005497 - FF005DB4FF004FA1FF006176FF00C7D1FD0000000000FCF8F100FCF8F100FCF8 - F100FCF8F1009B7C6C0000000000000000000000000000000000AF8F80000000 - 0000DFCDCB00DFCDCB00DECAC600ECDBD200ADEAB9005AF6880064FF970042DA - 690034873E00C6BDB600000000000000000000000000C8660900A8430300B99A - 8400F9FFFF00D5D3D000BDBDBC00C0BFBD00C0BFBD00C2C1C000C9C9CC00DFE3 - E600B19B8500CF7C2200A4440D000000000000000000D58D3D00FFCA9400B082 - 5D00B4835600FDCF9F00FFBF7A00FFB96C00C672240000000000000000000000 - 0000B5856200E87E1500C16115000000000000000000000000003653E20060E1 - FF001DE5FF0057EDFF005DB4FF00A1C0FE00F5F5FB0000000000FCF8F100FAF4 - E900F0E8E000A27F6F0000000000000000000000000000000000B19080000000 - 0000000000000000000000000000000000000000000091EFAC0055FC88009AC1 - A400CDBBB6006E6D8C00000000000000000000000000C8660900A23C0000B99A - 8400FEFFFF00F1F1F100EDEDED00EDEDED00E9E9E900DFE3E600E1E1E100E9E9 - E900AD9A8A00CD792000A4440D000000000000000000C18E5800CE893F000000 - 000000000000C4772600FFE0B900FFB36200FFB15C00D0762100B9703400BA6B - 2D00D9721200FFA22200A76135000000000000000000000000005997EE0057ED - FF0000CDFF003CECFF003A82FF00899BFE00F1F2FB00FCF8F100A3807000A782 - 7000A7827000A380700000000000000000000000000000000000B19080000000 - 0000000000000000000000000000000000000000000000000000A5C5A6000000 - 00007892F500203DDC00292AA1000000000000000000C56206009E370000BD9C - 8A00FEFFFF00DDDCDB00C1C0BF00C2C1C000C2C1C000C2C1C000C9C9CC00E9E9 - E900B39D8900CD792000A4440D00000000000000000000000000000000000000 - 00000000000000000000CD7A2900FFD9B200FFB15C00FFA94800FFA94800FFA1 - 3200FF9D2300E1730E00B58868000000000000000000000000004960DC00499E - FF0063F8FF006DE2FF00437BFF00ADBDFE00FAF8FA0000000000A7827000F5E2 - D900B18E7E00AB9E980000000000000000000000000000000000B89888000000 - 000000000000000000000000000000000000FCF8F20000000000DECAC6008C99 - DE004277FF002D4AD8001F209F000000000000000000C56206009E370000BD9C - 8A00FEFFFF00FEFFFF00EDEDED00F1F1F100EDEDED00DFE3E600E5E4E300E6EA - ED00B5A08900C2701D00A9480D00000000000000000000000000000000000000 - 0000000000000000000000000000C6722400FFCA9400FFD09400FFC17500FFA9 - 3B00EA781100B5704900000000000000000000000000000000008E88BB00668D - FF005D9BFF004E71FF00A6CDFF00E3E8FF000000000000000000A3807000B18E - 7E00AB9E98000000000000000000000000000000000000000000B89888000000 - 0000000000000000000000000000000000000000000000000000B1908000C1B9 - D0003545C5002C30A700000000000000000000000000C260070093280000BD9C - 8A00FEFFFF00DFE3E600D0CFCD00D0CFCD00C9C9CC00D0CFCD00D5D3D000F1F1 - F100B5A089008A4F1400B0551400000000000000000000000000000000000000 - 000000000000000000000000000000000000A8714D00B8652100BC621B00AC5D - 2700B0825D000000000000000000000000000000000000000000C0A8A300ACAB - B500958AB3009D91AF00B29B9F00C0A59700AC887700AC887700A7827000AB9E - 9800000000000000000000000000000000000000000000000000B8988800B898 - 8800B1908000B1908000B1908000B1908000AC887700AC887700A3807000B5A9 - A4000000000000000000000000000000000000000000BF8D5800C0540200C8A4 - 8300D5D3D000D5D4D200D5D4D200D0CFCD00CCCAC800C8C7C300C0BFBD00BDBD - BC00B1947B00C0580200B07D5800000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000424D3E000000000000003E000000 - 2800000040000000200000000100010000000000000100000000000000000000 - 000000000000000000000000FFFFFF00FFFFFFFF00000000C7CFF81F00000000 - 8383F00F000000008101E00700000000C001C003000000008003800100000000 - C007800100000000F00F800100000000F80F800100000000F007800100000000 - F007800100000000E083C00300000000E0C1E00700000000E1E1F00F00000000 - FBE7F81F00000000FFFFFFFF00000000FFFFFFFFFFFFFFFFC003C003C001FFFF - D003D0038001C3FFD003D0038001C0FFD003D0038001C039D003D00380018039 - DA83D00380018039D203D003800180F9C0C3DE0380018079C083D00380018071 - C043DF8380019801C003DFD18001FC01C043DF418001FE03C0C7DFC38001FF07 - C00FC00F8001FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 - 000000000000} - end - object pmnProfiles: TPopupMenu - Images = ImageList - Left = 48 - Top = 344 - object pmnProfilesSetActive: TMenuItem - Action = actSetActiveProfile - Default = True - end - object pmnProfilesSep1: TMenuItem - Caption = '-' - end - object pmnProfilesNew: TMenuItem - Action = actNewProfile - end - object pmnProfilesSave: TMenuItem - Action = actSaveProfile - end - object pmnProfilesRevert: TMenuItem - Action = actRevertProfile - end - object pmnProfilesDelete: TMenuItem - Action = actDeleteProfile + object pnlG940: TPanel + AlignWithMargins = True + Left = 3 + Top = 3 + Width = 224 + Height = 40 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object imgStateFound: TImage + Left = 4 + Top = 4 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF4000000097048597300000B1300000B1301009A9C18 + 00000A4F6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53675453E9163DF7DEF4424B8880944B6F5215082052428B801491262A21 + 09104A8821A1D91551C1114545041BC8A088038E8E808C15512C0C8A0AD807E4 + 21A28E83A3888ACAFBE17BA36BD6BCF7E6CDFEB5D73EE7ACF39DB3CF07C0080C + 9648335135800CA9421E11E083C7C4C6E1E42E40810A2470001008B3642173FD + 230100F87E3C3C2B22C007BE000178D30B0800C04D9BC0301C87FF0FEA42995C + 01808401C07491384B08801400407A8E42A600404601809D98265300A0040060 + CB6362E300502D0060277FE6D300809DF8997B01005B94211501A09100201365 + 884400683B00ACCF568A450058300014664BC43900D82D00304957664800B0B7 + 00C0CE100BB200080C00305188852900047B0060C8232378008499001446F257 + 3CF12BAE10E72A00007899B23CB9243945815B082D710757572E1E28CE49172B + 14366102619A402EC27999193281340FE0F3CC0000A0911511E083F3FD78CE0E + AECECE368EB60E5F2DEABF06FF226262E3FEE5CFAB70400000E1747ED1FE2C2F + B31A803B06806DFEA225EE04685E0BA075F78B66B20F40B500A0E9DA57F370F8 + 7E3C3C45A190B9D9D9E5E4E4D84AC4425B61CA577DFE67C25FC057FD6CF97E3C + FCF7F5E0BEE22481325D814704F8E0C2CCF44CA51CCF92098462DCE68F47FCB7 + 0BFFFC1DD322C44962B9582A14E35112718E449A8CF332A52289429229C525D2 + FF64E2DF2CFB033EDF3500B06A3E017B912DA85D6303F64B27105874C0E2F700 + 00F2BB6FC1D4280803806883E1CF77FFEF3FFD47A02500806649927100005E44 + 242E54CAB33FC708000044A0812AB0411BF4C1182CC0061CC105DCC10BFC6036 + 844224C4C24210420A64801C726029AC82422886CDB01D2A602FD4401D34C051 + 688693700E2EC255B80E3D700FFA61089EC128BC81090441C808136121DA8801 + 628A58238E08179985F821C14804128B2420C9881451224B91354831528A5420 + 55481DF23D720239875C46BA913BC8003282FC86BC47319481B2513DD40CB543 + B9A8371A8446A20BD06474319A8F16A09BD072B41A3D8C36A1E7D0AB680FDA8F + 3E43C730C0E8180733C46C302EC6C342B1382C099363CBB122AC0CABC61AB056 + AC03BB89F563CFB17704128145C0093604774220611E4148584C584ED848A820 + 1C243411DA093709038451C2272293A84BB426BA11F9C4186232318758482C23 + D6128F132F107B8843C437241289433227B9900249B1A454D212D246D26E5223 + E92CA99B34481A2393C9DA646BB20739942C202BC885E49DE4C3E433E41BE421 + F25B0A9D624071A4F853E22852CA6A4A19E510E534E5066598324155A39A52DD + A8A15411358F5A42ADA1B652AF5187A81334759A39CD8316494BA5ADA295D31A + 681768F769AFE874BA11DD951E4E97D057D2CBE947E897E803F4770C0D861583 + C7886728199B18071867197718AF984CA619D38B19C754303731EB98E7990F99 + 6F55582AB62A7C1591CA0A954A9526951B2A2F54A9AAA6AADEAA0B55F355CB54 + 8FA95E537DAE46553353E3A909D496AB55AA9D50EB531B5367A93BA887AA67A8 + 6F543FA47E59FD890659C34CC34F43A451A0B15FE3BCC6200B6319B3782C216B + 0DAB86758135C426B1CDD97C762ABB98FD1DBB8B3DAAA9A13943334A3357B352 + F394663F07E39871F89C744E09E728A797F37E8ADE14EF29E2291BA6344CB931 + 655C6BAA96979658AB48AB51AB47EBBD36AEEDA79DA6BD45BB59FB810E41C74A + 275C2747678FCE059DE753D953DDA70AA7164D3D3AF5AE2EAA6BA51BA1BB4477 + BF6EA7EE989EBE5E809E4C6FA7DE79BDE7FA1C7D2FFD54FD6DFAA7F5470C5806 + B30C2406DB0CCE183CC535716F3C1D2FC7DBF151435DC34043A561956197E184 + 91B9D13CA3D5468D460F8C69C65CE324E36DC66DC6A326062621264B4DEA4DEE + 9A524DB9A629A63B4C3B4CC7CDCCCDA2CDD699359B3D31D732E79BE79BD79BDF + B7605A785A2CB6A8B6B86549B2E45AA659EEB6BC6E855A3959A558555A5DB346 + AD9DAD25D6BBADBBA711A7B94E934EAB9ED667C3B0F1B6C9B6A9B719B0E5D806 + DBAEB66DB67D6167621767B7C5AEC3EE93BD937DBA7D8DFD3D070D87D90EAB1D + 5A1D7E73B472143A563ADE9ACE9CEE3F7DC5F496E92F6758CF10CFD833E3B613 + CB29C4699D539BD347671767B97383F3888B894B82CB2E973E2E9B1BC6DDC8BD + E44A74F5715DE17AD2F59D9BB39BC2EDA8DBAFEE36EE69EE87DC9FCC349F299E + 593373D0C3C843E051E5D13F0B9F95306BDFAC7E4F434F8167B5E7232F632F91 + 57ADD7B0B7A577AAF761EF173EF63E729FE33EE33C37DE32DE595FCC37C0B7C8 + B7CB4FC36F9E5F85DF437F23FF64FF7AFFD100A78025016703898141815B02FB + F87A7C21BF8E3F3ADB65F6B2D9ED418CA0B94115418F82AD82E5C1AD2168C8EC + 90AD21F7E798CE91CE690E85507EE8D6D00761E6618BC37E0C2785878557863F + 8E7088581AD131973577D1DC4373DF44FA449644DE9B67314F39AF2D4A352A3E + AA2E6A3CDA37BA34BA3FC62E6659CCD5589D58496C4B1C392E2AAE366E6CBEDF + FCEDF387E29DE20BE37B17982FC85D7079A1CEC2F485A716A92E122C3A96404C + 884E3894F041102AA8168C25F21377258E0A79C21DC267222FD136D188D8435C + 2A1E4EF2482A4D7A92EC91BC357924C533A52CE5B98427A990BC4C0D4CDD9B3A + 9E169A76206D323D3ABD31839291907142AA214D93B667EA67E66676CBAC6585 + B2FEC56E8BB72F1E9507C96BB390AC05592D0AB642A6E8545A28D72A07B26765 + 5766BFCD89CA3996AB9E2BCDEDCCB3CADB90379CEF9FFFED12C212E192B6A586 + 4B572D1D58E6BDAC6A39B23C7179DB0AE315052B865606AC3CB88AB62A6DD54F + ABED5797AE7EBD267A4D6B815EC1CA82C1B5016BEB0B550AE5857DEBDCD7ED5D + 4F582F59DFB561FA869D1B3E15898AAE14DB1797157FD828DC78E51B876FCABF + 99DC94B4A9ABC4B964CF66D266E9E6DE2D9E5B0E96AA97E6970E6E0DD9DAB40D + DF56B4EDF5F645DB2F97CD28DBBB83B643B9A3BF3CB8BC65A7C9CECD3B3F54A4 + 54F454FA5436EED2DDB561D7F86ED1EE1B7BBCF634ECD5DB5BBCF7FD3EC9BEDB + 5501554DD566D565FB49FBB3F73FAE89AAE9F896FB6D5DAD4E6D71EDC703D203 + FD07230EB6D7B9D4D51DD23D54528FD62BEB470EC71FBEFE9DEF772D0D360D55 + 8D9CC6E223704479E4E9F709DFF71E0D3ADA768C7BACE107D31F761D671D2F6A + 429AF29A469B539AFB5B625BBA4FCC3ED1D6EADE7AFC47DB1F0F9C343C59794A + F354C969DAE982D39367F2CF8C9D959D7D7E2EF9DC60DBA2B67BE763CEDF6A0F + 6FEFBA1074E1D245FF8BE73BBC3BCE5CF2B874F2B2DBE51357B8579AAF3A5F6D + EA74EA3CFE93D34FC7BB9CBB9AAEB95C6BB9EE7ABDB57B66F7E91B9E37CEDDF4 + BD79F116FFD6D59E393DDDBDF37A6FF7C5F7F5DF16DD7E7227FDCECBBBD97727 + EEADBC4FBC5FF440ED41D943DD87D53F5BFEDCD8EFDC7F6AC077A0F3D1DC47F7 + 068583CFFE91F58F0F43058F998FCB860D86EB9E383E3939E23F72FDE9FCA743 + CF64CF269E17FEA2FECBAE17162F7EF8D5EBD7CED198D1A197F29793BF6D7CA5 + FDEAC0EB19AFDBC6C2C61EBEC97833315EF456FBEDC177DC771DEFA3DF0F4FE4 + 7C207F28FF68F9B1F553D0A7FB93199393FF040398F3FC63332DDB000009C549 + 44415478DA9D570B5094D7153EFB7EF0581658965704410444855D23D030680D + AD428805634631C6689B264ECD74DA344D26D3C9A4292A1AED34613A7D68673A + 93345640DB8ACA43790A62001D231A890875C37B9FB00FD85DF6D9732E6068C5 + 84E69FF9877F97FFDEF3DD73BEEF3B67397EBF5F06002EF816977FF6C207FCC0 + 01E072B91C9FCF37FBDDDCC5E170E8A66BB12D841C7C598C0FCE2507F5F961C6 + 3D03629118EC763B381C0E70D81DE072B920441E42A0606A6A8AFDE5F3F92010 + 08402E978350285C6C3B310190E0836329C1BD5E2FDBD86C3607F5F6F6FEC462 + B6C4210091D566155A262DD3098909D78D46E37AAD56CB9B99992150BE808000 + 6FEE86DCBE8D1B37FE01B3E3C52C018FC79BDF52B2240014D4E3F13C4CDBFB47 + DF3FD570B9E179A140083EBF0FA6A7A76164640456AE5C097A9D1E2626275876 + 444211A8D7A961F5EAD570E0A7AF6585CAE5DDB4974C2683B9927C33005A305F + 5342DFD6D6B6FDF59FBD7E363030909D846ECD971AC60379881CEC0E3B389D4E + 569A0D1B363070898989B07BCFEE8308E45DB7DB0D4141414B0380A966279FE7 + 8F542A858AD395C72B4F57FE325C11CEEA4BE0EA2FD7436A4A2A848785B3FAD3 + E969DD9A356BE0CEE7774095A1F2BDF3EE3B7961A1A1AD7494057C581C00D60A + 060606C03C39C94EFDF06D0470BEFAFCC74D8D4D7B140A050344EFD6D6D55210 + 080D0D6527260074D2F4F47470CE38619D7A9D6573FEE60C2CD997A496A8A8A8 + AFCF002D6E6C68983BFD57F2914824505B5BF7AFABED578BC3C3C31900AFCF0B + 1DD73A20636D06FB3CAF0C7AA6F531B131F0E65B6FDE5F959696C1998BB360CF + C50190A42A4E57B05A2ECC80582C063C7D437777F7F7C2C2C2182002DBFB452F + A4A4A4009FC767C14901243D2AC7C4C4041C3B7EEC4F45C545AFC1AC632CBC16 + 07401B9C3C7102377B0400A7B1A1B1FDC68D1B39048000D12989842B56AC60DB + D35ABA294309090960301A61FFFE575F2E78A6E0AFC3C3C30C2071E36B0178F0 + 5475F5F5E0240094AEB99449F1C435B5351FFDE3EC3F5FC4DA734522113324AD + 410BB1D1B12CB51EB7075C6E17E343F2CA6410880490979757A052A9EAABABAB + 19A81776BFF0CD3E407AD66834CCCD18A8391F085728A4D7AE5E5523BBD7F4DF + EFDFD9D2DABAD1ED71832C58F690C06E2CA15C1E0ACB972FA74C18DFFED5DB45 + 28D7818ABF574CA8D42A4FF1B6E279337A3C00EDB81686068700DD0D7A6EF580 + 3252C96A2A100A20521909C343C311353535151F967FB889C7E7416C4C2C8C8C + 8E62C03058BB7A2D984C266BF677B21B91271359D959EDE81B3DB77B6E8F2237 + 2C3B4B76BA29068278BC0AEA6AEB41815A4F4A4E82D6E656C8CECE86F1F17198 + 9A9E02A53272737767E789F3E7CFC7373537B3D344474503DA30E4E4E4C08E9D + 3B08A00BDFB7194D46C7B265CBDA51B6F7925352EA313BD7456211646565F983 + 838317073089FA3FF5C9697C29139627C443DB9536C8CCCC648CBEDFDFFFF33B + 3D3D472E5CB820B6DA6C603018180065849249502215435C5C3CE3008FCB636B + F47A3D58AD36282ADE3651B26B47AEE6C183DEA7729E82E8E8E84701500DC7C6 + C6A0E6621DA8D52A06A0E36A07F9B9E4E6CD9BBFC5BA1FB872A515B45A3DD639 + 84F9BE6BC60564CD1488144046430A898989C1F7B4C82321AC7BF249DC771CB6 + 3F5FFCD6F6E7B61D2762A3C21E05A0D3E9989B353634013217525293A1A9A929 + AEE7B39E13B76FDFDE4206333434C42C988212E3490944565AC7E57001BB2393 + 266545817766661666C00AED6DEDF04C61FEA9575EF9F18BC4AD4748481A45A2 + 40547414D4D75D6275777A3D595567CE7E14201024BB313BF7BEB8079A7FF723 + D3DD730D8A03429463705030604D190FFA07FA41887D4219198D010BC186C1BB + BBAF83C56281F8F8B85B9F9CFA58856D9A7AC97F03C01483C968825569AB3003 + CDB8B1748FAEB9A63CD2E7941B57A9818BF380116B3A643083CBE98269EC7CE6 + 491398903333F8ECC2F493F78B44124C7F2C6CC9DF02668B15BA3A3B1F3A247A + 87FD771F1CDF849ED19D9B9BFBD540423AAF3E57CD1C2C353515FE7CF28FBFFE + FCC167EFE561870B98E2825EA104B5A91F46BC4268E109C0E21A04B9301A7C76 + 1198274C3089249B0DE284106CCB79DFCFC393DBE0DAB54EF61D05273BE360C6 + F47AAD75DFDEBD1F1C2A3B7CF021007AA1E6620D2E0E096969BC523E6CBCF392 + 275407324E1280800F2EEF08240B5240333E090EB1199CBC29F05815F0DD2917 + 4458F4501310099A491B08D1BA373DBD114821D73A3EC57E3283B276314BF7E3 + F0A2D58D3362BEF1C62F4E1E3B76EC000380A396834CA6B9A939AEB6A6EE6F23 + 23A3B951514A6432F56D1EF0653670FB1DE0B7CBC01EA4C1FAFB20DABA02126D + 3AE0E13B7D76005B5018F3FDF5EBD781C3E940C275B066469E32DBFFFD30AE1D + 431E98A1A4A4E46CE9C1D21F29C2154E9A62258383830E742C41E97BA52DCDCD + CD39D4EB674925C3B62A41B2883009B809D78B785C30E57081C2CF851CAF1EFA + 3181B778A13085C155EA74B46C37FA463B7A8283D937C9917A84C1A0071BAA03 + BBE299D2D2DFEC93C982ED229158C2C1BAF1D15223AE775DFFFDC58B179F1B78 + 30C0BC801A4D803480313B147D9D8C854629A9241019CE071FC70F765402FE01 + 271AD0EA356934BF416B6B1B3B39A9C0472A4159EA745AB0A3833EBBB5F0CCC1 + C387F622204708CE85CC8AD1F514BB76EE6AE9EBEB4B9BB64F831E9152BDA412 + 2926CDCF864E1AC5E93BD23B699F864AEAF7418134DB71616D463A8825626869 + 6A65FD22292991AD19191D63B29C98304251D10FAA0E971DDE477C1361568270 + 1FE60338F729F7BFBABF4AA7D5255BAC16331A8B0F3921460B8DC5FF09580D45 + 421020F389C6349A538628AD64C14FC43EC18CC66030B11932252589B88E9D74 + 900537998C74F2AA2347CAF6E1791C344191D2E6E60C2C81DD211A1C1AF44644 + 44C8912CD3B8A91F83F2CF9D3B977CF7EE5D3576B59CEEAE6E954EAF4BC26C89 + 695AA2F290F3111802B12A358DD9AD103BE5F2F87874CA6130A15F188C06282C + 2CA83A7A148303C741F3852C440664420FE7012221DE0EB2548958C2BE259BAD + ACAC64A9A61B1B8E082D38A9ABAB8B0065B7B7B7AB474747D330DD812CE5892B + 90230ADC5C0E5E2421353322DD96822D678E1E3D82C1FD76370E2A544202B0E8 + 4C480E26E00B586AE864980136F3CD8F5D3482D3C2B8B838282F2FE7171414C4 + 5FBA74291D3DFE6994EF4B9111518162EC131ACD005B9F9F9F5F5576A4EC87B8 + 9F9DCC27501AC84AB9A499707E26989F6029232855068ED2D7D383038A520997 + 2F5F86AD5BB7C2D8E8584ED9E1B2BFE0049532E39AF1173E5B5879E8D0A19711 + BC833C804AF6984BF27FFF385DD8B6890F6C644380F7FAFA649D9F76AAB83CAE + A7A46457874824F42FF80DF8B88BF5826FFDF3FC7F2EAC94C73DA70E3A327709 + 6B84FF0180E96622F4B22C130000000049454E44AE426082} + Visible = False + end + object imgStateNotFound: TImage + Left = 4 + Top = 4 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF4000000097048597300000B1300000B1301009A9C18 + 00000A4F6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53675453E9163DF7DEF4424B8880944B6F5215082052428B801491262A21 + 09104A8821A1D91551C1114545041BC8A088038E8E808C15512C0C8A0AD807E4 + 21A28E83A3888ACAFBE17BA36BD6BCF7E6CDFEB5D73EE7ACF39DB3CF07C0080C + 9648335135800CA9421E11E083C7C4C6E1E42E40810A2470001008B3642173FD + 230100F87E3C3C2B22C007BE000178D30B0800C04D9BC0301C87FF0FEA42995C + 01808401C07491384B08801400407A8E42A600404601809D98265300A0040060 + CB6362E300502D0060277FE6D300809DF8997B01005B94211501A09100201365 + 884400683B00ACCF568A450058300014664BC43900D82D00304957664800B0B7 + 00C0CE100BB200080C00305188852900047B0060C8232378008499001446F257 + 3CF12BAE10E72A00007899B23CB9243945815B082D710757572E1E28CE49172B + 14366102619A402EC27999193281340FE0F3CC0000A0911511E083F3FD78CE0E + AECECE368EB60E5F2DEABF06FF226262E3FEE5CFAB70400000E1747ED1FE2C2F + B31A803B06806DFEA225EE04685E0BA075F78B66B20F40B500A0E9DA57F370F8 + 7E3C3C45A190B9D9D9E5E4E4D84AC4425B61CA577DFE67C25FC057FD6CF97E3C + FCF7F5E0BEE22481325D814704F8E0C2CCF44CA51CCF92098462DCE68F47FCB7 + 0BFFFC1DD322C44962B9582A14E35112718E449A8CF332A52289429229C525D2 + FF64E2DF2CFB033EDF3500B06A3E017B912DA85D6303F64B27105874C0E2F700 + 00F2BB6FC1D4280803806883E1CF77FFEF3FFD47A02500806649927100005E44 + 242E54CAB33FC708000044A0812AB0411BF4C1182CC0061CC105DCC10BFC6036 + 844224C4C24210420A64801C726029AC82422886CDB01D2A602FD4401D34C051 + 688693700E2EC255B80E3D700FFA61089EC128BC81090441C808136121DA8801 + 628A58238E08179985F821C14804128B2420C9881451224B91354831528A5420 + 55481DF23D720239875C46BA913BC8003282FC86BC47319481B2513DD40CB543 + B9A8371A8446A20BD06474319A8F16A09BD072B41A3D8C36A1E7D0AB680FDA8F + 3E43C730C0E8180733C46C302EC6C342B1382C099363CBB122AC0CABC61AB056 + AC03BB89F563CFB17704128145C0093604774220611E4148584C584ED848A820 + 1C243411DA093709038451C2272293A84BB426BA11F9C4186232318758482C23 + D6128F132F107B8843C437241289433227B9900249B1A454D212D246D26E5223 + E92CA99B34481A2393C9DA646BB20739942C202BC885E49DE4C3E433E41BE421 + F25B0A9D624071A4F853E22852CA6A4A19E510E534E5066598324155A39A52DD + A8A15411358F5A42ADA1B652AF5187A81334759A39CD8316494BA5ADA295D31A + 681768F769AFE874BA11DD951E4E97D057D2CBE947E897E803F4770C0D861583 + C7886728199B18071867197718AF984CA619D38B19C754303731EB98E7990F99 + 6F55582AB62A7C1591CA0A954A9526951B2A2F54A9AAA6AADEAA0B55F355CB54 + 8FA95E537DAE46553353E3A909D496AB55AA9D50EB531B5367A93BA887AA67A8 + 6F543FA47E59FD890659C34CC34F43A451A0B15FE3BCC6200B6319B3782C216B + 0DAB86758135C426B1CDD97C762ABB98FD1DBB8B3DAAA9A13943334A3357B352 + F394663F07E39871F89C744E09E728A797F37E8ADE14EF29E2291BA6344CB931 + 655C6BAA96979658AB48AB51AB47EBBD36AEEDA79DA6BD45BB59FB810E41C74A + 275C2747678FCE059DE753D953DDA70AA7164D3D3AF5AE2EAA6BA51BA1BB4477 + BF6EA7EE989EBE5E809E4C6FA7DE79BDE7FA1C7D2FFD54FD6DFAA7F5470C5806 + B30C2406DB0CCE183CC535716F3C1D2FC7DBF151435DC34043A561956197E184 + 91B9D13CA3D5468D460F8C69C65CE324E36DC66DC6A326062621264B4DEA4DEE + 9A524DB9A629A63B4C3B4CC7CDCCCDA2CDD699359B3D31D732E79BE79BD79BDF + B7605A785A2CB6A8B6B86549B2E45AA659EEB6BC6E855A3959A558555A5DB346 + AD9DAD25D6BBADBBA711A7B94E934EAB9ED667C3B0F1B6C9B6A9B719B0E5D806 + DBAEB66DB67D6167621767B7C5AEC3EE93BD937DBA7D8DFD3D070D87D90EAB1D + 5A1D7E73B472143A563ADE9ACE9CEE3F7DC5F496E92F6758CF10CFD833E3B613 + CB29C4699D539BD347671767B97383F3888B894B82CB2E973E2E9B1BC6DDC8BD + E44A74F5715DE17AD2F59D9BB39BC2EDA8DBAFEE36EE69EE87DC9FCC349F299E + 593373D0C3C843E051E5D13F0B9F95306BDFAC7E4F434F8167B5E7232F632F91 + 57ADD7B0B7A577AAF761EF173EF63E729FE33EE33C37DE32DE595FCC37C0B7C8 + B7CB4FC36F9E5F85DF437F23FF64FF7AFFD100A78025016703898141815B02FB + F87A7C21BF8E3F3ADB65F6B2D9ED418CA0B94115418F82AD82E5C1AD2168C8EC + 90AD21F7E798CE91CE690E85507EE8D6D00761E6618BC37E0C2785878557863F + 8E7088581AD131973577D1DC4373DF44FA449644DE9B67314F39AF2D4A352A3E + AA2E6A3CDA37BA34BA3FC62E6659CCD5589D58496C4B1C392E2AAE366E6CBEDF + FCEDF387E29DE20BE37B17982FC85D7079A1CEC2F485A716A92E122C3A96404C + 884E3894F041102AA8168C25F21377258E0A79C21DC267222FD136D188D8435C + 2A1E4EF2482A4D7A92EC91BC357924C533A52CE5B98427A990BC4C0D4CDD9B3A + 9E169A76206D323D3ABD31839291907142AA214D93B667EA67E66676CBAC6585 + B2FEC56E8BB72F1E9507C96BB390AC05592D0AB642A6E8545A28D72A07B26765 + 5766BFCD89CA3996AB9E2BCDEDCCB3CADB90379CEF9FFFED12C212E192B6A586 + 4B572D1D58E6BDAC6A39B23C7179DB0AE315052B865606AC3CB88AB62A6DD54F + ABED5797AE7EBD267A4D6B815EC1CA82C1B5016BEB0B550AE5857DEBDCD7ED5D + 4F582F59DFB561FA869D1B3E15898AAE14DB1797157FD828DC78E51B876FCABF + 99DC94B4A9ABC4B964CF66D266E9E6DE2D9E5B0E96AA97E6970E6E0DD9DAB40D + DF56B4EDF5F645DB2F97CD28DBBB83B643B9A3BF3CB8BC65A7C9CECD3B3F54A4 + 54F454FA5436EED2DDB561D7F86ED1EE1B7BBCF634ECD5DB5BBCF7FD3EC9BEDB + 5501554DD566D565FB49FBB3F73FAE89AAE9F896FB6D5DAD4E6D71EDC703D203 + FD07230EB6D7B9D4D51DD23D54528FD62BEB470EC71FBEFE9DEF772D0D360D55 + 8D9CC6E223704479E4E9F709DFF71E0D3ADA768C7BACE107D31F761D671D2F6A + 429AF29A469B539AFB5B625BBA4FCC3ED1D6EADE7AFC47DB1F0F9C343C59794A + F354C969DAE982D39367F2CF8C9D959D7D7E2EF9DC60DBA2B67BE763CEDF6A0F + 6FEFBA1074E1D245FF8BE73BBC3BCE5CF2B874F2B2DBE51357B8579AAF3A5F6D + EA74EA3CFE93D34FC7BB9CBB9AAEB95C6BB9EE7ABDB57B66F7E91B9E37CEDDF4 + BD79F116FFD6D59E393DDDBDF37A6FF7C5F7F5DF16DD7E7227FDCECBBBD97727 + EEADBC4FBC5FF440ED41D943DD87D53F5BFEDCD8EFDC7F6AC077A0F3D1DC47F7 + 068583CFFE91F58F0F43058F998FCB860D86EB9E383E3939E23F72FDE9FCA743 + CF64CF269E17FEA2FECBAE17162F7EF8D5EBD7CED198D1A197F29793BF6D7CA5 + FDEAC0EB19AFDBC6C2C61EBEC97833315EF456FBEDC177DC771DEFA3DF0F4FE4 + 7C207F28FF68F9B1F553D0A7FB93199393FF040398F3FC63332DDB000007EF49 + 44415478DAA557494C5459147D9FFA50C52020833289322B4A83A248DA38A431 + 22A24C894A42ECD00BDDB831313171E1C279484C74D5B8E9EE841834B62DA0E0 + 80A222600403E21845914150041151849AFB9C177E350A38F54F7EA07EFDF7EE + B9E79E73EF2BC56EB71B841016F10317D63A6E455184939393B0D96CF2B376F1 + B9768F73A90A5E56BF070003984C26613018C4C78F1FC5D0D090FCCB6793274F + 96C13F7CF820FFAAAA2A9C9D9DE573171797FF0FC06AB5CA8DFBFBFBF50F1F3E + 5CF0EEDD3B2F00500706067478660A0F0FEFECEDED0DEEEEEE5686878709CAEE + EEEE6E5FB26449EFD2A54BEB00DE4E96743ADDF70160508BC5F18AEEE0C18339 + 972E5D5A80EC6CF8CE3E3838285EBC78618F8E8EB622B8FAF6ED5BC90AB34E4C + 4C749A33678E69F3E6CD053E3E3E9DDCCBCBCB4B2BC9D7016835E645F4555555 + B15BB66CC9F3F0F0B020133BB379FEFCB9FC1E542B086C67F62C0D3217040766 + F41B366CA800904AB3D92C264D9AF46D0040EBE8CC859B9B9B3871E2C40ADCBF + F8FBFB0FB3BE0477F1E2453173E64CE1E7E727EBCFECB92E2E2E4EDCBB774F99 + 3B77AE7DC78E1D7F818156EE334A0FE303A0D09E3E7D2A4825B31E0DA0A4A424 + FBCA952B490060E467BE5B5E5E2E10442080CC980098697C7CBC001B3A946130 + 3535B50080FB99796060E09719E0E28A8A0A99C568FBB8BABA32586E7575F54F + C8D6440014666D6DAD0CC6CF9A33F83FD7070707ABDBB66DEB9E3D7BF6EF5A9C + 517B8E0F80962A2A2A22FA4F18A0F590FDAF75757531BEBEBE660222583842CC + 9A354BAA9BC18D46A3B41ECBD1D7D7E772E8D0A19AACACAC724AEA9B6CC80D8E + 1D3B2637FB0C8072F9F2E5DF6EDFBE1D0900260262961461545494D403D7F2A6 + 1E203E015B3A6FDAB4E9EF55AB5635767474C83DA98D2F026056172E5C180380 + B4969595659F3E7D3A11B577D2EBF53680B0C07AA45A52CBB5BCA907D85281E0 + 949494944268A419FA91A0F2F2F2BEDE07B829336337E3A5B901E273AEA9A909 + 82BAFD9F3C791277EDDAB5307C67A3B7C900454900B4645858980E4C0C6CDFBE + BD08E5E943598700C4969D9DAD35A38901BC7AF54AB4B5B549C477EEDC110101 + 01B2A6B4D0D4A95305E874071B6B8F1C391201905632D0D9D929A907C5CA9B37 + 6F869393935BA09321FC6D43DFE86E6A6A1A0033C3EBD7AFB7C98EA6D34D5C82 + F3E7CFCBCD626262446565A5C026E2E5CB97D26600107EEBD6ADACD2D2523F88 + D2C46C828282586FB168D122B16EDD3A02B4E27D239E59A64F9FDE0EE67AB157 + 3304DE492D2D5CB8D0EEE9E9393E00FAFFF8F1E3022F09D028AE5FBF2E929292 + A868D1DCDC9C7CF7EEDD1567CF9ED5BF7FFFDEFCFAF56B492759A105E90C0494 + 1AC073056B14BC23E705A8EFCBCDCDFDE3D9B3673D040AD06301B0865D5D5D14 + 9B98376F9E0400DF0BB451B5A1A12115007E06201B4A64A5D5088AB605C58260 + E800361A3A84656129D931E7CF9FAF605F7D4E4E4E29EEDA91F13D1600C5479A + 6137D9DDD86241B317749081CC63E104537B7B3B67900CAA8D668A95EBE81A64 + 2B054C56A64C992299E433CC117D5A5A5AFDC68D1BFF898888182B42DA0E4291 + F5A40D597704083975EA540E8204A2EB191F3D7A245A5A5A64A6DA41037614A8 + A7BCA903B024C54AE1A6A7A7CBE0F5F5F502E3DB79C68C191D8585850518D364 + E65300A0586E80B62919C0C6F100948EE0EEB099995943DD92256DE2B104D40C + FF271B7C4E4021212102FD9F410504AB7548F60EE3E1C387FF04F0AEC58B17FF + 07803E2F2E2EA6CF655B2D28285876FFFEFD94D8D85805F44A80DC7864F6CBA0 + DEDEDEB26C04C1405A1BE6F3E5CB97CBCC6FDEBCE9E88EBC502227E8C2949F9F + 5FBD77EFDE2A0700BE70EEDC393610036C97D6DADABA00945BF0D9C6BA327068 + 68A8B422B3A4557951686486CFC90CB5B06CD9324770ED5DEEA1BD0700EE5BB7 + 6EADC28C28930018884D0662F3C6B4CB41438946FD8CC8D8AED559DB449BF5B4 + 19EB4C85B32CFC8EE583DA2513748E169CEF69C1799C83151B77EFDE5D02B62D + 0A6CA7A2E359E05FDDCE9D3BF3917D140F1B9AA8D8FFB981D692695306A08830 + 9024F5CC9625A16B18F0C68D1B0EA0740813A045D137F49999998DBB76ED3A83 + BDCDF84E55B09902CF7B60C4A6A304716812161E1E596F06270866CB9B47290D + 9036F934F750B8BCD8B4983999D1663F4B0386F5AB57AF6EDCB367CF193C3353 + 27B21503B91B28C97FFCF87118501B891474DAC1886D24633BB366B723287A9F + 83874D888078252424C80E78F5EA55392F2223232540CE06960525D267646434 + ECDBB7AF989D9EFB8CAC5515D4C403F37A2D50FA81CE61506887265428DB93F5 + C26727646CE50998070A7C27013133829A366D9A6CD30CC4332467072F88D811 + 1CBDA061FFFEFD67008AECCA193332E6559E6275EC6CE858060432F3A48BA03A + 58D2EFC1830701D82014E50984727D10C000AFEB780EE0042418BE0FAB4ACA79 + B375633F69CD9E9E1E47703A8DA522F5D48FE33C4011E2B6B08990465EA4EFE4 + C993926ADED84887DAFBA2A1040250084416047AFD41B72B6E15949BA1111B75 + 42116AC157AE5CD978E0C0817F189CCF493D018C7B26D484436A78D064532220 + EDD8C5EFB89093EEE8D1A34EE8E9DE388E07C00161B06F02FABE1B32B340C45C + EFC2E0CC1CFB99B98EDA19E7E7D9C40712ADD1703119E1E184E0481FE705070D + 7E1D89356BD6506CA1105826EAEE0F6728A0BD096A2F0178338332F309AEEFFF + 713A7A6CB36CEC0F04081719D0F902A1091B5CD5CE2636EA37E01701FCF0CFF3 + CF31F16C38E20E4656BE618DFA2FD3308F8CBFBD23FB0000000049454E44AE42 + 6082} + end + object lblG940Throttle: TLabel + Left = 42 + Top = 4 + Width = 114 + Height = 19 + Caption = 'G940 Throttle' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object lblG940ThrottleState: TLabel + Left = 42 + Top = 23 + Width = 59 + Height = 13 + Caption = 'Searching...' + end end end end diff --git a/G940LEDControl/Forms/MainFrm.pas b/G940LEDControl/Forms/MainFrm.pas index 18f78fe..92b669b 100644 --- a/G940LEDControl/Forms/MainFrm.pas +++ b/G940LEDControl/Forms/MainFrm.pas @@ -1,5 +1,7 @@ unit MainFrm; +// #ToDo1 -oMvR: 3-3-2013: trigger profile update when Save As only changes the name + interface uses System.Classes, @@ -19,12 +21,11 @@ uses pngimage, X2UtPersistIntf, - ButtonAssignmentFrm, FSXSimConnectIntf, LEDStateConsumer, Profile, ProfileManager, - Settings, VirtualTrees, Vcl.ImgList, Vcl.ActnList, Vcl.ToolWin, Vcl.Menus; + Settings; const @@ -44,6 +45,13 @@ const type + TLEDControls = record + ConfigureButton: TButton; + CategoryLabel: TLabel; + FunctionLabel: TLabel; + end; + + TMainForm = class(TForm, IProfileObserver) imgStateNotFound: TImage; lblG940Throttle: TLabel; @@ -64,6 +72,35 @@ type btnCheckUpdates: TButton; lblProxy: TLabel; tsButtons: TTabSheet; + btnP1: TButton; + lblP1Function: TLabel; + lblP1Category: TLabel; + btnP2: TButton; + lblP2Function: TLabel; + lblP2Category: TLabel; + btnP3: TButton; + lblP3Function: TLabel; + lblP3Category: TLabel; + btnP4: TButton; + lblP4Function: TLabel; + lblP4Category: TLabel; + btnP5: TButton; + lblP5Function: TLabel; + lblP5Category: TLabel; + btnP6: TButton; + lblP6Function: TLabel; + lblP6Category: TLabel; + btnP7: TButton; + lblP7Function: TLabel; + lblP7Category: TLabel; + btnP8: TButton; + lblP8Function: TLabel; + lblP8Category: TLabel; + lblProfile: TLabel; + cmbProfiles: TComboBox; + btnSaveProfile: TButton; + btnDeleteProfile: TButton; + bvlProfiles: TBevel; pnlFSX: TPanel; imgFSXStateNotConnected: TImage; imgFSXStateConnected: TImage; @@ -75,44 +112,11 @@ type cbProfileMenuCascaded: TCheckBox; lblProfileSwitching: TLabel; bvlProfileSwitching: TBevel; - TrayIcon: TTrayIcon; - bafP1: TButtonAssignmentFrame; - bafP2: TButtonAssignmentFrame; - bafP3: TButtonAssignmentFrame; - bafP4: TButtonAssignmentFrame; - bafP5: TButtonAssignmentFrame; - bafP6: TButtonAssignmentFrame; - bafP7: TButtonAssignmentFrame; - bafP8: TButtonAssignmentFrame; - vstProfile: TVirtualStringTree; - pnlProfiles: TPanel; - tbProfiles: TToolBar; - tbNewProfile: TToolButton; - tbSaveProfile: TToolButton; - ActionList: TActionList; - actNewProfile: TAction; - actSaveProfile: TAction; - actRevertProfile: TAction; - tbRevertProfile: TToolButton; - ImageList: TImageList; - tbDeleteProfile: TToolButton; - actDeleteProfile: TAction; - ToolButton1: TToolButton; - tbSetActiveProfile: TToolButton; - actSetActiveProfile: TAction; - pmnProfiles: TPopupMenu; - pmnProfilesNew: TMenuItem; - pmnProfilesSave: TMenuItem; - pmnProfilesRevert: TMenuItem; - pmnProfilesDelete: TMenuItem; - pmnProfilesSetActive: TMenuItem; - pmnProfilesSep1: TMenuItem; - tbRenameProfile: TToolButton; - actRenameProfile: TAction; procedure FormCreate(Sender: TObject); procedure lblLinkLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType); procedure btnCheckUpdatesClick(Sender: TObject); + procedure LEDButtonClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure cmbProfilesClick(Sender: TObject); procedure cbCheckUpdatesClick(Sender: TObject); @@ -120,14 +124,8 @@ type procedure btnDeleteProfileClick(Sender: TObject); procedure cbProfileMenuClick(Sender: TObject); procedure cbProfileMenuCascadedClick(Sender: TObject); - procedure actNewProfileExecute(Sender: TObject); - procedure actSaveProfileExecute(Sender: TObject); - procedure actRevertProfileExecute(Sender: TObject); - procedure actSetActiveProfileExecute(Sender: TObject); - procedure actDeleteProfileExecute(Sender: TObject); - procedure actRenameProfileExecute(Sender: TObject); private - FLEDControls: array[0..LED_COUNT - 1] of TButtonAssignmentFrame; + FLEDControls: array[0..LED_COUNT - 1] of TLEDControls; FEventMonitor: TOmniEventMonitor; FProfilesFilename: string; @@ -182,8 +180,6 @@ type procedure HandleDeviceStateMessage(AMessage: TOmniMessage); procedure HandleFSXStateMessage(AMessage: TOmniMessage); - procedure LEDConfigurationClick(Sender: TObject); - procedure CMAskAutoUpdate(var Msg: TMessage); message CM_ASKAUTOUPDATE; property EventMonitor: TOmniEventMonitor read FEventMonitor; @@ -291,7 +287,7 @@ begin worker := TFSXStateMonitorWorker.Create; EventMonitor.Monitor(CreateTask(worker)).Run; - Profiles.Attach(Self); + TProfileManager.Attach(Self); FindLEDControls; @@ -310,7 +306,7 @@ begin FinalizeProfileMenu; UnregisterDeviceArrival; - Profiles.Detach(Self); + TProfileManager.Detach(Self); end; @@ -382,7 +378,7 @@ var profile: TProfile; begin - profile := Profiles.ActiveProfile; + profile := TProfileManager.Instance.ActiveProfile; if Settings.ActiveProfile <> profile.Name then begin @@ -390,13 +386,12 @@ begin SaveSettings; end; - // #ToDo1 -oMvR: 21-4-2013: invalidate profile node -// FLockChangeProfile := True; -// try -// cmbProfiles.ItemIndex := cmbProfiles.Items.IndexOfObject(profile); -// finally -// FLockChangeProfile := False; -// end; + FLockChangeProfile := True; + try + cmbProfiles.ItemIndex := cmbProfiles.Items.IndexOfObject(profile); + finally + FLockChangeProfile := False; + end; LoadActiveProfile; end; @@ -416,17 +411,20 @@ procedure TMainForm.FindLEDControls; var ledIndex: Integer; ledNumber: string; - buttonFrame: TButtonAssignmentFrame; begin for ledIndex := 0 to Pred(LED_COUNT) do begin ledNumber := IntToStr(Succ(ledIndex)); - buttonFrame := (ComponentByName('bafP' + ledNumber, ledIndex) as TButtonAssignmentFrame); - buttonFrame.OnConfigurationClick := LEDConfigurationClick; + FLEDControls[ledIndex].ConfigureButton := (ComponentByName('btnP' + ledNumber, ledIndex) as TButton); + FLEDControls[ledIndex].CategoryLabel := (ComponentByName('lblP' + ledNumber + 'Category', ledIndex) as TLabel); + FLEDControls[ledIndex].FunctionLabel := (ComponentByName('lblP' + ledNumber + 'Function', ledIndex) as TLabel); - FLEDControls[ledIndex] := buttonFrame; + FLEDControls[ledIndex].ConfigureButton.OnClick := LEDButtonClick; + FLEDControls[ledIndex].CategoryLabel.Caption := ''; + FLEDControls[ledIndex].CategoryLabel.Font.Color := clGrayText; + FLEDControls[ledIndex].FunctionLabel.Caption := ''; end; end; @@ -456,43 +454,43 @@ begin begin Debug.Log('UI: Succesfully converted 0.x profile'); defaultProfile.Name := DefaultProfileName; + defaultProfile.IsTemporary := True; end; if Assigned(defaultProfile) then - Profiles.Add(defaultProfile); + TProfileManager.Add(defaultProfile); end else begin persistXML := TX2UtPersistXML.Create; try persistXML.FileName := FProfilesFilename; - Profiles.Load(persistXML.CreateReader); + TProfileManager.Load(persistXML.CreateReader); finally FreeAndNil(persistXML); end; end; { Make sure we always have a profile } - if Profiles.Count = 0 then + if TProfileManager.Instance.Count = 0 then begin Debug.Log('UI: No profiles found, creating default profile'); - Profiles.Add(CreateDefaultProfile); + TProfileManager.Add(CreateDefaultProfile); end; - // #ToDo1 -oMvR: 21-4-2013: load tree -// FLockChangeProfile := True; -// try -// cmbProfiles.Items.BeginUpdate; -// try -// cmbProfiles.Items.Clear; -// -// for profile in TProfileManager.Instance do -// cmbProfiles.Items.AddObject(profile.Name, profile); -// finally -// cmbProfiles.Items.EndUpdate; -// end; -// finally -// FLockChangeProfile := False; -// end; + FLockChangeProfile := True; + try + cmbProfiles.Items.BeginUpdate; + try + cmbProfiles.Items.Clear; + + for profile in TProfileManager.Instance do + cmbProfiles.Items.AddObject(profile.Name, profile); + finally + cmbProfiles.Items.EndUpdate; + end; + finally + FLockChangeProfile := False; + end; finally Debug.UnIndent; end; @@ -509,7 +507,7 @@ begin persistXML := TX2UtPersistXML.Create; try persistXML.FileName := FProfilesFilename; - Profiles.Save(persistXML.CreateWriter); + TProfileManager.Instance.Save(persistXML.CreateWriter); finally FreeAndNil(persistXML); end; @@ -554,22 +552,13 @@ begin { Default profile } profile := nil; if Length(Settings.ActiveProfile) > 0 then - begin - { Version 0.2 used the profile name, not a UID } - if Settings.ActiveProfile[1] <> '{' then - begin - profile := Profiles.FindByName(Settings.ActiveProfile); - if Assigned(profile) then - Settings.ActiveProfile := profile.UID; - end else - profile := Profiles.FindByUID(Settings.ActiveProfile); - end; + profile := TProfileManager.Instance.Find(Settings.ActiveProfile); { LoadProfiles ensures there's always at least 1 profile } - if (not Assigned(profile)) and (Profiles.Count > 0) then - profile := Profiles[0]; + if (not Assigned(profile)) and (TProfileManager.Instance.Count > 0) then + profile := TProfileManager.Instance[0]; - Profiles.ActiveProfile := profile; + TProfileManager.Instance.ActiveProfile := profile; { Auto-update } cbCheckUpdates.Checked := Settings.CheckUpdates; @@ -612,7 +601,7 @@ begin { Default button functions are assigned during UpdateButton } Result := TProfile.Create; Result.Name := DefaultProfileName; -// Result.IsTemporary := True; + Result.IsTemporary := True; end; @@ -622,8 +611,7 @@ var buttonIndex: Integer; begin - // #ToDo1 -oMvR: 21-4-2013: change to LoadSelectedProfile - activeProfile := Profiles.ActiveProfile; + activeProfile := TProfileManager.Instance.ActiveProfile; if not Assigned(activeProfile) then exit; @@ -664,52 +652,16 @@ begin if Assigned(buttonFunction) then begin - FLEDControls[AButtonIndex].CategoryName := buttonFunction.GetCategoryName; - FLEDControls[AButtonIndex].FunctionName := buttonFunction.GetDisplayName; + FLEDControls[AButtonIndex].CategoryLabel.Caption := buttonFunction.GetCategoryName; + FLEDControls[AButtonIndex].FunctionLabel.Caption := buttonFunction.GetDisplayName; end; end; -procedure TMainForm.actDeleteProfileExecute(Sender: TObject); -begin -// -end; - - -procedure TMainForm.actNewProfileExecute(Sender: TObject); -begin - // -end; - - -procedure TMainForm.actRenameProfileExecute(Sender: TObject); -begin - // -end; - - -procedure TMainForm.actRevertProfileExecute(Sender: TObject); -begin - // -end; - - -procedure TMainForm.actSaveProfileExecute(Sender: TObject); -begin - // -end; - - -procedure TMainForm.actSetActiveProfileExecute(Sender: TObject); -begin - // -end; - - procedure TMainForm.AddProfile(AProfile: TProfile); begin -// cmbProfiles.Items.AddObject(AProfile.Name, AProfile); - Profiles.Add(AProfile, True); + cmbProfiles.Items.AddObject(AProfile.Name, AProfile); + TProfileManager.Instance.Add(AProfile, True); end; @@ -719,18 +671,18 @@ var oldItemIndex: Integer; begin -// itemIndex := cmbProfiles.Items.IndexOfObject(AProfile); -// if itemIndex > -1 then -// begin -// oldItemIndex := cmbProfiles.ItemIndex; -// FLockChangeProfile := True; -// try -// cmbProfiles.Items[itemIndex] := AProfile.Name; -// cmbProfiles.ItemIndex := oldItemIndex; -// finally -// FLockChangeProfile := False; -// end; -// end; + itemIndex := cmbProfiles.Items.IndexOfObject(AProfile); + if itemIndex > -1 then + begin + oldItemIndex := cmbProfiles.ItemIndex; + FLockChangeProfile := True; + try + cmbProfiles.Items[itemIndex] := AProfile.Name; + cmbProfiles.ItemIndex := oldItemIndex; + finally + FLockChangeProfile := False; + end; + end; end; @@ -739,39 +691,39 @@ var itemIndex: Integer; begin -// itemIndex := cmbProfiles.Items.IndexOfObject(AProfile); -// if itemIndex > -1 then -// begin -// TProfileManager.Remove(AProfile); -// cmbProfiles.Items.Delete(itemIndex); -// -// if TProfileManager.Instance.Count = 0 then -// AddProfile(CreateDefaultProfile); -// -// if ASetActiveProfile then -// begin -// if itemIndex >= TProfileManager.Instance.Count then -// itemIndex := Pred(TProfileManager.Instance.Count); -// -// FLockChangeProfile := True; -// try -// cmbProfiles.ItemIndex := itemIndex; -// TProfileManager.Instance.ActiveProfile := TProfile(cmbProfiles.Items.Objects[itemIndex]); -// finally -// FLockChangeProfile := False; -// end; -// end; -// end; + itemIndex := cmbProfiles.Items.IndexOfObject(AProfile); + if itemIndex > -1 then + begin + TProfileManager.Remove(AProfile); + cmbProfiles.Items.Delete(itemIndex); + + if TProfileManager.Instance.Count = 0 then + AddProfile(CreateDefaultProfile); + + if ASetActiveProfile then + begin + if itemIndex >= TProfileManager.Instance.Count then + itemIndex := Pred(TProfileManager.Instance.Count); + + FLockChangeProfile := True; + try + cmbProfiles.ItemIndex := itemIndex; + TProfileManager.Instance.ActiveProfile := TProfile(cmbProfiles.Items.Objects[itemIndex]); + finally + FLockChangeProfile := False; + end; + end; + end; end; procedure TMainForm.cmbProfilesClick(Sender: TObject); begin -// if not FLockChangeProfile then -// begin -// if cmbProfiles.ItemIndex > -1 then -// TProfileManager.Instance.ActiveProfile := TProfile(cmbProfiles.Items.Objects[cmbProfiles.ItemIndex]); -// end; + if not FLockChangeProfile then + begin + if cmbProfiles.ItemIndex > -1 then + TProfileManager.Instance.ActiveProfile := TProfile(cmbProfiles.Items.Objects[cmbProfiles.ItemIndex]); + end; end; @@ -834,7 +786,7 @@ begin end; -procedure TMainForm.LEDConfigurationClick(Sender: TObject); +procedure TMainForm.LEDButtonClick(Sender: TObject); function GetUniqueProfileName(const AName: string): string; var @@ -844,15 +796,14 @@ procedure TMainForm.LEDConfigurationClick(Sender: TObject); Result := AName; counter := 0; -// while Assigned(Profiles.Find(Result)) do -// begin -// Inc(counter); -// Result := Format('%s (%d)', [AName, counter]); -// end; + while Assigned(TProfileManager.Find(Result)) do + begin + Inc(counter); + Result := Format('%s (%d)', [AName, counter]); + end; end; - // #ToDo1 -oMvR: 6-5-2013: new style! var activeProfile: TProfile; buttonIndex: NativeInt; @@ -860,25 +811,25 @@ var newProfile: Boolean; begin - activeProfile := Profiles.ActiveProfile; + activeProfile := TProfileManager.Instance.ActiveProfile; if not Assigned(activeProfile) then exit; { Behaviour similar to the Windows System Sounds control panel; when a change occurs, create a temporary profile "(modified)" so the original profile can still be selected } -// if not activeProfile.IsTemporary then -// begin -// profile := TProfile.Create; -// profile.Assign(activeProfile); -// profile.Name := GetUniqueProfileName(profile.Name + ProfilePostfixModified); -// profile.IsTemporary := True; -// newProfile := True; -// end else -// begin + if not activeProfile.IsTemporary then + begin + profile := TProfile.Create; + profile.Assign(activeProfile); + profile.Name := GetUniqueProfileName(profile.Name + ProfilePostfixModified); + profile.IsTemporary := True; + newProfile := True; + end else + begin profile := activeProfile; newProfile := False; -// end; + end; buttonIndex := (Sender as TComponent).Tag; if TButtonFunctionForm.Execute(profile, buttonIndex) then @@ -1004,13 +955,13 @@ var begin name := ''; - profile := Profiles.ActiveProfile; + profile := TProfileManager.Instance.ActiveProfile; existingProfile := nil; repeat if InputQuery('Save profile as', 'Save this profile as:', name) then begin - existingProfile := Profiles.FindByName(name); + existingProfile := TProfileManager.Find(name); if existingProfile = profile then existingProfile := nil; @@ -1035,24 +986,24 @@ begin existingProfile.Assign(profile); existingProfile.Name := name; UpdateProfile(existingProfile); - Profiles.ActiveProfile := existingProfile; + TProfileManager.Instance.ActiveProfile := existingProfile; -// if profile.IsTemporary then -// DeleteProfile(profile, False); + if profile.IsTemporary then + DeleteProfile(profile, False); end else begin -// if profile.IsTemporary then -// begin -// profile.Name := name; -// profile.IsTemporary := False; -// UpdateProfile(profile); -// end else -// begin + if profile.IsTemporary then + begin + profile.Name := name; + profile.IsTemporary := False; + UpdateProfile(profile); + end else + begin newProfile := TProfile.Create; newProfile.Assign(profile); newProfile.Name := name; AddProfile(newProfile); -// end; + end; end; SaveProfiles; @@ -1064,7 +1015,7 @@ var activeProfile: TProfile; begin - activeProfile := Profiles.ActiveProfile; + activeProfile := TProfileManager.Instance.ActiveProfile; if Assigned(activeProfile) then begin if MessageBox(Self.Handle, PChar(Format('Do you want to remove the profile named "%s"?', [activeProfile.Name])), diff --git a/G940LEDControl/G940LEDControl.dpr b/G940LEDControl/G940LEDControl.dpr index fb776b5..6b70f6e 100644 --- a/G940LEDControl/G940LEDControl.dpr +++ b/G940LEDControl/G940LEDControl.dpr @@ -1,8 +1,8 @@ program G940LEDControl; uses - System.SysUtils, - Vcl.Forms, + Forms, + SysUtils, MainFrm in 'Forms\MainFrm.pas' {MainForm}, LogiJoystickDLL in '..\Shared\LogiJoystickDLL.pas', SimConnect in '..\Shared\SimConnect.pas', @@ -36,8 +36,7 @@ uses FSXLEDFunctionProviderIntf in 'Units\FSXLEDFunctionProviderIntf.pas', GxDbugIntf in 'Units\GxDbugIntf.pas', DebugLog in 'Units\DebugLog.pas', - DebugLogGExperts in 'Units\DebugLogGExperts.pas', - ButtonAssignmentFrm in 'Forms\ButtonAssignmentFrm.pas' {ButtonAssignmentFrame: TFrame}; + DebugLogGExperts in 'Units\DebugLogGExperts.pas'; {$R *.res} diff --git a/G940LEDControl/G940LEDControl.dproj b/G940LEDControl/G940LEDControl.dproj index 79d86d8..c318d2e 100644 --- a/G940LEDControl/G940LEDControl.dproj +++ b/G940LEDControl/G940LEDControl.dproj @@ -8,7 +8,7 @@ VCL 13.4 True - Debug + Release Win32 1 Application @@ -148,11 +148,6 @@ - -
ButtonAssignmentFrame
- dfm - TFrame -
Cfg_2 Base diff --git a/G940LEDControl/G940LEDControl.res b/G940LEDControl/G940LEDControl.res index d98ff0a8e18f4a9808bfeee4072191112fccef14..906ddee2cba7b0ebdff29348afd88ed20b99346a 100644 GIT binary patch delta 921 zcmaKqJ#5oJ6vzKAL28RC@geq;%T%ExrKO0$pwJIURketqs2j4()w$Z(k?n+!#Uo-v z^3t7&5q4GvW(Fn}U_*kDiSoZoPE8Qvtb6y~<-Om%kNo`PeE;mc6y?zjAOIX6pXGL_ z0Zq)+j6!iVvr5@T2M;JWagSOXd)TGjrre^g*Sp$}-++$S`}Ft(Zc@`r14ndY8u80P z$;%E3WKc*D5~mPD5}n`xDcwFY%3(^Y+}F*yNgY_j8Q!nc=Mnnw>Hn1J__U;f@8d1W zDJcaW^FABjZ{r-}>^tQKuX6+@fj(UoLlOhH&FA!^0z0gGgQtEhG0CP(Qm-avCtzK& zGSW^M%c#?*j;rPb?%+KAcjy-~r5Niak$q;a>krW*9C*#At}twwpTNKC*u@2c_Qr9# zcN%A_($=UCwun&)(*@L-M)`z7uUn=qcL_}K5Ce9km};j5{jVFBIb{dajK6y_>Im3R zJ=U&gCS&tHnL2RE{AKPlAwAoi)%jE7nX7%Ry%9a-e5hWi{pyQ)H7mxedVaXHXpN!F za+M~YyH;=N&s~_eKUMD!7q3|(_LFenhthMGCS3Yi8pu3PvsM=LR3U?6kQtZiV$`U% zq7`SQdKPs&OA#WLLm7LnpSP1?8p&(|Cd5Fs0?qT>13%8C+qj{#slG+qrxxZ>HR9GE D_Ufd< delta 147 zcmaEJkMY9|#t90WZ!l$KGPX~4%!!yhJ!dH+=VX^$Em6+0)S}|d{5)GFGd%+kRO030 zoIEjCS%)(xF)zI|F+J5*Ned)cP?VpXT3no8#n-+a+ z`XgGo%F+fCqo6<|vt3Y-L`Yf-LkKKLQnA~8M~i~C?Yu9~dCqyxz30NYF9#Cjr`IFx zK6-b95pYRJ39E#r$5+A@{r0!xJ?Sy@2V!KHVi@yANimvA^nBr=Aoj?msdBIElq|Ac{o zJ6yc@fWE$m3=K^%IQWQE!!#-RPsy>&V6@GWYk!8>IYY8*j%3dqX`XqEuGi?w=FykG z!r+}Fr{W!!ek2(u44@Uz!dq8DZGg}BFIw&mL@@QXbF$9L}k+l z98GK3nm4hx2pnewht3LI?ShhX0`K{C%6bGxCA_@?fBy!R{eqL11U`xS`WMs=3WArV ze?`!IWu4aR8=Sr>XuT=uza{>7s2z8w1OKN3Lj3DLOHDGxugfvSDf?8&ohrTTLf7tW z$>~ZsE8z3($&-RdRg~I<;$Wc0=aX~B;^}Bn)o>^j2vj9$6%HPXwyCNT3ZKx* zXiMLq2`9FPk`#_b+gjA>UunuaJEBolb(`b6WxA`Q%@$P^`&OLW)!kWuGpg3^jSEM5 zE;Lxd(V~=PX~MZkcZJ4>Rj*EC$c)?kj5z&mv=+?1gc~>Dnw*DI5?2!?%i1gQ_;-mF T&6ik^dlsf)aS=9_Ks);rN^Q0Y diff --git a/G940LEDControl/Resources/Icons/NewProfile.ico b/G940LEDControl/Resources/Icons/NewProfile.ico deleted file mode 100644 index 2896fe3912757db9107a0920c2cd595c0e198014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{T}V@57{`Am;%1TS%f47CecAVym}pFv3>iUP6huU11olCa-K3di*hLyN@**ZJ z4U=XvL(IC0V0Y0)f!!5d*g{y~mNS?0?6{}*oQVisbs6}7dCqx%&-*{`dCvpqfebZl zHq_O^g)GPe3RS2S`6`UOsf_e(c0R+tx@x@F&(q#;kw=Y}@HJlM@y!~ZHeI3nb}c>4 zwe+>r(R;U^Kx+g2o+bu7w;1BUgor8^YOZLTR&5|KKAhy;0nq!f~%~+9y=s z7mjubX9g9&68Iq4M}&i;!ik7*N=4N-p(Z4pO9+9^c3%3P(9zb9r{xU~?+xPb=%p|4 zn&2}p!ROuFX-m=SOVOkDeDO9#S1^TN?du;B;-SwZB42nnG|l@@(~O0Onff`577L+` zkD&buqfPuki;trJj`BS$M50Ob$uaaq41Fq2Y&=P9LL(keGO5m_B{cM8f|Rb!DdhZg zz5@Se1w_<;_?NO~m8p7(>K;Au5aEnd9YSl_y4^^&4PB9=6=Ysa?2Ejx2^tmdlWm@A_MLG>N~6zUwo ITri&f19Iu)I{*Lx diff --git a/G940LEDControl/Resources/Icons/RenameProfile.ico b/G940LEDControl/Resources/Icons/RenameProfile.ico deleted file mode 100644 index 93dfa42bac45780693f59079eb848ad5c44ba430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{ZAcS97{~t>lD+zZ3B9_?LT$w=N2}CowJc#0W?EXXNtjBeews<5Wwb?NrIN2D z>P#iY#5uK5s7u3Au_(1|&JqhJrX{`TG_SiABGHFF^wH<|-`($d?m6zBg9EH+v$F&3 zZ4hn^I00~_qAqZ#nBQVnzlNFlZ;pL5I-0}-o=hENxQqXroQ-zA_ZDF!8%V^FS;p-di!``6-8nVN_PsR?lA zqj=stR&YU0R5mG9?TTi=eA3rX!W6 z3@wk;XxFHb_ap;3jY?#9mY}%#9%>D0+!`%M#ZW!8?e)+%snFY01HD#*lx!nPH63WI z?}Ywo6AaA_Ft%!8eAa@#_UGv9XoIn{6@y)E80u-mhwfJx*1v@5&1($xcEi-GgMOe3 zFUAcR?C-&d$%yffI!uhd#rIDGFn{icdF(yRUrd-9AH$Ey2~19zG0ikRJ?pXNrgIhe z{}mvF{AE+?S;oTih*TO95+aqHJ~f~50wNOecZhZg1QH875K)ko`vL!*0tx+lfaOFS zba?5KWdQ=Ig`J4+G4D<57jO5UVetujSNlbtp_Vw89)p}*=W4fb-!_)NnfUpM1B4qk z+S=@9Y>5-H-^FXs>RC+o61O!gse{MzNhlHfaGY1nFd^I{Yge)LJRX;tqoV_#(Vxaj T&_M6;Pon>20~1?s3$Wau-{2j3 diff --git a/G940LEDControl/Resources/Icons/RevertProfile.ico b/G940LEDControl/Resources/Icons/RevertProfile.ico deleted file mode 100644 index e7573837720055713a07ee3a350ec275e566f84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{T`bjc7{@=7(hFf!Qpr2XYe+-cTY_?l#E+R|;fo8m&tAv>NO_25pLKld_y(dK!h&Gw`HY$$^n zCg{?vc$s0&Sgr*h@=TdLY0ktMD|(K*(wS{fZ>}TVC!859bYrN%j?UA8G~_6Fnje8C zJDT?5Acl*a87*~Uyv&_3wFkrHUW`_G(pl_HzdDdt72A1J>Bo4LKOx^7(cG;(??|MaShV#N%{?_83#G`H1HQi1tE+PTIO6 zL{AA*x>Ce|8qr;e=&M4!sOC#=jkGTy`fK<$a1Akdl^?HfAcmwq(uf$lFL{J`CwZ?$ zeC(QYA@k;Z2mWsdgb@Gm!4P|gz`0>=2ls`p5B{ULtMQ zNXgWgq`gh5cp^TTmHJkSnp~uyg diff --git a/G940LEDControl/Resources/Icons/SaveProfile.ico b/G940LEDControl/Resources/Icons/SaveProfile.ico deleted file mode 100644 index 749f6f2b5036f08bd569f5e9b57455855c1279e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{T}<0m7>6IwZB#8*Mj(W+GT0WJvN$Jx#IGR(Hqp)Lh~2RJpbmjFgn1EEK}Ho6-?(EgYKr$i2v&JMz6f`!r#g7ob$Zr zeQ(}3IS?i+i3DMfK)C>7fE2+(h(y7m`0on)CTVCSrEr5g%nH9Qmlo^oK_}tT)m9;qBXRspTxB#9G5H{_s&K1=PzVn zcLeVINIV51JW3Hm$~!ox7SmrS!Be!DK~)TWB};It6Y%bp;(arb5nU2q&2n7o6hx#- z-f%yY#x!~=)9I|)PFKxVoOLpe)Tpu66w}eDqTTowUw`lvXUru`*tE>pityP>xbAoZ zbG;tZ`}?sp)pFciOZ&lUy3Be`9Nfpr!v;DJ8R$7wi{o$|ou3%!vb;x|^BiIi4!w@kxST!ox|}%Acyaf-__EKefj-U-4Kh6B!8?4G z!NFn9d50Mt@iI0#!ua`7#xH!u_{ED%PJF}I#4O{NeO$US!{u+MxpH-uOVihwoVm`_ z)D$zmtN46Arf2;4zWbgj{}0Sw3*h(r2?PT80zWYuxPd<~$Lxc?gF%Ax z^ZY9KfBiQ*F#nIUc{J*g!dLcalm+2Y3G3jAxU`MW+`GkOs!rVS;_YzHgZFJpk9?u( z!=~8m+z?CSpUV{GsH;pjIX*r^RkT&MZTF%j&kOH&$HYh?BU4gWtxC&YFYwCfrAbMT zhqU(TY=KimI}S7odiU+hytF7GKSJK5D^{sWHTstx2-Po;n~V(&_4=Cnyfp%^xOJDQ z;?>g9QceAiKiSk^Y|!tkQ>+%l@~~Ydy;iHy>Wqqo(eP|?iLSg{Tee44ym?v1-v$wC OflK%YEB}Qq}E{7{@=RvdPlvW?DIpI=AWEoRwv1WMM{Dc2Sp=O`Bcpre#@Zmq`)Eva%Z% zmR+dGOGUk?7gD6rg_7P>FOo_qq9Bn7x=XZvXNvTqpg+Lh;kkX!b34yD=K&va1qUOz zl2!f?2E+*x5K)3;+ON~?onvE(nn^c6B1!5|Nl(mpr0?{ro zZ-+4(A$bGDZZ=}9G-7g@FmH*)zgmIP4eI^iU!x?bR*9w>B6fpT;M#qna-E=hK_^A= zQwlg8fOfBzVeT;e&WJwG2BK;TN7)=9WF*oNJ|>! zaRjvJQ8!1Sx@02!oRN@=20|{2n3hDsuG)~UB%!;Wis5_$Q7!Qpni8>GOCzFn3XwOa z5!ITGUdZU1(@ANY%fwsrn9yb?za}5Y0SAtQ4xGoFIP0A(ZCHw_eGajAaxverW4@b* z_1+?qZ`-jwEMj!WGNwK#Cii{`c^&0sJ>9~hr&Sa@*-l}no2`$kDeBxq#mhP>UmRuI zi+Z+poxs)AK*g&DYTMkjJZxm=n+xoE+ek;xGakQw%<~Ujy!`Z@o_F1R`S6+E?jL;p z_=TTed+~hp;OQ0g%j12ugKTgD|1$xP=O5oorbeMqXAY$B4GkTs3RDj12edI#j3nv& z0{Yg6-WZd!wn)-R!vkcGnUhRu>&wcEA|;(lDRNjcCY6+ym3x68wOC9UE7q+}S>pwU zivQo5KX&=J$w@LGjS#l2Fne~tAeGBO0R@(S#BFHp8Be1<3xzjC47J|{gj)-lf4 z+tI}0#j-siN#1+%iC?fRe}2w*eV-+GmTgp=ZPtMKry`Hwdn9}mt-TWE+eOYD;=%q# N@;%u{_LXDg*xw|C#B%@u diff --git a/G940LEDControl/Units/FSXSimConnectClient.pas b/G940LEDControl/Units/FSXSimConnectClient.pas index 0bf5e99..0299f1c 100644 --- a/G940LEDControl/Units/FSXSimConnectClient.pas +++ b/G940LEDControl/Units/FSXSimConnectClient.pas @@ -118,7 +118,6 @@ type FProfileMenu: Boolean; FProfileMenuCascaded: Boolean; - // #ToDo1 -oMvR: 6-5-2013: change to object list FMenuProfiles: TStringList; FMenuWasCascaded: Boolean; protected @@ -312,9 +311,9 @@ begin if AEnabled <> FObservingProfileManager then begin if AEnabled then - Profiles.Attach(Self) + TProfileManager.Attach(Self) else - Profiles.Detach(Self); + TProfileManager.Detach(Self); FObservingProfileManager := AEnabled; end; @@ -553,9 +552,9 @@ begin exit; profileName := FMenuProfiles[Pred(AEventID)]; - profile := Profiles.FindByUID(profileName); + profile := TProfileManager.Find(profileName); if Assigned(profile) then - Profiles.ActiveProfile := profile; + TProfileManager.Instance.ActiveProfile := profile; end; @@ -686,12 +685,8 @@ begin if ProfileMenu then begin - try - for profile in Profiles.LockList do - FMenuProfiles.Add(profile.Name); - finally - Profiles.UnlockList; - end; + for profile in TProfileManager.Instance do + FMenuProfiles.Add(profile.Name); FMenuProfiles.Sort; diff --git a/G940LEDControl/Units/Profile.pas b/G940LEDControl/Units/Profile.pas index 7fa01af..dfd588d 100644 --- a/G940LEDControl/Units/Profile.pas +++ b/G940LEDControl/Units/Profile.pas @@ -44,8 +44,8 @@ type TProfile = class(TPersistent) private - FUID: string; FName: string; + FIsTemporary: Boolean; FButtons: TProfileButtonList; function GetButton(Index: Integer): TProfileButton; @@ -61,8 +61,8 @@ type function HasButton(AIndex: Integer): Boolean; - property UID: string read FUID write FUID; property Name: string read FName write FName; + property IsTemporary: Boolean read FIsTemporary write FIsTemporary; property ButtonCount: Integer read GetButtonCount; property Buttons[Index: Integer]: TProfileButton read GetButton; @@ -71,7 +71,7 @@ type TProfileList = class(TObjectList) public -// function Find(const AName: string): TProfile; + function Find(const AName: string): TProfile; procedure Load(AReader: IX2PersistReader); procedure Save(AWriter: IX2PersistWriter); @@ -92,6 +92,7 @@ const KeyProviderUID = 'ProviderUID'; KeyFunctionUID = 'FunctionUID'; + KeyIsTemporary = 'IsTemporary'; { TProfileButton } @@ -231,8 +232,8 @@ begin begin sourceProfile := TProfile(Source); - FUID := sourceProfile.UID; FName := sourceProfile.Name; + FIsTemporary := sourceProfile.IsTemporary; FButtons.Clear; for buttonIndex := 0 to Pred(sourceProfile.ButtonCount) do @@ -250,8 +251,8 @@ var begin buttonIndex := 0; -// if not AReader.ReadBoolean(KeyIsTemporary, FIsTemporary) then -// FIsTemporary := False; + if not AReader.ReadBoolean(KeyIsTemporary, FIsTemporary) then + FIsTemporary := False; while AReader.BeginSection(SectionButton + IntToStr(buttonIndex)) do try @@ -276,7 +277,7 @@ var buttonIndex: Integer; begin -// AWriter.WriteBoolean(KeyIsTemporary, IsTemporary); + AWriter.WriteBoolean(KeyIsTemporary, IsTemporary); for buttonIndex := 0 to Pred(FButtons.Count) do begin @@ -329,7 +330,6 @@ end; { TProfileList } -{ function TProfileList.Find(const AName: string): TProfile; var profile: TProfile; @@ -344,7 +344,6 @@ begin break; end; end; -} procedure TProfileList.Load(AReader: IX2PersistReader); diff --git a/G940LEDControl/Units/ProfileManager.pas b/G940LEDControl/Units/ProfileManager.pas index 32f83ab..a0bc2e4 100644 --- a/G940LEDControl/Units/ProfileManager.pas +++ b/G940LEDControl/Units/ProfileManager.pas @@ -3,6 +3,7 @@ unit ProfileManager; interface uses System.Classes, + System.SyncObjs, Profile, X2UtPersistIntf; @@ -20,53 +21,57 @@ type TProfileManager = class; - ILockedProfileList = interface - ['{4F647762-AA70-4315-BB1C-E85E320F4E82}'] - function GetEnumerator: TProfileList.TEnumerator; + TProfileManagerEnumerator = class(TProfileList.TEnumerator) + private + FManager: TProfileManager; + public + constructor Create(AManager: TProfileManager); + destructor Destroy; override; end; - TProfileManager = class(TObject) private + FLock: TCriticalSection; + FProfiles: TProfileList; FObservers: TInterfaceList; - FProfileList: TProfileList; FActiveProfile: TProfile; + function GetActiveProfile: TProfile; function GetCount: Integer; function GetItem(Index: Integer): TProfile; procedure SetActiveProfile(const Value: TProfile); procedure SetItem(Index: Integer; const Value: TProfile); protected property Observers: TInterfaceList read FObservers; - property ProfileList: TProfileList read FProfileList; + property Profiles: TProfileList read FProfiles; public + class function Instance(): TProfileManager; + constructor Create; destructor Destroy; override; - procedure Add(AProfile: TProfile; ASetActive: Boolean = False); - function FindByName(const AName: string): TProfile; - function FindByUID(const AName: string): TProfile; - function Remove(const AProfile: TProfile): Integer; + procedure Lock; + procedure Unlock; - procedure Load(AReader: IX2PersistReader); - procedure Save(AWriter: IX2PersistWriter); + class procedure Add(AProfile: TProfile; ASetActive: Boolean = False); + class function Find(const AName: string): TProfile; + class function Remove(const AProfile: TProfile): Integer; - procedure Attach(AObserver: IProfileObserver); - procedure Detach(AObserver: IProfileObserver); + class procedure Load(AReader: IX2PersistReader); + class procedure Save(AWriter: IX2PersistWriter); - function LockList: ILockedProfileList; - procedure UnlockList; + class procedure Attach(AObserver: IProfileObserver); + class procedure Detach(AObserver: IProfileObserver); - property ActiveProfile: TProfile read FActiveProfile write SetActiveProfile; + function GetEnumerator: TProfileManagerEnumerator; + + property ActiveProfile: TProfile read GetActiveProfile write SetActiveProfile; property Count: Integer read GetCount; property Items[Index: Integer]: TProfile read GetItem write SetItem; default; end; - { Singleton } - function Profiles: TProfileManager; - implementation @@ -78,20 +83,8 @@ var ProfileManagerInstance: TProfileManager; - -type - TLockedProfileList = class(TInterfacedObject, ILockedProfileList) - private - FList: TProfileList; - public - constructor Create(AList: TProfileList); - - function GetEnumerator: TProfileList.TEnumerator; - end; - - - -function Profiles: TProfileManager; +{ TProfileManager } +class function TProfileManager.Instance: TProfileManager; begin if not Assigned(ProfileManagerInstance) then ProfileManagerInstance := TProfileManager.Create; @@ -100,130 +93,136 @@ begin end; -{ TProfileManager } constructor TProfileManager.Create; begin inherited Create; FObservers := TInterfaceList.Create; - FProfileList := TProfileList.Create(True); + FProfiles := TProfileList.Create(True); + FLock := TCriticalSection.Create; end; destructor TProfileManager.Destroy; begin - FreeAndNil(FProfileList); + FreeAndNil(FLock); + FreeAndNil(FProfiles); FreeAndNil(FObservers); inherited; end; -procedure TProfileManager.Add(AProfile: TProfile; ASetActive: Boolean); +procedure TProfileManager.Lock; +begin + +end; + + +procedure TProfileManager.Unlock; +begin + +end; + + +class procedure TProfileManager.Add(AProfile: TProfile; ASetActive: Boolean); var observer: IInterface; begin - TMonitor.Enter(ProfileList); + Instance.Lock; try - ProfileList.Add(AProfile); + Instance.Profiles.Add(AProfile); finally - TMonitor.Exit(ProfileList); + Instance.Unlock; end; - for observer in Observers do + for observer in Instance.Observers do (observer as IProfileObserver).ObserveAdd(AProfile); if ASetActive then - SetActiveProfile(AProfile); + Instance.SetActiveProfile(AProfile); end; -function TProfileManager.FindByName(const AName: string): TProfile; +class function TProfileManager.Find(const AName: string): TProfile; begin -// Result := Instance.ProfileList.Find(AName); + Result := Instance.Profiles.Find(AName); end; -function TProfileManager.FindByUID(const AName: string): TProfile; -begin - // -end; - - -function TProfileManager.Remove(const AProfile: TProfile): Integer; +class function TProfileManager.Remove(const AProfile: TProfile): Integer; var observer: IInterface; begin - TMonitor.Enter(ProfileList); + Instance.Lock; try - Result := ProfileList.Remove(AProfile); + Result := Instance.Profiles.Remove(AProfile); finally - TMonitor.Exit(ProfileList); + Instance.Unlock; end; - for observer in Observers do + for observer in Instance.Observers do (observer as IProfileObserver).ObserveRemove(AProfile); end; -procedure TProfileManager.Load(AReader: IX2PersistReader); +class procedure TProfileManager.Load(AReader: IX2PersistReader); begin - TMonitor.Enter(ProfileList); + Instance.Lock; try - ProfileList.Load(AReader); + Instance.Profiles.Load(AReader); finally - TMonitor.Exit(ProfileList); + Instance.Unlock; end; end; -procedure TProfileManager.Save(AWriter: IX2PersistWriter); +class procedure TProfileManager.Save(AWriter: IX2PersistWriter); begin - TMonitor.Enter(ProfileList); + Instance.Lock; try - ProfileList.Save(AWriter); + Instance.Profiles.Save(AWriter); finally - TMonitor.Exit(ProfileList); + Instance.Unlock; end; end; -procedure TProfileManager.Attach(AObserver: IProfileObserver); +class procedure TProfileManager.Attach(AObserver: IProfileObserver); begin - Observers.Add(AObserver as IProfileObserver); + Instance.Observers.Add(AObserver as IProfileObserver); end; -procedure TProfileManager.Detach(AObserver: IProfileObserver); +class procedure TProfileManager.Detach(AObserver: IProfileObserver); begin - Observers.Remove(AObserver as IProfileObserver); + Instance.Observers.Remove(AObserver as IProfileObserver); end; -function TProfileManager.LockList: ILockedProfileList; +function TProfileManager.GetActiveProfile: TProfile; begin - TMonitor.Enter(ProfileList); - Result := TLockedProfileList.Create(ProfileList); -end; - - -procedure TProfileManager.UnlockList; -begin - TMonitor.Exit(ProfileList); + Result := Instance.FActiveProfile; end; function TProfileManager.GetCount: Integer; begin - Result := ProfileList.Count; + Result := Instance.Profiles.Count; +end; + + +function TProfileManager.GetEnumerator: TProfileManagerEnumerator; +begin + Result := TProfileManagerEnumerator.Create(Self); end; function TProfileManager.GetItem(Index: Integer): TProfile; begin - Result := ProfileList[Index]; + Result := Profiles[Index]; end; @@ -243,24 +242,26 @@ end; procedure TProfileManager.SetItem(Index: Integer; const Value: TProfile); begin - ProfileList[Index] := Value; + Profiles[Index] := Value; end; -{ TLockedProfileList } -constructor TLockedProfileList.Create(AList: TProfileList); +{ TProfileManagerEnumerator } +constructor TProfileManagerEnumerator.Create(AManager: TProfileManager); begin - inherited Create; + inherited Create(AManager.Profiles); - FList := AList; + FManager := AManager; + FManager.Lock; end; -function TLockedProfileList.GetEnumerator: TProfileList.TEnumerator; +destructor TProfileManagerEnumerator.Destroy; begin - Result := FList.GetEnumerator; -end; + FManager.Unlock; + inherited; +end; initialization finalization