jvcllaz: Extend JvDBTreeViewDemo to show adding, editing and deleting of records

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8005 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2021-04-29 20:10:48 +00:00
parent f6f84585ff
commit ebe671bdf4
6 changed files with 515 additions and 370 deletions

View File

@ -24,7 +24,6 @@
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="0"/>
</RunParams>
<RequiredPackages Count="4">
<Item1>
@ -40,7 +39,7 @@
<PackageName Value="LCL"/>
</Item4>
</RequiredPackages>
<Units Count="2">
<Units Count="3">
<Unit0>
<Filename Value="JVDBTreeViewDemo.lpr"/>
<IsPartOfProject Value="True"/>
@ -48,22 +47,29 @@
<Unit1>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit1>
<Unit2>
<Filename Value="recordeditorfrm.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="RecordEditor"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="RecordEditorFrm"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="..\..\bin\$(TargetCPU)-$(TargetOS)\JvDBTreeViewDemo"/>
<Filename Value="../../bin/$(TargetCPU)-$(TargetOS)/JvDBTreeViewDemo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>

View File

@ -7,7 +7,7 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
LCLVersion, Forms, Main
LCLVersion, Forms, Main, RecordEditorFrm
{ you can add units after this };
{$R *.res}
@ -19,7 +19,7 @@ begin
{$ENDIF}
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,11 +1,11 @@
object Form1: TForm1
object MainForm: TMainForm
Left = 310
Height = 509
Top = 127
Width = 758
Width = 746
Caption = 'JvDBTreeViewDemo'
ClientHeight = 509
ClientWidth = 758
ClientWidth = 746
OnCreate = FormCreate
LCLVersion = '2.1.0.0'
object DBGrid1: TDBGrid
@ -16,7 +16,7 @@ object Form1: TForm1
Left = 0
Height = 486
Top = 0
Width = 378
Width = 371
Anchors = [akTop, akLeft, akRight, akBottom]
AutoFillColumns = True
Color = clWindow
@ -27,14 +27,15 @@ object Form1: TForm1
end
object JvDBTreeView1: TJvDBTreeView
AnchorSideLeft.Control = Bevel1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel1
Left = 378
Left = 375
Height = 453
Top = 0
Width = 380
Width = 371
DataSource = DataSource1
MasterField = 'ID'
DetailField = 'ParentID'
@ -49,22 +50,23 @@ object Form1: TForm1
ParentColor = False
TabOrder = 1
OnCustomDrawItem = JvDBTreeView1CustomDrawItem
OnEdited = JvDBTreeView1Edited
OnGetSelectedIndex = JvDBTreeView1GetSelectedIndex
end
object Bevel1: TBevel
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
Left = 378
Left = 371
Height = 50
Top = 149
Width = 2
Width = 4
Shape = bsSpacer
end
object StatusBar1: TStatusBar
Left = 0
Height = 23
Top = 486
Width = 758
Width = 746
Panels = <>
SimpleText = 'Icons provided by icons8.com'
end
@ -73,38 +75,37 @@ object Form1: TForm1
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = StatusBar1
Left = 378
Left = 375
Height = 33
Top = 453
Width = 380
Width = 371
Anchors = [akLeft, akRight, akBottom]
AutoSize = True
BevelOuter = bvNone
ClientHeight = 33
ClientWidth = 380
ClientWidth = 371
TabOrder = 3
object Button1: TButton
object btnExpandAll: TButton
AnchorSideLeft.Control = Panel1
AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom
Left = 4
Left = 0
Height = 25
Top = 4
Width = 79
Width = 80
AutoSize = True
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Bottom = 4
Caption = 'Expand all'
OnClick = Button1Click
OnClick = btnExpandAllClick
TabOrder = 0
end
object Button2: TButton
AnchorSideLeft.Control = Button1
object btnCollapseAll: TButton
AnchorSideLeft.Control = btnExpandAll
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Button1
AnchorSideTop.Control = btnExpandAll
AnchorSideTop.Side = asrCenter
Left = 87
Left = 84
Height = 25
Top = 4
Width = 86
@ -113,345 +114,157 @@ object Form1: TForm1
BorderSpacing.Top = 4
BorderSpacing.Bottom = 4
Caption = 'Collapse all'
OnClick = Button2Click
OnClick = btnCollapseAllClick
TabOrder = 1
end
object btnAdd: TButton
AnchorSideLeft.Control = btnCollapseAll
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnExpandAll
Left = 174
Height = 25
Top = 4
Width = 57
AutoSize = True
BorderSpacing.Left = 4
Caption = 'Add...'
OnClick = btnAddClick
TabOrder = 2
end
object btnDelete: TButton
AnchorSideLeft.Control = btnAdd
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnExpandAll
Left = 235
Height = 25
Top = 4
Width = 59
AutoSize = True
BorderSpacing.Left = 4
Caption = 'Delete'
OnClick = btnDeleteClick
TabOrder = 3
end
object btnEdit: TButton
AnchorSideLeft.Control = btnDelete
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnExpandAll
Left = 298
Height = 25
Top = 4
Width = 55
AutoSize = True
BorderSpacing.Left = 4
Caption = 'Edit...'
OnClick = btnEditClick
TabOrder = 4
end
end
object DataSource1: TDataSource
DataSet = BufDataset1
left = 72
top = 128
Left = 72
Top = 128
end
object ImageList1: TImageList
left = 632
top = 208
Left = 536
Top = 128
Bitmap = {
4C690A0000001000000010000000000000000000000000000000000000000000
00002E45730B3A55837A3B59889F3C5A878F35557F1800000000000000000000
0000000000000000000000000000000000000000000000000000000000003048
85153D5C89CF4C6EA2FE4E71A6FF4E70A5FF3F5C8CD23A56805B000000010000
0000000000000000000000000000000000000000000000000000000000003D5B
8AA74E70A5FF4E71A6FF4E71A6FF4E71A6FF4E71A6FF496D9FFC3C5887980000
0000000000000000000000000000000000000000000000000000000000004161
90D74E71A6FF4E71A6FF4E71A6FF4B6FA2FF4D75A1FF4A6EA0FE406191D80000
0000000000000000000000000000000000000000000000000000000000004161
90DE4A6F9FFF537CA9FF5783AEFF679DC7FF84CDF4FF5482ACFF405F8FDD0000
0000000000000000000000000000000000000000000000000000000000003D5E
8AE05E92BAFF85CEF5FF85CEF5FF85CEF5FF85CEF5FF69A4CBFF3C5C89E10000
000000000000000000000000000000000000000000000000000000000000446B
93F26DACD2FF85CEF5FF85CEF5FF85CEF5FF85CEF5FF6DACD2FF436D94F20000
0000000000000000000000000000000000000000000000000000000000004C84
A1A373B6DBFD85CEF5FF85CEF5FF85CEF5FF85CEF5FF73B6DBFD4C85A19F0000
000000000000000000000000000000000000000000000000000000000000486D
910767A7C9D885CEF5FF85CEF5FF85CEF5FF85CEF5FF65A5C7D8486D91070000
0000000000000000000000000000000000000000000000000000000000000000
00005591B06B6EB1D4FE85CEF5FF85CEF5FF6FB0D4FE5692AF6A000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000B4744A185B95B4EF62A0C2FF62A0C2FF5B94B5EFB1794D17000000000000
0000000000000000000000000000000000000000000000000000C2865C48CC90
64C5DCA175EB7896A3FF70B3D8FF70B3D8FF7896A4FFDBA276EBCB9064C5C085
5C450000000000000000000000000000000000000000C2885E54DA9F74E9F0B7
8BFFF0B78BFFEAB58CFFB3A495FFB3A495FFEBB58BFFF0B78BFFF0B78BFFD89F
74E9BF855950000000000000000000000000CC666605CF9468D1F0B78BFFF0B7
8BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B7
8BFFCE9367D1CC6666050000000000000000C082564AE5AD81FCF0B78BFFF0B7
8BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B7
8BFFE5AD80FCBC8457490000000000000000C0855845CB9065A4CB9165A3CB91
65A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB91
65A3CB9065A4C085584500000000000000000000000000000000000000000000
0000334C7F0A395786743C5A889B3D57868E3758791700000000000000000000
0000000000000000000000000000000000000000000000000000000000003A5B
7C273F5F8DD14C6FA4FF4E71A6FF4E70A5FF3F5F8DDE385683673F3F7F040000
0000000000000000000000000000000000000000000000000000000000003E5C
8BC34E71A6FF4E71A6FF4E71A6FF4E71A6FF4E71A6FF4B6EA1FF3C5B89B80000
00000000000000000000000000000000000000000000000000003B517C2F4768
9AF64E71A6FF4E71A6FF4E71A6FF4E71A6FF486B9CFF4E71A5FF47699BFA364F
813D0000000000000000000000000000000000000000000000003957856F4D6F
A4FF4E71A6FF4E71A6FF4C70A4FF4B72A0FF6DA8D1FF4A709EFF4E6FA5FF3957
83740000000000000000000000000000000000000000000000003A5683764D70
A4FF4B6FA2FF537EAAFF6195BFFF80C7EEFF85CEF5FF527EA9FF4C6FA2FF3854
8363000000000000000000000000000000000000000000000000375381494A6C
A0FF5079A6FF85CEF5FF85CEF5FF85CEF5FF85CEF5FF527FA9FF47699CFC3750
7D33000000000000000000000000000000000000000000000000345278224767
9AF34E78A3FA85CEF5FF85CEF5FF85CEF5FF85CEF5FF4E77A3FA456495EB2D4B
781100000000000000000000000000000000000000000000000038537F56496B
9EFB446894F283CCF3FF85CEF5FF85CEF5FF83CBF3FF446895F2476899F03954
7F4200000000000000000000000000000000000000003F3F7F083B5886D34C6F
A4FF47689AFB467098FD76BBE0FF76BBE0FF466F98FD46689AFC4B6EA3FF3A56
84CE3F3F7F080000000000000000000000000000000000000000334C7F143955
846E4C57785D5E9ABAEA69ABCEFF69ABCEFF5E9ABAEA4A57785D3956846A3854
7109000000000000000000000000000000000000000000000000C2865C48CC90
64C5DCA175EB7896A3FF70B3D8FF70B3D8FF7896A4FFDBA276EBCB9064C5C085
5C450000000000000000000000000000000000000000C2885E54DA9F74E9F0B7
8BFFF0B78BFFEAB58CFFB3A495FFB3A495FFEBB58BFFF0B78BFFF0B78BFFD89F
74E9BF855950000000000000000000000000CC666605CF9468D1F0B78BFFF0B7
8BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B7
8BFFCE9367D1CC6666050000000000000000C082564AE5AD81FCF0B78BFFF0B7
8BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B78BFFF0B7
8BFFE5AD80FCBC8457490000000000000000C0855845CB9065A4CB9165A3CB91
65A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB9165A3CB91
65A3CB9065A4C085584500000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000058483BE0645442E0645442E0645442E06454
42E0645442E0645442E0645442E0645442E0645442E0645442E0645442E06454
42E0645442E0645442E058483BE0645240E577644BFF77644BFF77644BFF7764
4BFF77644BFF77644BFF77644BFF77644BFF77644BFF77644BFF77644BFF7764
4BFF77644BFF77644BFF645240E5645240E577644BFF77644BFF77644BFF7764
4BFF77644BFF77644BFF77644BFF77644BFF77644BFF77644BFF77644BFF7764
4BFF77644BFF77644BFF645240E5584B4AF8645650F8645650F8645650F86456
50F8645650F8645650F8645650F8645650F8645650F8645650F8645650F86456
50F8645650F8645650F8584B4AF86C6CDFE58F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE56C6CDFE58F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE56C6CDFE58F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5595DD6EF6C72E2F16C72E2F16C72E2F16C72
E2F16C72E2F16C72E2F16C72E2F16C72E2F16C72E2F16C72E2F16C72E2F16C72
E2F16C72E2F16C72E2F1595DD6EF8ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE58ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE58ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE581CEF8E08EDAFAE08EDAFAE08EDAFAE08EDA
FAE08EDAFAE08EDAFAE08EDAFAE08EDAFAE08EDAFAE08EDAFAE08EDAFAE08EDA
FAE08EDAFAE08EDAFAE081CEF8E0000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000D7C3B9EDE0CBBAE3D29C75AACB9165A3CB91
65A3CB9165A3CE9B75AC897BBBEB897BBBEBCE9B75ACCB9165A3CB9165A3CB91
65A3CB9367A3DAC1B0D49389BFF58380CDFFD6D6F3FFFEF8F4FFF5CDAEFFF0B7
8BFFF0B78BFFF3C49FFF8B8BE5FF8B8BE5FFF3C49FFFF0B78BFFF0B78BFFF2C0
9AFFD9CDDDFF8A8ADCFFCEC6D6FFDDB495EDA9A5DEFFA1A1E3FFF9F9FDFFFAE5
D5FFF1BC93FFF3C49FFF8B8BE5FF8B8BE5FFF3C49FFFF0B78BFFF4D3BBFFA9A8
E3FFA2A2E3FFFBF9FBFFE5CAB3F3D49A6EE5F1BB91FFDBC7CEFF8B8BDCFFD6D6
F3FFFEF8F4FFF6D5BCFF8B8BE5FF8B8BE5FFF4CBACFFE2D5DDFF8989DCFFD5D5
F2FFFCF0E7FFF2C39EFFD49A6EE5D9A882EAF3C5A2FFF3C5A2FFF3D3BAFFA8A5
DFFFC0C0ECFFFFFFFFFF8B8BE5FF8B8BE5FFD5D4F0FF9B9BE1FFF8F6FBFFF9E1
CEFFF3C6A4FFF3C5A2FFD9A882EA7570CDFE8C8CE6FF8C8CE6FF8C8CE6FF8C8C
E6FF8C8CE6FF8C8CE6FF8383E8FF8383E8FF8C8CE6FF8C8CE6FF8C8CE6FF8C8C
E6FF8C8CE6FF8C8CE6FF7570CDFE7570CDFE8C8CE6FF8C8CE6FF8C8CE6FF8C8C
E6FF8C8CE6FF8C8CE6FF8383E8FF8383E8FF8C8CE6FF8C8CE6FF8C8CE6FF8C8C
E6FF8C8CE6FF8C8CE6FF7570CDFED9A882EAF3C5A2FFF3C7A5FFF9E5D5FFF8F7
FCFF9B9BE1FFD5D4EFFF8B8BE5FF8B8BE5FFFDF4EEFFFCFCFEFFA6A6E4FFBEB7
DDFFF5CDAFFFF3C5A2FFD9A882EAD49A6EE5F3C7A4FFFDF3ECFFD5D5F2FF8989
DCFFE1D2D9FFF3C9A9FF8B8BE5FF8B8BE5FFF3C5A0FFF7D8C0FFFEFCFBFFB8B8
EAFF908FDCFFECCCBDFFD49A6FE5E7CFBBF5FBFAFDFFA2A2E3FFA9A8E2FFF4D1
B6FFF0B78BFFF3C49FFF8B8BE5FF8B8BE5FFF3C49FFFF0B78BFFF2C29DFFFCEF
E5FFE8E8F8FF8888DBFFC1B5CEFBCEC6D6FF8A8ADCFFD9CCDAFFF2BF98FFF0B7
8BFFF0B78BFFF3C49FFF8B8BE5FF8B8BE5FFF3C49FFFF0B78BFFF0B78BFFF0B8
8CFFF7D8C0FFFEFCFBFF9F9AD1FF9389BFF5DAC1AED2CB9367A3CB9165A3CB91
65A3CB9165A3CE9B75AC897BBBEB897BBBEBCE9B75ACCB9165A3CB9165A3CB91
65A3CB9165A3D6AA8AB5DCC7B7EB000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000005656D4E06C6CE2E06C6CE2E06C6CE2E06C6C
E2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6C
E2E06C6CE2E06C6CE2E05656D4E06C6CDFE58F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE56264DBEE7F7FEEFF7F7FEEFF7F7FEEFF7F7F
EEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7F
EEFF7F7FEEFF7F7FEEFF6264DBEE79B5EEEE88C4F2FF88C4F2FF88C4F2FF88C4
F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4
F2FF88C4F2FF88C4F2FF79B5EEEE8ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE58ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE58ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE58ED9FAE5A3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EEFFFFA3EE
FFFFA3EEFFFFA3EEFFFF8ED9FAE579B5EEEE88C4F2FF88C4F2FF88C4F2FF88C4
F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4F2FF88C4
F2FF88C4F2FF88C4F2FF79B5EEEE6264DBEE7F7FEEFF7F7FEEFF7F7FEEFF7F7F
EEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7FEEFF7F7F
EEFF7F7FEEFF7F7FEEFF6264DBEE6C6CDFE58F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE55656D4E06C6CE2E06C6CE2E06C6CE2E06C6C
E2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6CE2E06C6C
E2E06C6CE2E06C6CE2E05656D4E0000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000C48A5DE0D49B6FE0D49B6FE0D49B6FE0CF95
69EAD9C4AFEAE8DBCEE0E8DBCEE0E8DBCEE0E8DBCEE0C4B9C6EA6665DCEA6C6C
E2E06C6CE2E06C6CE2E05656D4E0D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5D49A6EE5F0B78BFFF0B78BFFF0B78BFFE6AD
80FFEBDACAFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FFD7D0DFFF8282EEFF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE5C48A5DE0D49B6FE0D49B6FE0D49B6FE0CF95
69EAD9C4AFEAE8DBCEE0E8DBCEE0E8DBCEE0E8DBCEE0C4B9C6EA6665DCEA6C6C
E2E06C6CE2E06C6CE2E05656D4E0000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000080A86EE08CB57EE08CB57EE08CB57EE08CB3
7FE6A0B688F6E8DBCEE0E8DBCEE0E8DBCEE0E8DBCEE0837FCFF66E6DDFE66C6C
E2E06C6CE2E06C6CE2E05656D4E08BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE58BB47DE59EC999FF9EC999FF9EC999FF9EC9
99FFADC39BFFFFFAF2FFFFFAF2FFFFFAF2FFFFFAF2FF9491DDFF8F8FF7FF8F8F
F7FF8F8FF7FF8F8FF7FF6C6CDFE580A86EE08CB57EE08CB57EE08CB57EE08CB3
7FE6A0B688F6E8DBCEE0E8DBCEE0E8DBCEE0E8DBCEE0837FCFF66E6DDFE66C6C
E2E06C6CE2E06C6CE2E05656D4E0000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000005EAD
CA8458A6C72E0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000004998BA2D6EBED8E693DF
F4F882D0E8EA60AFCBC600000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000060AFCB9196E1F8FF85CE
F5FF8AD4F7FF7CCBE1DB58A6C72E000000000000000000000000000000000000
0000000000000000000000000000000000000000000061B3CB9B96E1F9FF85CF
F5FF8AD4F7FF7ECCE4DF59A9C939000000000000000000000000000000000000
000000000000000000000000000000000000000000004998BA2D6EBED8E694DF
F5FB84D1E9EB60AFCBC600000000000000000000000000000000000000000000
00007FA46B687FA46B6800000000000000000000000000000000000000005EAF
CB9157ABC53A0000000000000000000000000000000000000000000000007AA0
671B8BB47DDB8BB47DDB7AA0671B000000000000000000FF000171A05E1B0000
00000000000000000000000000000000000000000000000000000000000083AA
72B69DC998FF9DC998FF83AA72B6000000000000000085AE74788CB27CC755AA
55030000000000000000000000000000000000000000000000007FA76B7498C1
90F99EC999FF9EC999FF98C190F97FA76B7487A570229EC493E1B6D9B2FD87AF
768700000000000000000000000000000000000000007BA765238DB680DF9EC9
99FF9EC999FF9EC999FF9EC999FF8DB680DF8FB47DC3BCE0B9FFBDE0BAFFA4C7
98E67FA86B3200000000000000000000000000FF000184AC72BD9DC998FF9EC9
99FF9EC999FF9EC999FF9EC999FF92BC88FFB3D6ADFDBDE0BAFFBDE0BAFFBDE0
BAFF92B581C355AA5503000000000000000080AA6E7F99C493FB9EC999FF9EC9
99FF9EC999FF9EC999FF9AC393FF9FC595FFBDE0BAFFBDE0BAFFBDE0BAFFBDE0
BAFFB7D9B1FD87AF7687000000007C9E652D8EB883E39EC999FF9EC999FF9EC9
99FF9EC999FF9DC998FF93BB86FFBCE0B9FFBDE0BAFFBDE0BAFFBDE0BAFFBDE0
BAFFBDE0BAFFA4C798E67FA86B327DA367A788B17AC288B17AC288B17AC288B1
7AC288B17AC284AC73D48EB37DF294B986F194B986F194B986F193B783EA97BA
8AC297BA8AC297BA8AC283A76FA7000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000427A971B427A971B0000
0000000000000000000000000000B6794C3F0000000000000000000000000000
000000000000000000000000000000000000000000004C86A1964C86A1960000
000000000000B8784D24CC9166C9CC9367DBC28A5C8C00000000000000000000
0000000000000000000000000000000000000000000064A3C5E764A3C5E70000
000000000000C59066E3DBB38AFDDBB38AFDC8946AFCBB77550F000000009E8D
762D9E8D762D0000000000000000000000004D89A5665995B3EA5995B3EA4D89
A56600000000CC976EE3FFE8C2FFFFE8C2FFDBAF86FEB57C4F2D00000000B0A2
91A5B1A190A4000000000000000038718D095087A69C6FB2D6FF6FB2D6FF5087
A69C38718D09CC956BE7FDE6BFFFFFE8C2FFDCAE84FFC186595BAAAA5503B7A9
98F5B7A998F5AAAA550300000000437C932D65A5C6FF67A6C9FF67A6C9FF65A5
C6FF4E7C9131CF966CECF7DCB5FFFFE8C2FFDDAD83FFC3895E84ACA08E66DCD1
C5FDDCD1C5FDAE9C8D6500000000437C932D71B4D7FF7AC0E6FF7AC0E6FF71B4
D7FF6D7B7848D79C70F5F0D1AAFFFFE8C2FFDCAA80FFC78E6298AB9C8B8FD6CB
BEFFD6CBBEFFAB9C8B8F00000000437C932D71B4D7FF7AC0E6FF7AC0E6FF71B4
D7FF897F7068E1A77BFFE9C69EFFFFE8C2FFDCA87EFFC99067ADBCAE9FD0D3C9
BBFFD3C9BBFFBCAE9FD091916D07437C932D6EAFD1FF76BADFFF76BADFFF6EAF
D1FF9A836C90ECB387FFE1BA90FFFFE8C2FFDAA57AFFCD956BC8D2C7BAFFDED4
C9FFDED4C9FFD2C7BAFF9E8D762D437C932D6EAFD2FF76BADFFF76BADFFF6EAF
D2FFA3876DA5F0B78BFFE0B48CFFFAE1BBFFDDA87BFFD1986DD6D3C8BAFFDED5
C8FFDED5C8FFD3C8BAFF9E8D762D437C932D71B4D7FF7AC0E6FF7AC0E6FF71B4
D7FFA88C71B4F0B78BFFDEB188FFF4D7B1FFE2A97DFFD49A6FE5D8CDBEFFE4DB
D0FFE4DBD0FFD8CEC0FF9E8D762D437C932D71B4D7FF7AC0E6FF7AC0E6FF71B4
D7FFAD8E73C3F0B78BFFDEAF86FFECCCA5FFE6AD81FFDCA378F3D4C4B2FFE4DB
D0FFE4DBD0FFD8CEC0FF9E8D762D548EADAD5F9EBEF363A2C2F263A2C2F25F9E
BEF376929CEDF0B78BFFDCAC82FFE6C097FFEBB386FFE7AD81FFC8B099FFDCD2
C5FFDCD2C5FFCCC1B2FF9C8A78465B98B8A768A9CBFF76BADFFF76BADFFF68A9
CBFF8198A2F2F0B78BFFDDAA80FFE0B68DFFF0B78BFFEDB488FFD4B49AFFB9AC
9BFFB9AC9BFFE1D8CCFFB7A999BA5B98B8A76FB2D5FF7AC0E6FF7AC0E6FF6FB2
D5FF859BA3F7F0B78BFFDAA67DFFDEB28AFFF0B78BFFF0B78BFFD3AE91FFE4DB
D0FFE4DBD0FFE4DBD0FFB9AC9CB3558FAD6E5C99BAA35C99BAA35C99BAA36097
B4AC8B8F8ACDCB9165A3C89266C0CA966BD6CB9165A3C5956DCBBF9A7CC9BBAF
9FA3BBAF9FA3BBAF9FA3B2A4926E0000000000000000000000003F3F7F043A56
83763E59899C3955826600000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000013C5A87B84C6F
A1FE4E71A6FF496B9DF73A57879E457F9C3E538CAB744C84A832000000000000
0000000000000000000000000000000000000000000038527F44496A9DFD4E71
A6FF4E71A6FF496C9DFB568DB1FD76BADFFD82CAF0FF70B3D7EE528BA9755555
AA03000000000000000000000000000000000000000039558277486A9DFD4C72
A0FF4F77A5FF5E99BCFF84CCF3FF85CEF5FF85CEF5FF85CEF5FF79BFE3FC5A96
B5B500000000000000000000000000000000000000003952814742668FF285CE
F5FF85CEF5FF6AABCDFF85CEF5FF85CEF5FF84CCF3FF6EADCFFF64A0BFFD6CAF
D2F4467B951D000000000000000000000000000000004C87A3645283A9FD85CE
F5FF85CEF5FF67A8CAFF6BA9C8FF75B2D3FF7AB5D5FF9BD7F7FF9AD5F6FF5B9A
BAF5447C97250000000000000000000000000000000038718D095D9ABADD85CE
F5FF85CEF5FF5995B4FF82BDDBFFA3DEFFFFA3DEFFFFA3DEFFFFA3DEFFFF4C84
A1FA486D910E00000000000000000000000000000000000000005491AF7075BB
DFFD85CEF5FF639EBCFF8AC4E3FFA3DEFFFFA3DEFFFFA3DEFFFFA3DEFFFF5E96
B3F8437893130000000000000000000000000000000000000000B67F480E5B93
B3F063A1C3FF5A95B4FE89C2E2FAA3DEFFFFA3DEFFFFA3DEFFFF9ED9FAFF5990
ABA200000000000000000000000000000000BF7F562CCC9164BBD9A074E89399
97FE739FB3FF84999FFF73A0B7FDA3DEFFFFA3DEFFFFA3DEFFFF76AFCDF4517F
9616000000000000000000000000B4875A11D2996DD0F0B78BFFF0B78BFFF0B7
8BFFF0B78BFFF0B78BFF979E9DFF77B0CFFF86BFDFFF7AB2D1FF6098B7C00000
0000000000000000000000000000C2875C87EEB488FFF0B78BFFF0B78BFFF0B7
8BFFEDB48AFFE1B28BFFAFA79AFF95CBE9FF96D1F1FF9CD6F7FF8DA2A8E3D6AE
8AA2CC9F7F280000000000000000C187584BC1885C85C1885C85C1885C85C591
689CDBB592EDFCE4BEFFFFE8C2FFB0C0BBFF96B9C4FFA3BABCFFFAE5C1FFFEE7
C1FFE5C49FE4CFA6855C00000000000000000000000000000000FF7F7F02DAB5
91CCFFE8C1FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8
C2FFFFE8C2FFE2C09BE0C5967F16000000000000000000000000CBA28145F0D5
AFFAFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8C2FFFFE8
C2FFFFE8C2FFFCE3BEFFD2A98689000000000000000000000000CEA68145D9B4
90A4D9B591A3D9B591A3D9B591A3D9B591A3D9B591A3D9B591A3D9B591A3D9B5
91A3D9B591A3D9B591A3D3A78569
4C7A0A00000010000000100000003F0B00000000000078DAED9A795093E919C0
DD763BDB6D67B6B3D3637766A7FF6CDB69FFA8DB76B7ED8AC7BA7545B9745DE4
14C475E55220A002228201120884338470849B1020C89D84232037022680DC47
B83188A08801E44A78FABD9F4D3606B2206CBBD3D16FE6373C79BFF7179EF7FC
927CDF9E3D1B8F8FB4AFFE7CBF31C9F3807960F2C13394F07F1813DFDFB3CDE3
AF3AFEBF3E6419D46640485B3F7939034EBAB0E1B06548C77E131F0BECF41B5B
F9872CA899C8C15D15749D926507CD28B15BF9FF3A1FD1ABEAE93BA7C109B754
D023A4AC7F7E9ED6B70D7F58CF39194E7B71C094940776898D406E590023BF1C
F8FC5CF8D096F95B5147AD2205E0DFBAF80217D38570D032686C2BFFA8035DEA
94D3B1C147655F384549B7F20DC8A9ACABC562B9BA8FCA0CFC5393B7F2759C68
6FD96536F7A9FB36ECC63E746E3B73C09856E04028EC5A57B8CE055DEB2691F9
97B63B8778AE7AEF5B30784FBE49A905844514FF49E1F513EF6DE5D50658EA88
22AC1B0653DD663CA259E0C2EDC3F1884E07719AFB8C103B57ED6FA9BDA91B68
653490ECFA70AE241810D3FC10E0A6337066F8CFCB107D589D2A7FF353AAAEC8
D6F6276D51F6ED8A3A5BD14AB76B478EC2AFF633D193E4FACAB6EB4B727D6415
64535DA5EF6FA62D8CB04917D26C58DB02AB8B1C4DFDF88901F1675AA601AE07
CF04C61F320D08FBD4ECFA7BDB1DBBFD165E7F3C7C2EB4DDC0391D94EBFF5CE8
F03E1392DDE1C3C437B7F23FB30CAE535FFBF83A26A4C2418BA0D2EF720F7CE5
F597E3F6CC67EAAE8E4302F6970DC72FC6AFFEF34BDF439A7C2D537FE7138ABC
310C5CD241FF4A0A3865B5839E4B129C7466839629C95563DB4D48EE279083ED
39A76F66C3794615F834CEE26BC0F026070CB0F27D46A40B9AFC4F4FFBEAEA39
A6C0A9EB191BD6BF219183E59F20FBF494F7279AFCBF1B7A7C78DC8E397FD283
B5AAEE9FBCC65AD5B666CCECD5F7785793BFEF34D144D72169EDA87D9494249A
57BA24E13C1CB567488FDBC7CD6919118F6CE66263FBD30366019D68DCB13158
3BE6122B772F1F05C431E758F9317BA64C9FC082FD26E4565457C3BCFB959631
996060EA71D68A2998BE78AB151028D6C3CAB44CC897F6195D7EFBF5FAFFEFAE
FFFFE561A67360D4DAE8C88EC05DC3CF25D7ACF561272077B7BE99BEDEB2B5C9
A91D815C47C7114978F812EC04E4FED0BEF9D99E278E57C69FEE04E486F5AF4A
58B3003B01B93FB4EFDBBA3C1A36B0BA2390BBE7153F7AEBCA1E8F0A05131D09
6ED9AA7B546BBC5B4ED08DF219048A5FD8BFE876AC819A822E7A50D522C9A705
7A7AE6617D7901165BF2947BE47C7D3204074B7050AC28975633A1BF6508A8D4
4168BDD303433CC6630E7B185253276065450EAB926E785A41DFD45FE82C074E
D604A4A54DC0DACA1A48EE72E7BB9804C9D3721A881B5BB1BA83CA5C9E755728
FD05610E8C770F4150D02074774B4136F700A4754980DCFE2CBFE9F98634C0E9
1440167B04AAAB1F013A147E77D71CC4C78FC1F2B33558196B85F93BE9787DE4
BAB9B4AC87844CC266904853389ACE2377B7BE32FF4636AC607DB7BC24C373ED
EE7AA2CC5FBE300B32D93A6464DC87CA92216C9CF295F9A33E986F4C07F9FC23
BC6F501F8D75F4C37C33E7DBFE6F4881A5BE6A5897AD4169E93444840FC223D1
6DACFF9C250FDACA17D756E5F89870B2C661A1BD58E3F84B6B1341F644025353
CB101828861A7EEB1A9A03682EF48B06405A15BBE5FC992B0D51E692CC6C0734
07076AF23AD09CDCF6FCC5E8C9A6F2071B4B665EF5F56F62D235EAE838BE239E
BBBBBB7E7D632D9E251267612720F73A7F7636B05E0A3B01B9FFEFD7BFDDFABB
EDBFDD8EDF6EE7CF6EE7EFABBEFEEBA96747BBE29D95B4312E4EF7D7E74F4F89
5B4755A92FBB336D6B3338ADDE7FE8FAA1FADD6832D7076606EE02AC4A5FA0F7
DE08F8F9CD6E18BFD7FE6B7F37FE6EE7EFABBEFE7DB208A321FC9BDFC2254EA6
14073E53EF3F12B1ED19C1696452BDFF8279DE92A4E6385025B72E7EC3F845D1
8636DDBF5FFBAFFDDDF8BB9DBFAFDA7AB7CABD4B36CB68FCE8653DDD58C15E42
65DF247D6461D9EFDED4F4D7F9C23B2FE363F569D163CBF8EFD9D4AE25F0128E
895F268FF35C617CF4D80AF8B73DF76F8AEE8F98739AB55E36FFA891C53572FB
C399EFCA9F98EE608FD8B4FFB07698DE6AD8AFC9F54CB1FB009BD362048A9527
60CF1B9753AC3ED82A4F52F695E2C4E65840A05851EE9FE7EA1152E4D5689C6D
FC638D79673AB8C6D644AC28D6118A511985EDF261523D7DACB8BF484EC977A7
6CE6DEC8B4F95D68B1CF88FA5A4465E13CEFBA8AD132B83D2A80F4C6D8496296
C3C72FC858DBC839576EA39CD5FDC88A40E0F6E4CA91AB2092EF5BA7DA0E9F6C
0231AE9EBEA6EE32EBE890DCC000551751D25FA86C875792CDDEB052D284BA8B
72A1970780226F7514EDF066D96506167AD6AA43CEB9DA15C6F5964695053C55
402F214DC708A8B50A4899CE99DFD7BA3CE219F30142BDBCF8BAC1E1EDF80601
A9D108C5EB528F13BF17D16C9B45743B712DD532642BDF9AD5F000A178DD1061
3B21E652E588A6A84BB2F26BC6BF40E549A1EE7B11AAEE8920B6AD39833B8D40
317E4F2686300153B58010E707ACF3BDBEC49D82341ABB3035225D79CFEB72E8
DBA7281909CE453D8040312A13311C1EC827AB707F308F0C3501E616D9D89C29
E1C42E22B2FF337FBEF0A2EFB561DF01BB8C661C149FF4A2FDAD2DDAF1D1D220
1FF787724950176445CE4909B31D6C6F9023F212426D14FE655E2F78564FE2A0
D8E986874E6F82CBE25C7BF6F3FF9FED038D61DFC4DE4A080EEF11560202C59A
FC20A28BFD58E60D787827E9B99F75139A23EC722BF292EF7536970302C5349A
D35BC827E4B783BB600407C54C9263C4232E05C60411B83FC0F6841686435347
A30086BB9A71508CC6E1B9DFA1E277008BE2C4469FA5477921B03A560E435937
A03DD6A9A7B309F3BB9B7050ACF0D5F3CF0AB9CC43FE7061202CF416C238C71B
FFADAFAFA512EE8BEFE1F4B5566BF473C3AED6E17E7E003C12B1B1CFF4BE30C8
F298EFAA2FDAE01B85E5E69E4BAA9CBF90562B45A0D83D32E131F20773FC60B2
3A0666B801F0007B8FA6823818EC68C011D5144102D5E398456C69A63D47A86C
3F8A7D63D3A4C81FC2C66DB43814FF5EF19817085D3C2694E5C4E38CF589A084
132740BE7351B7327F14FBC7B396903390E10DC34554E57793CE3C9A327F4459
4E02D7383C976019276029F83A8697131C4E6D41BF313645DA56DF8D76E84171
03C34958C5F46A2ECF4F6629284A8F24A8DDC37D13DDC3FECC3C2841CBD8CFF6
25B790370E9EA1941A38A7E2CFFDE83A242EED37A5246913133E3B1D72CBD580
9CF5F177C9FB0C8947752F25CA95CFFB3826AE998416CAB13E95FBDD9D03176E
EFAC6130C7CDD8387BD3EB0F96EF351DCC37B892025F5E6383555C059055EE61
23AE574DC8CE44F3F99BFA86BEC78FD8864B15752FDD6A517AE87D08B96D609D
522577CCEF58387683F1DB0DFB1F85656D48E2289FBBB1CBBA0B0E9C26702BEA
044F7E37C4F72E01B3FB195830058B47BD62FEB0A1FDD89E7396291852F8E60C
1EF8DD16036B185EC0809CBAAAE3447B67B33618D1F25DDCCA47F01C2E245500
B57E62836F15CD5DFEC283FECBCDFC62A2CE3B1674EEDC85D43A38C3E0AD07D5
8EAFAABA49FDAB601E712B4DDDAB229AFC5944B32EEF4F719DA2C7C5AC5F4DE6
02392E19AEA694C8557DF7FC9685AF88D1BF79E1591FCA99773BE29CEE6D769F
3B262911AE15B44140D5087816B5C3D7B125D51BEEDB532C29B3D8DA52F51EF3
A83056140CF9994C60081F4274FB5348E85982D0B4AC899E3C6A9A2899F82785
5F4331D3AF09B4F457D040B34F10F3231FCBEE57E27B5F4175394497D5034B50
01AB921A587F500392FAE4FB6D19FE96EAB90091F8A3013E4D045335A0B8F668
62BC3A7EB4219AF8425F08D37CB5E7BAF357B77211B2894AE8E00404A9FAAD19
BEDAFDBC88F47E3E8DB51D3A33FD2FFE1BE7943FBC
}
end
object BufDataset1: TBufDataset
FieldDefs = <>
left = 192
top = 128
Left = 192
Top = 128
end
end

View File

@ -11,24 +11,32 @@ uses
type
{ TForm1 }
{ TMainForm }
TForm1 = class(TForm)
TMainForm = class(TForm)
Bevel1: TBevel;
BufDataset1: TBufDataset;
Button1: TButton;
Button2: TButton;
btnExpandAll: TButton;
btnCollapseAll: TButton;
btnAdd: TButton;
btnDelete: TButton;
btnEdit: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ImageList1: TImageList;
JvDBTreeView1: TJvDBTreeView;
Panel1: TPanel;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure btnEditClick(Sender: TObject);
procedure btnExpandAllClick(Sender: TObject);
procedure btnCollapseAllClick(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure JvDBTreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure JvDBTreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: string);
procedure JvDBTreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode);
private
@ -37,12 +45,15 @@ type
end;
var
Form1: TForm1;
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
RecordEditorFrm;
const
ICON_MALE = 0;
ICON_FEMALE = 1;
@ -55,16 +66,103 @@ const
ICON_CITY = 8;
ICON_PEOPLE = 9;
{ TForm1 }
function UniqueID(ADataset: TDataset; IDFieldName: String): Integer;
begin
repeat
Result := Random(MaxInt);
until not ADataset.Locate(IDFieldName, Result, []);
end;
procedure TForm1.Button1Click(Sender: TObject);
{ TMainForm }
procedure TMainForm.btnAddClick(Sender: TObject);
var
F: TRecordEditor;
newid: Integer;
parentid: Integer;
dataset: TDataset;
begin
dataset := JvDBTreeView1.Datasource.Dataset;
F := TRecordEditor.Create(nil);
try
F.Caption := 'New record';
F.Position := poMainFormCenter;
if F.ShowModal = mrOK then
begin
// Determine unique key field value
newID := UniqueID(dataset, JvDBTreeView1.MasterField);
// Determine parent id of new record
case F.rgParent.ItemIndex of
0: parentID := dataset.FieldByName(JvDBTreeView1.MasterField).AsInteger; // new node is child
1: parentID := dataset.FieldByName(JvDBTreeView1.DetailField).AsInteger; // new node is sibling
end;
with dataset do
begin
Insert;
FieldByName(JvDBTreeView1.MasterField).AsInteger := newID;
FieldByName(JvDBTreeView1.DetailField).AsInteger := parentID;
FieldByName(JvDBTreeView1.ItemField).AsString := F.edName.Text;
FieldByName(JvDBTreeView1.IconField).AsInteger := F.ImageIndex;
Post;
end;
end;
finally
F.Free;
end;
end;
procedure TMainForm.btnCollapseAllClick(Sender: TObject);
begin
JvDBTreeView1.FullCollapse;
end;
procedure TMainForm.btnDeleteClick(Sender: TObject);
begin
if JvDBTreeView1.Selected.HasChildren then
begin
MessageDlg('It is not allowed to delete a node with children.', mtError, [mbOK], 0);
exit;
end;
if MessageDlg('Do you really want to delete the current record?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
JvDBTreeView1.Datasource.Dataset.Delete;
end;
procedure TMainForm.btnExpandAllClick(Sender: TObject);
begin
JvDBTreeView1.FullExpand;
end;
procedure TForm1.Button2Click(Sender: TObject);
procedure TMainForm.btnEditClick(Sender: TObject);
var
F: TRecordEditor;
dataset: TDataset;
begin
JvDBTreeView1.FullCollapse;
dataset := JvDBTreeView1.Datasource.Dataset;
F := TRecordEditor.Create(nil);
try
F.Caption := 'Edit record';
F.Position := poMainFormCenter;
F.edName.Text := dataset.FieldByName(JvDBTreeView1.ItemField).AsString;
F.ImageIndex := dataset.FieldByName(JvDBTreeView1.IconField).AsInteger;
F.rgParent.Hide;
if F.ShowModal = mrOK then
begin
with dataset do
begin
Edit;
FieldByName(JvDBTreeView1.ItemField).AsString := F.edName.Text;
FieldByName(JvDBTreeView1.IconField).AsInteger := F.ImageIndex;
Post;
end;
end;
finally
F.Free;
end;
end;
{ Assignment of table fields to tree
@ -75,7 +173,7 @@ end;
Name --> Tree.itemField
Icon --> Tree.IconField
}
procedure TForm1.FormCreate(Sender: TObject);
procedure TMainForm.FormCreate(Sender: TObject);
procedure AddRecord(ID, ParentID: Integer; AName: String; AIcon: Integer = -1);
begin
@ -150,7 +248,7 @@ begin
BufDataset1.IndexFieldNames := 'ParentID;Name';
end;
procedure TForm1.JvDBTreeView1CustomDrawItem(Sender: TCustomTreeView;
procedure TMainForm.JvDBTreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Level = 0 then
@ -159,7 +257,18 @@ begin
Sender.Canvas.Font.Style := [];
end;
procedure TForm1.JvDBTreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode
procedure TMainForm.JvDBTreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: string);
begin
with JvDBTreeView1.Datasource.Dataset do
begin
Edit;
FieldByName(JvDBTreeView1.ItemField).AsString := S;
Post;
end;
end;
procedure TMainForm.JvDBTreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode
);
begin
Node.SelectedIndex := Node.ImageIndex;

View File

@ -0,0 +1,110 @@
object RecordEditor: TRecordEditor
Left = 723
Height = 223
Top = 309
Width = 269
ClientHeight = 223
ClientWidth = 269
OnCreate = FormCreate
LCLVersion = '2.1.0.0'
object edName: TEdit
AnchorSideLeft.Control = cmbImageIndex
AnchorSideTop.Control = Owner
AnchorSideRight.Control = cmbImageIndex
AnchorSideRight.Side = asrBottom
Left = 105
Height = 23
Top = 12
Width = 140
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 12
TabOrder = 0
end
object Label1: TLabel
AnchorSideLeft.Control = Label2
AnchorSideTop.Control = edName
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 16
Width = 35
Caption = 'Name:'
ParentColor = False
end
object cmbImageIndex: TComboBoxEx
AnchorSideLeft.Control = Label2
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edName
AnchorSideTop.Side = asrBottom
Left = 105
Height = 24
Top = 43
Width = 140
BorderSpacing.Left = 24
BorderSpacing.Top = 8
BorderSpacing.Right = 16
Images = Form1.ImageList1
ItemHeight = 16
ItemsEx = <>
TabOrder = 1
end
object Label2: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbImageIndex
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 48
Width = 65
BorderSpacing.Left = 16
Caption = 'Image index'
ParentColor = False
end
object rgParent: TRadioGroup
AnchorSideLeft.Control = Label2
AnchorSideTop.Control = cmbImageIndex
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = cmbImageIndex
AnchorSideRight.Side = asrBottom
Left = 16
Height = 74
Top = 83
Width = 229
Anchors = [akTop, akLeft, akRight]
AutoFill = True
BorderSpacing.Top = 16
BorderSpacing.Bottom = 12
Caption = 'The new node will be ...'
ChildSizing.LeftRightSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
ClientHeight = 54
ClientWidth = 225
Items.Strings = (
'a child of the current node'
'a sibling of the current node'
)
TabOrder = 2
end
object ButtonPanel1: TButtonPanel
Left = 6
Height = 34
Top = 183
Width = 257
OKButton.Name = 'OKButton'
OKButton.DefaultCaption = True
OKButton.OnClick = OKButtonClick
HelpButton.Name = 'HelpButton'
HelpButton.DefaultCaption = True
CloseButton.Name = 'CloseButton'
CloseButton.DefaultCaption = True
CancelButton.Name = 'CancelButton'
CancelButton.DefaultCaption = True
TabOrder = 3
ShowButtons = [pbOK, pbCancel]
end
end

View File

@ -0,0 +1,107 @@
unit RecordEditorFrm;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComboEx,
ExtCtrls, ButtonPanel;
type
{ TRecordEditor }
TRecordEditor = class(TForm)
ButtonPanel1: TButtonPanel;
cmbImageIndex: TComboBoxEx;
edName: TEdit;
Label1: TLabel;
Label2: TLabel;
rgParent: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
private
function GetImageIndex: Integer;
procedure SetImageIndex(const AValue: Integer);
function ValidData(out AControl: TWinControl; out AMsg: String): Boolean;
public
property ImageIndex: Integer read GetImageIndex write SetImageIndex;
end;
var
RecordEditor: TRecordEditor;
implementation
{$R *.lfm}
{ TRecordEditor }
procedure TRecordEditor.OKButtonClick(Sender: TObject);
var
C: TWinControl;
msg: String;
begin
if not ValidData(C, msg) then
begin
C.SetFocus;
MessageDlg(msg, mtError, [mbOk], 0);
ModalResult := mrNone;
end;
end;
procedure TRecordEditor.FormCreate(Sender: TObject);
var
i: Integer;
begin
cmbImageIndex.Items.Clear;
cmbImageIndex.Add('(none)', -1, -1, -1, -1);
for i := 0 to cmbImageIndex.Images.Count-1 do
cmbImageIndex.Add(IntToStr(i), 0, i, -1, i);
end;
function TRecordEditor.GetImageIndex: Integer;
begin
if cmbImageIndex.ItemIndex = -1 then
Result := -1
else
Result := cmbImageIndex.ItemsEx[cmbImageIndex.ItemIndex].ImageIndex;
end;
procedure TRecordEditor.SetImageIndex(const AValue: Integer);
var
i: Integer;
begin
for i := 0 to cmbImageIndex.ItemsEx.Count-1 do
if cmbImageIndex.ItemsEx[i].ImageIndex = AValue then
begin
cmbImageIndex.ItemIndex := i;
exit;
end;
cmbImageIndex.ItemIndex := -1;
end;
function TRecordEditor.ValidData(out AControl: TWinControl; out AMsg: String): Boolean;
begin
Result := false;
if edName.Text = '' then
begin
AMsg := 'Input required.';
AControl := edName;
exit;
end;
if rgParent.Visible and (rgParent.ItemIndex = -1) then
begin
AMsg := 'Relation of new node to current node not specified.';
AControl := rgParent;
exit;
end;
Result := true;
end;
end.