jvcllaz: Add TJvID3v2 (mp3 tags). Add demos for TJvID3v1 and TJvID3v2.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6299 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-04-09 10:59:35 +00:00
parent 0bde2c56dc
commit 65282d026d
20 changed files with 15152 additions and 22 deletions

View File

@ -1,4 +1,5 @@
tjvid3v1.bmp tjvid3v1.bmp
tjvid3v2.bmp
tjvgradient.bmp tjvgradient.bmp
tjvgradientheaderpanel.bmp tjvgradientheaderpanel.bmp
tjvspecialprogress.bmp tjvspecialprogress.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -16,12 +16,12 @@ implementation
uses uses
Classes, JvDsgnConsts, Classes, JvDsgnConsts,
PropEdits, Controls, PropEdits, Controls,
JvId3v1, JvGradient, JvGradientHeaderPanel, JvSpecialProgress; JvId3v1, JvId3v2, JvGradient, JvGradientHeaderPanel, JvSpecialProgress;
procedure Register; procedure Register;
begin begin
RegisterComponents(RsPaletteJvcl, [ RegisterComponents(RsPaletteJvcl, [
TJvId3v1, TJvId3v1, TJvId3v2,
TJvGradient, TJvGradientHeaderPanel, TJvGradient, TJvGradientHeaderPanel,
TJvSpecialProgress TJvSpecialProgress
]); ]);

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="JvID3v1Demo"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="0"/>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="JvMMLazR"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="JvID3v1Demo.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="JvID3v1MainFormU.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="JvID3v1MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="JvID3v1Demo"/>
</Target>
<SearchPaths>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,16 @@
program JvID3v1Demo;
{$mode objfpc}{$H+}
uses
Interfaces,
Forms,
JvID3v1MainFormU in 'JvID3v1MainFormU.pas' {JvID3v1MainForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TJvID3v1MainForm, JvID3v1MainForm);
Application.Run;
end.

View File

@ -0,0 +1,691 @@
object JvID3v1MainForm: TJvID3v1MainForm
Left = 405
Height = 237
Top = 240
Width = 316
AllowDropFiles = True
AutoSize = True
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'TJvId3v1 example'
ClientHeight = 237
ClientWidth = 316
Color = clBtnFace
DefaultMonitor = dmDesktop
Font.Color = clWindowText
FormStyle = fsStayOnTop
OnCreate = FormCreate
OnDropFiles = FormDropFiles
Position = poScreenCenter
ShowHint = True
LCLVersion = '1.9.0.0'
Scaled = False
object lblArtist: TLabel
AnchorSideTop.Control = edtArtist
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblComment
AnchorSideRight.Side = asrBottom
Left = 30
Height = 15
Top = 131
Width = 28
Anchors = [akTop, akRight]
Caption = '&Artist'
FocusControl = edtArtist
ParentColor = False
end
object lblAlbum: TLabel
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblComment
AnchorSideRight.Side = asrBottom
Left = 22
Height = 15
Top = 158
Width = 36
Anchors = [akTop, akRight]
Caption = 'Al&bum'
FocusControl = edtAlbum
ParentColor = False
end
object lblYear: TLabel
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtYear
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblComment
AnchorSideRight.Side = asrBottom
Left = 36
Height = 15
Top = 185
Width = 22
Anchors = [akTop, akRight]
Caption = '&Year'
FocusControl = edtYear
ParentColor = False
end
object lblComment: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = edtComment
AnchorSideTop.Side = asrCenter
Left = 4
Height = 15
Top = 212
Width = 54
BorderSpacing.Left = 4
Caption = '&Comment'
FocusControl = edtComment
ParentColor = False
end
object lblGenre: TLabel
AnchorSideLeft.Control = edtYear
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblYear
AnchorSideRight.Control = cmbGenre
Left = 132
Height = 15
Top = 185
Width = 51
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 12
BorderSpacing.Right = 4
Caption = '&Genre'
FocusControl = cmbGenre
ParentColor = False
end
object lblHasTag: TLabel
AnchorSideLeft.Control = JvFilenameEdit1
AnchorSideTop.Control = lblTrack
AnchorSideRight.Control = lblTitle
AnchorSideRight.Side = asrBottom
Left = 6
Height = 15
Top = 77
Width = 52
Anchors = [akTop, akRight]
Caption = 'lblHasTag'
ParentColor = False
end
object lblTitle: TLabel
AnchorSideTop.Control = edtTitle
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblComment
AnchorSideRight.Side = asrBottom
Left = 35
Height = 15
Top = 104
Width = 23
Anchors = [akTop, akRight]
Caption = '&Title'
FocusControl = edtTitle
ParentColor = False
end
object lblTrack: TLabel
AnchorSideTop.Control = sedTrack
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = sedTrack
Left = 221
Height = 15
Top = 77
Width = 38
Anchors = [akTop, akRight]
BorderSpacing.Right = 4
Caption = 'T&rack #'
FocusControl = sedTrack
ParentColor = False
end
object JvFilenameEdit1: TFileNameEdit
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = ToolBar1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 4
Height = 23
Top = 46
Width = 308
OnAcceptFileName = JvFilenameEdit1AcceptFileName
FilterIndex = 0
HideDirectories = False
ButtonWidth = 23
NumGlyphs = 1
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
MaxLength = 0
ParentShowHint = False
ShowHint = True
TabOrder = 0
OnKeyPress = JvFilenameEdit1KeyPress
end
object edtTitle: TEdit
AnchorSideLeft.Control = lblTitle
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = sedTrack
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 62
Height = 23
Top = 100
Width = 250
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
MaxLength = 30
TabOrder = 2
end
object edtAlbum: TEdit
AnchorSideLeft.Control = lblAlbum
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtArtist
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 62
Height = 23
Top = 154
Width = 250
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
MaxLength = 30
TabOrder = 4
end
object edtArtist: TEdit
AnchorSideLeft.Control = lblArtist
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtTitle
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 62
Height = 23
Top = 127
Width = 250
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
MaxLength = 30
TabOrder = 3
end
object edtYear: TEdit
AnchorSideLeft.Control = lblYear
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrBottom
Left = 62
Height = 23
Top = 181
Width = 58
BorderSpacing.Left = 4
BorderSpacing.Top = 4
MaxLength = 4
TabOrder = 5
end
object edtComment: TEdit
AnchorSideLeft.Control = lblComment
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtYear
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 62
Height = 23
Top = 208
Width = 250
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Bottom = 4
MaxLength = 30
TabOrder = 7
end
object cmbGenre: TComboBox
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 187
Height = 23
Top = 181
Width = 125
Anchors = [akTop, akRight]
BorderSpacing.Top = 4
ItemHeight = 15
Sorted = True
Style = csDropDownList
TabOrder = 6
end
object ToolBar1: TToolBar
Left = 0
Height = 42
Top = 0
Width = 316
AutoSize = True
ButtonHeight = 40
ButtonWidth = 44
Caption = 'ToolBar1'
EdgeBorders = [ebBottom]
Images = ImageList1
ParentShowHint = False
ShowCaptions = True
ShowHint = True
TabOrder = 8
Wrapable = False
object ToolButton1: TToolButton
Left = 1
Hint = 'Reload the tag data from the file'
Top = 0
Action = actRefresh
ParentShowHint = False
ShowHint = True
end
object ToolButton2: TToolButton
Left = 46
Hint = 'Save changes of the tag to the file'
Top = 0
Action = actSave
ParentShowHint = False
ShowHint = True
end
object ToolButton3: TToolButton
Left = 90
Hint = 'Erase the tag of the file'
Top = 0
Action = actErase
ParentShowHint = False
ShowHint = True
end
object ToolButton4: TToolButton
Left = 134
Hint = 'Toggle ''Always on Top'''
Top = 0
Action = actOnTop
ParentShowHint = False
ShowHint = True
end
object ToolButton5: TToolButton
Left = 178
Hint = 'Show ''About'' dialog'
Top = 0
Action = actAbout
ParentShowHint = False
ShowHint = True
end
object ToolButton6: TToolButton
Left = 222
Hint = 'Close program'
Top = 0
Action = actExit
ParentShowHint = False
ShowHint = True
end
end
object sedTrack: TSpinEdit
AnchorSideTop.Control = JvFilenameEdit1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = JvFilenameEdit1
AnchorSideRight.Side = asrBottom
Left = 263
Height = 23
Top = 73
Width = 49
Alignment = taRightJustify
Anchors = [akTop, akRight]
BorderSpacing.Top = 4
MaxValue = 255
TabOrder = 1
end
object JvId3v11: TJvID3v1
Active = False
left = 184
top = 112
end
object ActionList1: TActionList
Images = ImageList1
left = 104
top = 112
object actSave: TAction
Caption = 'Save'
ImageIndex = 0
OnExecute = actSaveExecute
end
object actRefresh: TAction
Caption = 'Refresh'
ImageIndex = 2
OnExecute = actRefreshExecute
end
object actErase: TAction
Caption = 'Erase'
ImageIndex = 1
OnExecute = actEraseExecute
end
object actExit: TAction
Caption = 'Exit'
ImageIndex = 3
OnExecute = actExitExecute
end
object actOnTop: TAction
Caption = 'On Top'
Checked = True
ImageIndex = 5
OnExecute = actOnTopExecute
end
object actAbout: TAction
Caption = 'About'
ImageIndex = 4
OnExecute = actAboutExecute
end
end
object ImageList1: TImageList
Height = 20
Width = 20
left = 72
top = 32
Bitmap = {
4C69060000001400000014000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF000000FF000000000000000000000000000000000000
000000000000000000FF52B5F7FF52B5F7FF000000FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF52B5F7FF52B5F7FF0000
00FFD6A58CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF000000FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBD
D6FF000000FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
000000000000000000FF52B5F7FF009CFFFF000000FFDEBDD6FFDEBDD6FFDEBD
D6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FF000000FF009CFFFF00639CFF0000
00FFC6948CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF000000FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBD
D6FF000000FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
000000000000000000FF52B5F7FF009CFFFF000000FFDEBDD6FFDEBDD6FFDEBD
D6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FF000000FF009CFFFF00639CFF0000
00FFC6948CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF000000FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBD
D6FF000000FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
000000000000000000FF52B5F7FF009CFFFF000000FFDEBDD6FFDEBDD6FFDEBD
D6FFDEBDD6FFDEBDD6FFDEBDD6FFDEBDD6FF000000FF009CFFFF00639CFF0000
00FFC6948CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF009CFFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF52B5F7FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
000000000000000000FF52B5F7FF009CFFFF009CFFFF009CFFFF009CFFFF009C
FFFF009CFFFF009CFFFF009CFFFF009CFFFF009CFFFF009CFFFF00639CFF0000
00FFC6948CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
000000000000000000FF52B5F7FF009CFFFF000000FFDEBDD6FFDEBDD6FFFFFF
FFFFDEBDD6FFDEBDD6FFBDBDBDFFBDBDBDFF000000FF009CFFFF00639CFF0000
00FFC6948CFF00000000000000000000000000000000000000FF52B5F7FF009C
FFFF000000FFDEBDD6FFDEBDD6FFFFFFFFFFDEBDD6FFDEBDD6FFBDBDBDFFBDBD
BDFF000000FF009CFFFF00639CFF000000FFC6948CFF00000000000000000000
00000000000000000000000000FF00639CFF000000FFDEBDD6FFDEBDD6FFFFFF
FFFFDEBDD6FFDEBDD6FFBDBDBDFFBDBDBDFF000000FF00639CFF00639CFF0000
00FFC6948CFF0000000000000000000000000000000000000000000000000000
00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF000000FFC6948CFF0000000000000000000000000000
0000000000000000000000000000D6A58CFFC6948CFFC6948CFFC6948CFFC694
8CFFC6948CFFC6948CFFC6948CFFC6948CFFC6948CFFC6948CFFC6948CFF0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000FF000000FF000000FF000000FF000000FF0000
00FF000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000FF000000FF000000FF000000FFBDBD
BDFFFFFFFFFFBDBDBDFFBDBDBDFF000000FF000000FF000000FF000000FF0000
0000000000000000000000000000000000000000000000000000000000000000
00FFBDBDBDFFFFFFFFFFFFFFFFFFBDBDBDFFBDBDBDFFC6948CFFC6948CFF9C8C
6BFF9C8C6BFF9C8C6BFF000000FF9C8C6BFF0000000000000000000000000000
0000000000000000000000000000000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000FF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C
6BFF9C8C6BFF000000FF9C8C6BFF9C8C6BFF0000000000000000000000000000
000000000000000000000000000000000000000000FFBDBDBDFFFFFFFFFFC694
8CFFFFEFDEFF9C8C6BFFC6948CFF424242FF9C8C6BFF000000FF9C8C6BFF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000FFBDBDBDFFFFFFFFFFBDBDBDFFFFEFDEFFC6948CFFBDBDBDFF6363
63FFD6A58CFF000000FF9C8C6BFF9C8C6BFF0000000000000000000000000000
000000000000000000000000000000000000000000FFBDBDBDFFFFFFFFFFBDBD
BDFFFFEFDEFFC6948CFFBDBDBDFF636363FFD6A58CFF000000FF9C8C6BFF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000FFBDBDBDFFFFFFFFFFBDBDBDFFFFEFDEFFC6948CFFBDBDBDFF6363
63FFD6A58CFF000000FF9C8C6BFF9C8C6BFF0000000000000000000000000000
000000000000000000000000000000000000000000FFBDBDBDFFFFFFFFFFBDBD
BDFFFFEFDEFFC6948CFFBDBDBDFF636363FFD6A58CFF000000FF9C8C6BFF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000FFBDBDBDFFFFFFFFFFBDBDBDFFFFEFDEFFC6948CFFBDBDBDFF6363
63FFD6A58CFF000000FF9C8C6BFF9C8C6BFF0000000000000000000000000000
000000000000000000000000000000000000000000FFBDBDBDFFFFFFFFFFFFEF
DEFFBDBDBDFFBDBDBDFFC6948CFFC6948CFF636363FF000000FF9C8C6BFF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000FFBDBDBDFFFFFFFFFFBDBDBDFFBDBDBDFFC6948CFFC6948CFF6363
63FF636363FF000000FF9C8C6BFF9C8C6BFF0000000000000000000000000000
000000000000000000000000000000000000000000FF000000FF000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF000000FF9C8C6BFF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
0000000000009C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C
6BFF9C8C6BFF9C8C6BFF9C8C6BFF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000009C8C6BFFAD0000FFAD00
00FFAD0000FFAD0000FFAD0000FF000000000000000000000000000000000000
00000000000000000000000000000000000000000000FF2929FF000000000000
00009C8C6BFFFF2929FF940000FF940000FF940000FF8C0000FF9C0000FFFF29
29FFFF2929FFFF2929FF00000000000000000000000000000000000000000000
0000000000007B0000FF00000000FF2929FF9C0000FFA50000FF8C0000FF8400
00FF840000FF840000FF840000FF7B0000FF7B0000FFFF2929FF9C8C6BFF0000
00000000000000000000000000000000000000000000840000FFA50000FFAD00
00FF9C0000FF840000FF840000FF8C0000FF840000FF840000FF8C0000FF8400
00FF840000FF840000FF842910FF9C8C6BFF0000000000000000000000000000
0000000000008C0000FF9C0000FFAD0000FF9C0000FF840808FF9C8C6BFF9C8C
6BFF9C8C6BFF9C8C6BFF9C8C6BFF8C0000FF8C0000FF8C0000FF842908FF9C8C
6BFF00000000000000000000000000000000000000008C0000FF940008FF9C08
08FF940000FF8C1810FF9C8C6BFF000000000000000000000000000000009C8C
6BFF7B1000FF840000FF840000FF942929FF0000000000000000000000000000
0000000000007B0000FF840000FF840000FF840000FF8C0000FFFF2929FF0000
000000000000000000000000000000000000944A42FF8C3121FF942929FF8C29
18FF9C8C6BFF00000000000000000000000000000000940018FF8C0808FF8C08
08FF8C0808FF8C0000FF840000FF000000000000000000000000000000000000
0000000000009C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF00000000000000000000
000000000000000000009C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C6BFF9C8C
6BFF0000000000000000840000FF8C0010FF8C0810FF8C0808FF840808FF8C08
10FF0000000000000000000000000000000000000000A50000FFA50000FFA500
00FFFF2929FF0000000000000000000000000000000000000000000000009C00
00FF9C0000FF940000FF840000FF840000FF9C8C6BFF00000000000000000000
000000000000A50000FF940008FF730000FFA50021FFFF2929FF000000000000
0000000000000000000000000000BD0018FFAD0000FFA50808FF840000FF8408
00FF9C8C6BFF0000000000000000000000000000000000000000A50000FF7B00
00FF8C0000FFA50000FF0000000000000000000000000000000000000000A500
08FF9C0000FF940000FF840000FF8C0800FF9C8C6BFF00000000000000000000
00000000000000000000A50000FF7B0000FF8C0008FF8C0000FFA50000FFAD00
00FFA50000FFAD0000FFA50000FF8C0000FF840000FF8C0000FF8C0000FF8C00
00FF9C8C6BFF00000000000000000000000000000000000000009C8C6BFF8C00
00FF8C0000FF840000FF8C0000FF8C0000FF8C0000FF8C0000FF8C0000FF8400
00FF840000FF9C8C6BFF9C8C6BFF8C0000FF9C8C6BFF00000000000000000000
00000000000000000000000000009C8C6BFF9C8C6BFF8C0000FF840000FF8400
00FF840000FF840000FF840000FF8C0000FF9C8C6BFF9C8C6BFF9C8C6BFF9C8C
6BFF9C8C6BFF0000000000000000000000000000000000000000000000000000
00009C8C6BFF9C8C6BFF8C0000FF8C0000FF8C0000FF8C0000FF8C0000FF9C8C
6BFF000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000009C8C6BFF9C8C6BFF9C8C
6BFF9C8C6BFF9C8C6BFF9C8C6BFF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000FF000000FF000000FF000000FF000000FF0000
00FF000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000FF00FF
00FF00FF00FF00FF00FF00FF00FF000000FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000FF000000FF000000FF000000FF000000FF0000
00FF000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840000FF840000FF840000FF840000FF840000FF840000FF8400
00FF840000FF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FFFF00
FFFF000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF840000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840084FFFF00FFFF840084FF000000FFFFFFFFFFFFFF00FFFFFF
FFFFFFFF00FF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FFFF00
FFFF000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF840000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840084FFFF00FFFF840084FF000000FFFFFFFFFFFFFF00FFFFFF
FFFFFFFF00FF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FFFF00
FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF840000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840084FFFF00FFFF840084FF000000FFFFFFFFFFFFFF00FFFFFF
FFFFFFFF00FF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FFFF00
FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF840000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840084FFFF00FFFF840084FF000000FFFFFFFFFFFFFF00FFFFFF
FFFFFFFF00FF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FFFF00
FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF840000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000840000FF840084FFFF00FFFF840084FF000000FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF840000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000840000FFFF00FFFF840084FF0000
00FF000000FFC6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFF840000FF000000000000
0000000000000000000000000000840000FF840000FF840000FF840000FF8400
00FF840000FF000000FF000000FF848484FF848484FF848484FFFFFFFFFFFFFF
FFFFFFFFFFFF840000FF840000FF840000FF840000FF840000FF840000FF8484
84FF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
84FF848484FF848484FFC6C6C6FFC6C6C6FFFFFFFFFFC6C6C6FFFFFFFFFFC6C6
C6FF848484FF848484FF848484FF848484FF848484FF848484FF848484FF8484
84FF848484FF848484FF848484FF848484FF848484FF848484FF848484FFFFFF
FFFFC6C6C6FFFFFFFFFFC6C6C6FFFFFFFFFFC6C6C6FF848484FF848484FF0000
0000C6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6
C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6
C6FFC6C6C6FFC6C6C6FFC6C6C6FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFBD00
00FFBD0000FFBD0000FFBD0000FFFFFFFFFF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFFFFBD0000FFBD0000FFBD0000FFBD0000FFBD0000FFBD0000FFBD00
00FFBDBD00FF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFFFFBD0000FFBD0000FF00BDBDFF00FF
FFFF00FFFFFF00FFFFFF00FFFFFFBD0000FFBD0000FFBD0000FF000000000000
0000000000000000000000000000000000000000000000000000FFFFFFFFBD00
00FFBD0000FF00BDBDFF00FFFFFF00BDBDFF00BDBDFF00BDBDFF00FFFFFF00BD
BDFFBD0000FFBD0000FF848484FF000000000000000000000000000000000000
00000000000000000000FFFFFFFFBD0000FFBD0000FF00BDBDFF00FFFFFFBD00
00FFBD0000FFBD0000FF00FFFFFF00BDBDFFBD0000FFBD0000FF848484FF0000
00000000000000000000000000000000000000000000FFFFFFFFBD0000FFBD00
00FFBD0000FFBD0000FFBD0000FFBD0000FF00BDBDFF00FFFFFF00FFFFFFBD00
00FFBD0000FFBD0000FFBD0000FF848484FF0000000000000000000000000000
000000000000FFFFFFFFBD0000FFBD0000FFBD0000FFBD0000FFBD0000FF00BD
BDFF00FFFFFF00FFFFFF00BDBDFFBD0000FFBD0000FFBD0000FFBD0000FF8484
84FF0000000000000000000000000000000000000000FFFFFFFFBD0000FFBD00
00FFBD0000FFBD0000FFBD0000FF00FFFFFF00FFFFFF00BDBDFFBD0000FFBD00
00FFBD0000FFBD0000FFBD0000FF848484FF0000000000000000000000000000
000000000000FFFFFFFFBD0000FFBD0000FFBD0000FFBD0000FFBD0000FF00BD
BDFF00FFFFFF00BDBDFFBD0000FFBD0000FFBD0000FFBD0000FFBD0000FF8484
84FF000000000000000000000000000000000000000000000000FFFFFFFFBD00
00FFBD0000FFBD0000FFBD0000FF00BDBDFF00FFFFFF00BDBDFFBD0000FFBD00
00FFBD0000FFBD0000FF848484FF000000000000000000000000000000000000
0000000000000000000000000000BDBD00FFBD0000FFBD0000FFBD0000FF00FF
FFFF00FFFFFF00FFFFFFBD0000FFBD0000FFBD0000FFBD0000FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000BD0000FFBD0000FFBD0000FF00BDBDFF00FFFFFF00BDBDFFBD0000FFBD00
00FFBD0000FFBD0000FF00000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000848484FF848484FFBD00
00FFBD0000FFBD0000FFBD0000FF848484FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000848484FF848484FF848484FF848484FF0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000F7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CE
A5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7FFFFFF000000000000
0000000000000000000000000000000000000000000000000000F7CEA5FFF7CE
A5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CE
A5FFF7CEA5FFF7CEA5FF00000000000000000000000000000000000000000000
00000000000000000000F7CEA5FFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FF
FFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7CEA5FF000000000000
0000000000000000000000000000000000000000000000000000F7FFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF7CEA5FF00000000000000000000000000000000000000000000
00000000000000000000F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CEA5FF00000000FFFF
FFFFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CE
A5FFF7CEA5FFF7CEA5FFF7CEA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF7CEA5FF00000000F7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CE
A5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CEA5FF00000000F7CE
A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFC6A563FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFC6A563FF00000000F7CEA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFC68421FFC66300FFC66300FFC66300FFC66300FFC663
00FFC66300FFC66300FFC66300FFC66300FFC66300FFC66300FFC68442FFF7CE
A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC68400FFC684
00FFC68400FFC68400FFC68400FFC68400FFC68400FFC68400FFC68400FFC684
00FFC68400FFC68400FFC66300FFF7CEA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFF7CEA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC68421FFF7CE
A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C684FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFC68421FFF7CEA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFC6C684FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC68421FFF7CE
A5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFC6C684FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFF7FFFFFFF7CEA5FFC68421FF000000000000000000000000000000000000
00000000000000000000C6C684FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CEA5FFF7CEA5FFC68421FF0000
0000000000000000000000000000000000000000000000000000C6C684FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF7CE
A5FFF7CEA5FFF7CEA5FFC68421FF000000000000000000000000000000000000
00000000000000000000C6C684FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFF7FFFFFFF7CEA5FFF7CEA5FFF7CEA5FFF7CEA5FFC68421FF0000
0000000000000000000000000000000000000000000000000000C68442FFC6A5
84FFC6A584FFC6A584FFC6A584FFC6A563FFC6A563FFC6A563FFC6A563FFC6A5
63FFC6A563FFC6A563FFC66300FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000
}
end
end

View File

@ -0,0 +1,254 @@
{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.delphi-jedi.org
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
unit JvID3v1MainFormU;
{$mode objfpc}{$H+}
interface
uses
//Windows, Messages,
SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, //JvComponent,
StdCtrls, //Mask, //JvToolEdit,
JvId3v1, ComCtrls, //ToolWin,
ActnList, //ImgList,
EditBtn, Spin;
{
JvBaseDlg, JvTipOfDay, JvBalloonHint, JvMaskEdit, JvSpin, JvJVCLAboutForm,
JvExMask;
}
type
{ TJvID3v1MainForm }
TJvID3v1MainForm = class(TForm)
JvFilenameEdit1: TFilenameEdit;
edtTitle: TEdit;
JvId3v11: TJvId3v1;
edtAlbum: TEdit;
edtArtist: TEdit;
edtYear: TEdit;
edtComment: TEdit;
cmbGenre: TComboBox;
lblArtist: TLabel;
lblAlbum: TLabel;
lblYear: TLabel;
lblComment: TLabel;
lblGenre: TLabel;
ActionList1: TActionList;
actSave: TAction;
actRefresh: TAction;
actErase: TAction;
actExit: TAction;
actOnTop: TAction;
actAbout: TAction;
ImageList1: TImageList;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
lblHasTag: TLabel;
// JvTipOfDay1: TJvTipOfDay;
// JvJVCLAboutComponent1: TJvJVCLAboutComponent;
// JvBalloonHint1: TJvBalloonHint;
sedTrack: TSpinEdit;
lblTitle: TLabel;
lblTrack: TLabel;
procedure actAboutExecute(Sender: TObject);
procedure actSaveExecute(Sender: TObject);
procedure actEraseExecute(Sender: TObject);
procedure actExitExecute(Sender: TObject);
procedure actRefreshExecute(Sender: TObject);
procedure actOnTopExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure JvFilenameEdit1AcceptFileName(Sender: TObject; var Value: String);
procedure JvFilenameEdit1KeyPress(Sender: TObject; var Key: Char);
public
procedure ChangeFileNameTo(S: string);
procedure FillGenres(Strings: TStrings);
procedure UpdateCtrls;
procedure UpdateCaption;
end;
var
JvID3v1MainForm: TJvID3v1MainForm;
implementation
uses
JvId3v2Types;
{$R *.lfm}
procedure TJvID3v1MainForm.ChangeFileNameTo(S: string);
begin
JvFilenameEdit1.Text := S;
JvFilenameEdit1.Hint := S;
JvId3v11.FileName := S;
JvId3v11.Open;
UpdateCtrls;
UpdateCaption;
FocusControl(edtTitle);
end;
procedure TJvID3v1MainForm.FillGenres(Strings: TStrings);
begin
ID3_Genres(Strings,true);
end;
procedure TJvID3v1MainForm.actSaveExecute(Sender: TObject);
begin
if JvId3v11.FileName = '' then
// JvBalloonHint1.ActivateHint(JvFilenameEdit1, 'First select a mp3 file', ikError, 'Error', 5000)
else
begin
JvId3v11.SongName := edtTitle.Text;
JvId3v11.Artist := edtArtist.Text;
JvId3v11.Album := edtAlbum.Text;
JvId3v11.Year := edtYear.Text;
JvId3v11.GenreAsString := cmbGenre.Text;
JvId3v11.Comment := edtComment.Text;
JvId3v11.AlbumTrack := sedTrack.Value; //AsInteger;
if JvId3v11.Commit then
UpdateCaption
else
{
JvBalloonHint1.ActivateHint(ToolButton2, 'Could not save changes.'#13+
'The file is probably opened by another application.', ikError, 'Error')}
;
end;
end;
procedure TJvID3v1MainForm.actEraseExecute(Sender: TObject);
begin
if JvId3v11.FileName = '' then
//JvBalloonHint1.ActivateHint(JvFilenameEdit1, 'First select a mp3 file', ikError, 'Error', 5000)
else
begin
JvId3v11.Erase;
UpdateCtrls;
UpdateCaption;
end;
end;
procedure TJvID3v1MainForm.actExitExecute(Sender: TObject);
begin
Close;
end;
procedure TJvID3v1MainForm.actRefreshExecute(Sender: TObject);
begin
if JvId3v11.FileName = '' then
//JvBalloonHint1.ActivateHint(JvFilenameEdit1, 'First select a mp3 file', ikError, 'Error', 5000)
else
ChangeFileNameTo(JvId3v11.FileName);
end;
procedure TJvID3v1MainForm.actOnTopExecute(Sender: TObject);
const
CStyle: array[Boolean] of TFormStyle = (fsNormal, fsStayOnTop);
begin
//JvDragDrop1.AcceptDrag := False;
actOnTop.Checked := not actOnTop.Checked;
FormStyle := CStyle[actOnTop.Checked];
//JvDragDrop1.AcceptDrag := True;
end;
procedure TJvID3v1MainForm.FormCreate(Sender: TObject);
begin
{ This is put in the OnCreate and not in the OnShow event, because we change
Form1.FormStyle at run-time that will trigger the OnShow event }
FillGenres(cmbGenre.Items);
UpdateCaption;
end;
procedure TJvID3v1MainForm.FormDropFiles(Sender: TObject;
const FileNames: array of String);
begin
if Length(FileNames) > 0 then
ChangeFileNameTo(FileNames[0]);
end;
procedure TJvID3v1MainForm.JvFilenameEdit1AcceptFileName(Sender: TObject;
var Value: String);
begin
ChangeFileNameTo(Value);
end;
procedure TJvID3v1MainForm.JvFilenameEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
if JvFilenameEdit1.Text = '' then
//JvBalloonHint1.ActivateHint(JvFilenameEdit1, 'Empty strings are no file names', ikError, 'Error', 5000)
else
ChangeFileNameTo(JvFilenameEdit1.FileName);
end;
end;
procedure TJvID3v1MainForm.UpdateCaption;
const
CHasTagStr: array[Boolean] of string = ('No tag', 'Has Tag');
CHasTagColor: array[Boolean] of TColor = (clRed, clBlack);
var
HasTag: Boolean;
begin
if JvId3v11.FileName > '' then
begin
{ Store TagPresent in variabele to prevent double checks whether the file
has a tag }
HasTag := JvId3v11.HasTag;
lblHasTag.Font.Color := CHasTagColor[HasTag];
lblHasTag.Caption := CHasTagStr[HasTag];
end
else
lblHasTag.Caption := '';
end;
procedure TJvID3v1MainForm.UpdateCtrls;
begin
edtTitle.Text := JvId3v11.SongName;
edtAlbum.Text := JvId3v11.Album;
edtArtist.Text := JvId3v11.Artist;
edtYear.Text := JvId3v11.Year;
edtComment.Text := JvId3v11.Comment;
sedTrack.Value := JvId3v11.AlbumTrack;
cmbGenre.ItemIndex := cmbGenre.Items.IndexOfObject(TObject(PtrInt(JvId3v11.Genre)));
end;
procedure TJvID3v1MainForm.actAboutExecute(Sender: TObject);
begin
//JvJVCLAboutComponent1.Execute;
end;
end.

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<General>
<Flags>
<UseDefaultCompilerOptions Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="JvID3v2Demo"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="0"/>
</RunParams>
<RequiredPackages Count="2">
<Item1>
<PackageName Value="JvMMLazR"/>
</Item1>
<Item2>
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="3">
<Unit0>
<Filename Value="JvID3v2Demo.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="JvID3v2EditFormU.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="JvID3v2EditForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit1>
<Unit2>
<Filename Value="JvID3v2MainFormU.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="JvID3v2MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="JvID3v2Demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,16 @@
program JvID3v2Demo;
uses
Interfaces,
Forms,
JvID3v2MainFormU in 'JvID3v2MainFormU.pas' {JvID3v2MainForm},
JvID3v2EditFormU in 'JvID3v2EditFormU.pas' {JvID3v2EditForm};
{$R *.res}
begin
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TJvID3v2MainForm, JvID3v2MainForm);
Application.Run;
end.

View File

@ -0,0 +1,910 @@
object JvID3v2EditForm: TJvID3v2EditForm
Left = 345
Height = 384
Top = 248
Width = 510
BorderStyle = bsDialog
Caption = 'JvID3v2EditForm'
ClientHeight = 384
ClientWidth = 510
Color = clBtnFace
Font.Color = clWindowText
OnCreate = FormCreate
Position = poMainFormCenter
LCLVersion = '1.9.0.0'
object PageControl1: TPageControl
Left = 121
Height = 344
Top = 40
Width = 389
TabStop = False
ActivePage = tshLyrics
Align = alClient
TabIndex = 1
TabOrder = 0
object tshWinampTags: TTabSheet
Caption = 'tshWinampTags'
ClientHeight = 316
ClientWidth = 381
TabVisible = False
object lblTitle: TLabel
AnchorSideTop.Control = edtTitle
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 51
Height = 15
Top = 8
Width = 26
Anchors = [akTop, akRight]
Caption = '&Title:'
FocusControl = edtTitle
ParentColor = False
end
object lblArtist: TLabel
AnchorSideTop.Control = edtArtist
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 46
Height = 15
Top = 35
Width = 31
Anchors = [akTop, akRight]
Caption = '&Artist:'
FocusControl = edtArtist
ParentColor = False
end
object lblAlbum: TLabel
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 38
Height = 15
Top = 62
Width = 39
Anchors = [akTop, akRight]
Caption = 'Al&bum:'
FocusControl = edtAlbum
ParentColor = False
end
object lblYear: TLabel
AnchorSideTop.Control = edtYear
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 52
Height = 15
Top = 89
Width = 25
Anchors = [akTop, akRight]
Caption = '&Year:'
FocusControl = edtYear
ParentColor = False
end
object lblComposer: TLabel
AnchorSideTop.Control = edtComposer
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 19
Height = 15
Top = 189
Width = 58
Anchors = [akTop, akRight]
Caption = 'Co&mposer:'
FocusControl = edtComposer
ParentColor = False
end
object lblOrigArtist: TLabel
AnchorSideTop.Control = edtOrigArtist
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 17
Height = 15
Top = 216
Width = 60
Anchors = [akTop, akRight]
Caption = '&Orig. Artist:'
FocusControl = edtOrigArtist
ParentColor = False
end
object lblCopyright: TLabel
AnchorSideTop.Control = edtCopyright
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 21
Height = 15
Top = 243
Width = 56
Anchors = [akTop, akRight]
Caption = 'Co&pyright:'
FocusControl = edtCopyright
ParentColor = False
end
object lblURL: TLabel
AnchorSideTop.Control = edtURL
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 53
Height = 15
Top = 270
Width = 24
Anchors = [akTop, akRight]
Caption = '&URL:'
FocusControl = edtURL
ParentColor = False
end
object lblEncodedBy: TLabel
AnchorSideLeft.Control = tshWinampTags
AnchorSideTop.Control = edtEncodedBy
AnchorSideTop.Side = asrCenter
Left = 12
Height = 15
Top = 297
Width = 65
BorderSpacing.Left = 12
Caption = '&Encoded by:'
FocusControl = edtEncodedBy
ParentColor = False
end
object lblGenre: TLabel
AnchorSideLeft.Control = edtYear
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = lblYear
Left = 164
Height = 15
Top = 89
Width = 34
BorderSpacing.Left = 16
Caption = '&Genre:'
FocusControl = cmbGenre
ParentColor = False
end
object lblComment: TLabel
AnchorSideTop.Control = memComment
AnchorSideRight.Control = lblEncodedBy
AnchorSideRight.Side = asrBottom
Left = 20
Height = 15
Top = 112
Width = 57
Anchors = [akTop, akRight]
Caption = '&Comment:'
FocusControl = memComment
ParentColor = False
end
object edtTitle: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = tshWinampTags
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 4
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 0
end
object edtArtist: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtTitle
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 31
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 1
end
object edtAlbum: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtArtist
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 58
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 2
end
object edtYear: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrBottom
Left = 81
Height = 23
Top = 85
Width = 67
BorderSpacing.Top = 4
TabOrder = 3
end
object edtComposer: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = memComment
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 185
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 6
end
object edtOrigArtist: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtComposer
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 212
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 7
end
object edtCopyright: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtOrigArtist
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 239
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 8
end
object edtURL: TEdit
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtCopyright
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 266
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 9
end
object edtEncodedBy: TEdit
AnchorSideLeft.Control = lblEncodedBy
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtURL
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = tshWinampTags
AnchorSideRight.Side = asrBottom
Left = 81
Height = 23
Top = 293
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
BorderSpacing.Bottom = 4
TabOrder = 10
end
object cmbGenre: TComboBox
AnchorSideLeft.Control = lblGenre
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edtAlbum
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 206
Height = 23
Top = 85
Width = 171
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 4
ItemHeight = 15
TabOrder = 4
end
object memComment: TMemo
AnchorSideLeft.Control = edtEncodedBy
AnchorSideTop.Control = edtYear
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = edtEncodedBy
AnchorSideRight.Side = asrBottom
Left = 81
Height = 69
Top = 112
Width = 296
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
Lines.Strings = (
''
)
TabOrder = 5
end
end
object tshLyrics: TTabSheet
Caption = 'tshLyrics'
ClientHeight = 316
ClientWidth = 381
ImageIndex = 1
TabVisible = False
object lblLanguage: TLabel
AnchorSideLeft.Control = tshLyrics
AnchorSideTop.Control = cmbLanguage
AnchorSideTop.Side = asrCenter
Left = 4
Height = 15
Top = 8
Width = 55
BorderSpacing.Left = 4
Caption = 'Language:'
ParentColor = False
end
object lblDescription: TLabel
AnchorSideLeft.Control = memLyrics
AnchorSideTop.Control = edtDescription
AnchorSideTop.Side = asrCenter
Left = 4
Height = 15
Top = 240
Width = 63
Caption = 'Description:'
ParentColor = False
end
object lblWriter: TLabel
AnchorSideTop.Control = edtWriter
AnchorSideTop.Side = asrCenter
Left = 8
Height = 15
Top = 267
Width = 35
Caption = 'Writer:'
ParentColor = False
end
object cmbLanguage: TComboBox
AnchorSideLeft.Control = lblLanguage
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = tshLyrics
Left = 67
Height = 23
Top = 4
Width = 145
BorderSpacing.Left = 8
BorderSpacing.Top = 4
ItemHeight = 15
Sorted = True
TabOrder = 0
end
object memLyrics: TMemo
AnchorSideLeft.Control = tshLyrics
AnchorSideTop.Control = cmbLanguage
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = tshLyrics
AnchorSideRight.Side = asrBottom
Left = 4
Height = 201
Top = 31
Width = 373
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
TabOrder = 1
end
object edtDescription: TEdit
AnchorSideLeft.Control = lblDescription
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = memLyrics
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = memLyrics
AnchorSideRight.Side = asrBottom
Left = 75
Height = 23
Top = 236
Width = 302
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 4
TabOrder = 2
end
object edtWriter: TEdit
AnchorSideLeft.Control = edtDescription
AnchorSideTop.Control = edtDescription
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = memLyrics
AnchorSideRight.Side = asrBottom
Left = 75
Height = 23
Top = 263
Width = 302
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 3
end
end
object tshPictures: TTabSheet
Caption = 'tshPictures'
ClientHeight = 316
ClientWidth = 381
ImageIndex = 2
TabVisible = False
object imgPicture: TImage
AnchorSideLeft.Control = lsvPictures
AnchorSideTop.Control = lsvPictures
AnchorSideTop.Side = asrBottom
Left = 4
Height = 120
Top = 170
Width = 120
BorderSpacing.Top = 8
Stretch = True
end
object lblPictureName: TLabel
AnchorSideLeft.Control = btnChange
AnchorSideTop.Control = edtPictureName
AnchorSideTop.Side = asrCenter
Left = 136
Height = 15
Top = 236
Width = 35
Caption = 'Name:'
ParentColor = False
end
object lblPictureType: TLabel
AnchorSideLeft.Control = lblPictureName
AnchorSideTop.Control = cmbPictureType
AnchorSideTop.Side = asrCenter
Left = 136
Height = 15
Top = 263
Width = 28
Caption = 'Type:'
ParentColor = False
end
object lsvPictures: TListView
AnchorSideLeft.Control = tshPictures
AnchorSideTop.Control = tshPictures
AnchorSideRight.Control = tshPictures
AnchorSideRight.Side = asrBottom
Left = 4
Height = 158
Top = 4
Width = 373
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
Columns = <
item
Caption = 'Name'
Width = 150
end
item
Caption = 'Type'
Width = 70
end
item
Caption = 'Format'
Width = 70
end
item
Caption = 'Size'
end>
HideSelection = False
ReadOnly = True
RowSelect = True
TabOrder = 0
ViewStyle = vsReport
OnClick = lsvPicturesClick
end
object edtPictureName: TEdit
AnchorSideLeft.Control = lblPictureName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnChange
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = lsvPictures
AnchorSideRight.Side = asrBottom
Left = 179
Height = 23
Top = 232
Width = 198
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 8
TabOrder = 5
end
object cmbPictureType: TComboBox
AnchorSideLeft.Control = edtPictureName
AnchorSideTop.Control = edtPictureName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = lsvPictures
AnchorSideRight.Side = asrBottom
Left = 179
Height = 23
Top = 259
Width = 198
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
ItemHeight = 15
Sorted = True
TabOrder = 6
end
object btnChange: TButton
AnchorSideLeft.Control = btnAdd
AnchorSideTop.Control = btnAdd
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = btnAdd
AnchorSideRight.Side = asrBottom
Left = 136
Height = 25
Top = 199
Width = 75
Action = actChangePicture
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
TabOrder = 4
end
object btnAdd: TButton
AnchorSideLeft.Control = imgPicture
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = imgPicture
Left = 136
Height = 25
Top = 170
Width = 75
Action = actAddPicture
BorderSpacing.Left = 12
TabOrder = 1
end
object btnDelete: TButton
AnchorSideLeft.Control = btnAdd
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnAdd
Left = 215
Height = 25
Top = 170
Width = 75
Action = actDeletePicture
BorderSpacing.Left = 4
TabOrder = 2
end
object btnSave: TButton
AnchorSideLeft.Control = btnDelete
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnAdd
Left = 294
Height = 25
Top = 170
Width = 75
Action = actSavePicture
BorderSpacing.Left = 4
TabOrder = 3
end
end
object tshAllFrames: TTabSheet
Caption = 'tshAllFrames'
ClientHeight = 316
ClientWidth = 381
ImageIndex = 3
TabVisible = False
object lsvAllFrames: TListView
Left = 4
Height = 308
Top = 4
Width = 373
Align = alClient
BorderSpacing.Around = 4
Columns = <
item
Caption = 'Name'
end
item
Caption = 'Supported'
Width = 70
end
item
Caption = 'Description'
Width = 226
end>
ParentShowHint = False
ReadOnly = True
RowSelect = True
ShowHint = True
TabOrder = 0
ViewStyle = vsReport
end
end
end
object lsbNavigator: TListBox
Left = 0
Height = 344
Top = 40
Width = 121
Align = alLeft
Items.Strings = (
'Winamp tags'
'Lyrics'
'Pictures'
'All Frames'
)
ItemHeight = 15
OnClick = lsbNavigatorClick
TabOrder = 1
end
object ToolBar1: TToolBar
Left = 0
Height = 40
Top = 0
Width = 510
ButtonHeight = 36
ButtonWidth = 72
Caption = 'ToolBar1'
Images = iml16
ShowCaptions = True
TabOrder = 2
object ToolButton1: TToolButton
Left = 1
Top = 2
Action = actOK
end
object ToolButton2: TToolButton
Left = 73
Top = 2
Action = actCancel
end
object ToolButton3: TToolButton
Left = 145
Top = 2
Action = actRemove
end
object ToolButton5: TToolButton
Left = 217
Top = 2
Action = actCopyFromv1
end
object ToolButton4: TToolButton
Left = 299
Top = 2
Action = actCopyTov1
end
end
object acl16: TActionList
Images = iml16
left = 40
top = 112
object actOK: TAction
Caption = 'OK'
ImageIndex = 1
OnExecute = actOKExecute
end
object actCancel: TAction
Caption = 'Cancel'
ImageIndex = 0
OnExecute = actCancelExecute
end
object actRemove: TAction
Caption = 'Remove'
ImageIndex = 2
OnExecute = actRemoveExecute
end
object actAddPicture: TAction
Caption = 'Add'
OnExecute = actAddPictureExecute
end
object actDeletePicture: TAction
Caption = 'Delete'
OnExecute = actDeletePictureExecute
OnUpdate = ItemSelected
end
object actSavePicture: TAction
Caption = 'Save'
OnExecute = actSavePictureExecute
OnUpdate = ItemSelected
end
object actChangePicture: TAction
Caption = 'Change'
OnExecute = actChangePictureExecute
OnUpdate = ItemSelected
end
object actCopyTov1: TAction
Caption = 'Copy to v1'
ImageIndex = 4
OnExecute = actCopyTov1Execute
end
object actCopyFromv1: TAction
Caption = 'Copy From v1'
ImageIndex = 3
OnExecute = actCopyFromv1Execute
end
end
object iml16: TImageList
left = 40
top = 176
Bitmap = {
4C69050000001000000010000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000FF0000
00FF0000000000000000000000000000000000000000000000FF000000FF9C8C
6FFF0000000000000000000000000000000000000000000000FF9999FFFF9999
FFFF000000FF000000000000000000000000000000FF9999FFFF9999FFFF0000
00FF9C8C6FFF00000000000000000000000000000000000000FF9999FFFF0000
FFFF2600C4FF000000FF00000000000000FF9999FFFF0000FFFF000099FF0000
00FF9C8C6FFF0000000000000000000000000000000000000000000000FF2600
C4FF0000FFFF2600C4FF000000FF9999FFFF0000FFFF000099FF000000FF9C8C
6FFF9C8C6FFF0000000000000000000000000000000000000000000000000000
00FF2600C4FF0000FFFF9999FFFF0000FFFF000099FF000000FF9C8C6FFF9C8C
6FFF000000000000000000000000000000000000000000000000000000000000
0000000000FF0000FFFF0000FFFF0000FFFF000000FF9C8C6FFF9C8C6FFF0000
0000000000000000000000000000000000000000000000000000000000000000
00FF9999FFFF0000FFFF2600C4FF0000FFFF2600C4FF000000FF9C8C6FFF0000
0000000000000000000000000000000000000000000000000000000000FF9999
FFFF0000FFFF000099FF000000FF2600C4FF0000FFFF2600C4FF000000FF9C8C
6FFF0000000000000000000000000000000000000000000000FF9999FFFF0000
FFFF000099FF000000FF9C8C6FFF000000FF2600C4FF0000FFFF000099FF0000
00FF9C8C6FFF00000000000000000000000000000000000000FF9999FFFF0000
99FF000000FF9C8C6FFF9C8C6FFF9C8C6FFF000000FF000099FF000099FF0000
00FF9C8C6FFF000000000000000000000000000000009C8C6FFF000000FF0000
00FF9C8C6FFF9C8C6FFF00000000000000009C8C6FFF000000FF000000FF9C8C
6FFF0000000000000000000000000000000000000000000000009C8C6FFF9C8C
6FFF9C8C6FFF000000000000000000000000000000009C8C6FFF9C8C6FFF0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00FF000000FF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000FF00C0
92FF19A64DFF000000FF00000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000FF00C092FF19A6
4DFF0C4D24FF000000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000000000FF00C092FF19A64DFF0C4D
24FF000000FF9C8C6FFF000000000000000000000000000000FF000000FF0000
0000000000000000000000000000000000FF00C092FF19A64DFF0C4D24FF0000
00FF9C8C6FFF9C8C6FFF0000000000000000000000FF19A64DFF19A64DFF0000
00FF0000000000000000000000FF00C092FF19A64DFF0C4D24FF000000FF9C8C
6FFF9C8C6FFF000000000000000000000000000000FF19A64DFF00C092FF0000
00FF000000FF000000FF00C092FF19A64DFF0C4D24FF000000FF9C8C6FFF9C8C
6FFF000000000000000000000000000000009C8C6FFF000000FF19A64DFF00C0
92FF000000FF00C092FF19A64DFF0C4D24FF000000FF9C8C6FFF9C8C6FFF0000
00000000000000000000000000000000000000000000000000FF19A64DFF19A6
4DFF00C092FF19A64DFF0C4D24FF000000FF9C8C6FFF9C8C6FFF000000000000
000000000000000000000000000000000000000000009C8C6FFF000000FF19A6
4DFF19A64DFF0C4D24FF000000FF9C8C6FFF9C8C6FFF00000000000000000000
0000000000000000000000000000000000000000000000000000000000FF0C4D
24FF0C4D24FF000000FF9C8C6FFF9C8C6FFF0000000000000000000000000000
00000000000000000000000000000000000000000000000000009C8C6FFF0000
00FF000000FF9C8C6FFF9C8C6FFF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000009C8C
6FFF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000FF000000FF000000FF000000FF000000FF000000FF000000000000
00000000000000000000000000000000000000000000000000FF000000FF0000
00FF000000FFBFBFBFFFFFFFFFFFBFBFBFFFBFBFBFFF000000FF000000FF0000
00FF000000FF00000000000000000000000000000000000000FFBFBFBFFFFFFF
FFFFFFFFFFFFBFBFBFFFBFBFBFFFC0928FFFC0928FFF9C8C6FFF9C8C6FFF9C8C
6FFF000000FF9C8C6FFF000000000000000000000000000000FF000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF9C8C6FFF00000000000000000000000000000000000000FF9C8C
6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFC0928FFFF9EED9FF9C8C6FFFC0928FFF404040FF9C8C6FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFF9EED9FFC0928FFFBFBFBFFF666666FFD1A78FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFF9EED9FFC0928FFFBFBFBFFF666666FFD1A78FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFF9EED9FFC0928FFFBFBFBFFF666666FFD1A78FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFF9EED9FFC0928FFFBFBFBFFF666666FFD1A78FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFF9EED9FFC0928FFFBFBFBFFF666666FFD1A78FFF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFF9EED9FFBFBFBFFFBFBFBFFFC0928FFFC0928FFF666666FF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FFBFBF
BFFFFFFFFFFFBFBFBFFFBFBFBFFFC0928FFFC0928FFF666666FF666666FF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF9C8C6FFF9C8C6FFF00000000000000000000000000000000000000009C8C
6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C6FFF9C8C
6FFF9C8C6FFF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000FF000000FF0000
00FF000000FF000000FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000336666FF6D9FC7FFCCCCFFFFE6E6
E6FFCCCCFFFFA6A6A6FF000000FF000000000000000000000000000000FF0000
00FF000000000000000000000000336666FF4E7EA6FF6D9FC7FF6D9FC7FF0000
00FF6D9FC7FF6D9FC7FF4E7EA6FF000000FF0000000000000000000000FF00FF
FFFF000000FF0000000000000000204A6EFF4E7EA6FF4E7EA6FF000000FF0000
00FF6D9FC7FF57B3F7FF4E7EA6FF000000FF000000FF000000FF000000FF00FF
FFFF00FFFFFF000000FF000000004E7EA6FF57B3F7FF57B3F7FF57B3F7FF0000
00FF57B3F7FF57B3F7FF0099FFFF000000FFD6FFFFFFD6FFFFFFD6FFFFFF00FF
FFFF00FFFFFF00FFFFFF000000FF4E7EA6FF57B3F7FF57B3F7FF57B3F7FF0000
00FF58D2E8FF58D2E8FF57B3F7FF336666FF00FFFFFF00FFFFFF00FFFFFF00FF
FFFF00FFFFFF58D2E8FF000000FF4E7EA6FF57B3F7FF58D2E8FF99CCFFFF0000
00FF58D2E8FF58D2E8FF57B3F7FF336666FF000000FF000000FF000000FF00FF
FFFF58D2E8FF000000FF9C8C6FFF4E7EA6FF6D9FC7FF58D2E8FF9EF0FFFF0000
00FF9EF0FFFF9EF0FFFF58D2E8FF336666FF9C8C6FFF9C8C6FFF000000FF58D2
E8FF000000FF9C8C6FFF00000000000000004E7EA6FF6BD2B8FF58D2E8FF9EF0
FFFF9EF0FFFF6BD2B8FF336666FF000000000000000000000000000000FF0000
00FF9C8C6FFF00000000000000000000000000000000336666FF4E7EA6FF6699
99FF4E7EA6FF336666FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000FF000000FF000000FF0000
00FF000000FF00000000000000000000000000000000000000FF000000FF0000
00000000000000000000000000003C696EFF8591BBFFC5CDEBFFD9DFF6FFC6D5
EFFF929FC7FF000000FF000000000000000000000000000000FF00FFFFFF0000
00FF00000000000000003C696EFF3F5EA6FF6DA0DEFF82A0D9FF000000FF7AAF
D1FF6EA8D8FF4F7ABDFF000000FF000000FF000000FF000000FF00FFFFFF00FF
FFFF000000FF00000000335493FF3775C7FF3985D0FF000000FF000000FF489B
C5FF3C9BD3FF3281D0FF000000FFD6FFFFFFD6FFFFFFD6FFFFFF00FFFFFF00FF
FFFF00FFFFFF000000FF2860A2FF318EDCFF3C9EEAFF579FEAFF000000FF49B1
DDFF3AB1E9FF2D98E7FF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
FFFF58D2E8FF000000FF3477B1FF3BA9EDFF55C3FFFF75C6FFFF000000FF64CC
E6FF55CDF4FF42B4F5FF437377FF000000FF000000FF000000FF00FFFFFF58D2
E8FF000000FF9C8C6FFF407FACFF4AB7F0FF65D7FFFF87DAFFFF000000FF78E0
EAFF68E2F7FF56C7F9FF437377FF9C8C6FFF9C8C6FFF000000FF58D2E8FF0000
00FF9C8C6FFF000000004D7D99FF50ACD6FF74E3FCFF91EBFFFF000000FF80EE
ECFF7AF0F9FF66CCEDFF437377FF0000000000000000000000FF000000FF9C8C
6FFF000000000000000000000000477383FF66BFCFFF7AE4ECFF84F2F7FF7CEB
EDFF6BCAD3FF3C696EFF00000000000000000000000000000000000000000000
0000000000000000000000000000000000003C696EFF447F83FF519192FF4A86
87FF437377FF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000
}
end
object JvID3v21: TJvID3v2
Active = False
ProcessPictures = True
left = 40
top = 240
end
end

View File

@ -0,0 +1,720 @@
{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.delphi-jedi.org
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
unit JvID3v2EditFormU;
{$mode objfpc}{$H+}
interface
uses
//Windows,
SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ActnList, StdCtrls, ExtCtrls,
JvID3v2Base, JvId3v2; //, JvComponent, ImgList, ToolWin; //, JvComponentBase;
type
TJvID3v2EditForm = class(TForm)
PageControl1: TPageControl;
lsbNavigator: TListBox;
ToolBar1: TToolBar;
tshWinampTags: TTabSheet;
tshLyrics: TTabSheet;
tshPictures: TTabSheet;
lblTitle: TLabel;
lblArtist: TLabel;
lblAlbum: TLabel;
lblYear: TLabel;
lblComposer: TLabel;
lblOrigArtist: TLabel;
lblCopyright: TLabel;
lblURL: TLabel;
lblEncodedBy: TLabel;
edtTitle: TEdit;
edtArtist: TEdit;
edtAlbum: TEdit;
edtYear: TEdit;
edtComposer: TEdit;
edtOrigArtist: TEdit;
edtCopyright: TEdit;
edtURL: TEdit;
edtEncodedBy: TEdit;
cmbGenre: TComboBox;
lblGenre: TLabel;
memComment: TMemo;
lblComment: TLabel;
acl16: TActionList;
iml16: TImageList;
actOK: TAction;
actCancel: TAction;
actRemove: TAction;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
JvID3v21: TJvID3v2;
lblLanguage: TLabel;
cmbLanguage: TComboBox;
memLyrics: TMemo;
lblDescription: TLabel;
lblWriter: TLabel;
edtDescription: TEdit;
edtWriter: TEdit;
lsvPictures: TListView;
imgPicture: TImage;
actAddPicture: TAction;
actDeletePicture: TAction;
actSavePicture: TAction;
lblPictureName: TLabel;
lblPictureType: TLabel;
edtPictureName: TEdit;
cmbPictureType: TComboBox;
tshAllFrames: TTabSheet;
lsvAllFrames: TListView;
btnChange: TButton;
actChangePicture: TAction;
btnAdd: TButton;
btnDelete: TButton;
btnSave: TButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
actCopyTov1: TAction;
actCopyFromv1: TAction;
procedure actOKExecute(Sender: TObject);
procedure actCancelExecute(Sender: TObject);
procedure actRemoveExecute(Sender: TObject);
procedure actAddPictureExecute(Sender: TObject);
procedure actDeletePictureExecute(Sender: TObject);
procedure actSavePictureExecute(Sender: TObject);
procedure lsvPicturesClick(Sender: TObject);
procedure lsbNavigatorClick(Sender: TObject);
procedure actChangePictureExecute(Sender: TObject);
procedure ItemSelected(Sender: TObject);
procedure actCopyTov1Execute(Sender: TObject);
procedure actCopyFromv1Execute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lsvAllFramesInfoTip(Sender: TObject; Item: TListItem;
var InfoTip: String);
private
FTagDeleted: Boolean;
protected
procedure Init;
procedure Final;
procedure InitAllFramesTab;
procedure TagToCtrls;
procedure CtrlsToTag;
procedure FillPictureTypes(Strings: TStrings);
class function Instance: TJvID3v2EditForm;
public
class function Execute(const AFileName: string): Boolean;
end;
implementation
uses
ExtDlgs,
JvID3v2Types;
{$R *.lfm}
var
CFrameDescriptions: array[TJvID3FrameID] of string = (
'Error', {fiErrorFrame}
'Padding', {fiPaddingFrame}
'No known frame', {fiNoFrame}
'Audio encryption', {fiAudioCrypto}
'Attached picture', {fiPicture}
'Audio seek point index', {fiAudioSeekPoint}
'Comments', {fiComment}
'Commercial frame', {fiCommercial}
'Encryption method registration', {fiCryptoReg}
'Equalisation (2)', {fiEqualization2}
'Equalization', {fiEqualization}
'Event timing codes', {fiEventTiming}
'General encapsulated object', {fiGeneralObject}
'Group identification registration', {fiGroupingReg}
'Involved people list', {fiInvolvedPeople}
'Linked information', {fiLinkedInfo}
'Music CD identifier', {fiCDID}
'MPEG location lookup table', {fiMPEGLookup}
'Ownership frame', {fiOwnership}
'Private frame', {fiPrivate}
'Play counter', {fiPlayCounter}
'Popularimeter', {fiPopularimeter}
'Position synchronisation frame', {fiPositionsync}
'Recommended buffer size', {fiBufferSize}
'Relative volume adjustment (2)', {fiVolumeAdj2}
'Relative volume adjustment', {fiVolumeAdj}
'Reverb', {fiReverb}
'Seek frame', {fiSeekFrame}
'Signature frame', {fiSignature}
'Synchronized lyric/text', {fiSyncedLyrics}
'Synchronized tempo codes', {fiSyncedTempo}
'Album/Movie/Show title', {fiAlbum}
'BPM (beats per minute)', {fiBPM}
'Composer', {fiComposer}
'Content type', {fiContentType}
'Copyright message', {fiCopyright}
'Date', {fiDate}
'Encoding time', {fiEncodingTime}
'Playlist delay', {fiPlaylistDelay}
'Original release time', {fiOrigReleaseTime}
'Recording time', {fiRecordingTime}
'Release time', {fiReleaseTime}
'Tagging time', {fiTaggingTime}
'Involved people list', {fiInvolvedPeople2}
'Encoded by', {fiEncodedBy}
'Lyricist/Text writer', {fiLyricist}
'File type', {fiFileType}
'Time', {fiTime}
'Content group description', {fiContentGroup}
'Title/songname/content description', {fiTitle}
'Subtitle/Description refinement', {fiSubTitle}
'Initial key', {fiInitialKey}
'Language(s)', {fiLanguage}
'Length', {fiSongLen}
'Musician credits list', {fiMusicianCreditList}
'Media type', {fiMediaType}
'Mood', {fiMood}
'Original album/movie/show title', {fiOrigAlbum}
'Original filename', {fiOrigFileName}
'Original lyricist(s)/text writer(s)', {fiOrigLyricist}
'Original artist(s)/performer(s)', {fiOrigArtist}
'Original release year', {fiOrigYear}
'File owner/licensee', {fiFileOwner}
'Lead performer(s)/Soloist(s)', {fiLeadArtist}
'Band/orchestra/accompaniment', {fiBand}
'Conductor/performer refinement', {fiConductor}
'Interpreted, remixed, or otherwise modified by', {fiMixArtist}
'Part of a set', {fiPartInSet}
'Produced notice', {fiProducedNotice}
'Publisher', {fiPublisher}
'Track number/Position in set', {fiTrackNum}
'Recording dates', {fiRecordingDates}
'Internet radio station name', {fiNetRadioStation}
'Internet radio station owner', {fiNetRadioOwner}
'Size', {fiSize}
'Album sort order', {fiAlbumSortOrder}
'Performer sort order', {fiPerformerSortOrder}
'Title sort order', {fiTitleSortOrder}
'ISRC (international standard recording code)', {fiISRC}
'Software/Hardware and settings used for encoding', {fiEncoderSettings}
'Set subtitle', {fiSetSubTitle}
'User defined text information', {fiUserText}
'Year', {fiYear}
'Unique file identifier', {fiUniqueFileID}
'Terms of use', {fiTermsOfUse}
'Unsynchronized lyric/text transcription', {fiUnsyncedLyrics}
'Commercial information', {fiWWWCommercialInfo}
'Copyright/Legal information', {fiWWWCopyright}
'Official audio file webpage', {fiWWWAudioFile}
'Official artist/performer webpage', {fiWWWArtist}
'Official audio source webpage', {fiWWWAudioSource}
'Official internet radio station homepage', {fiWWWRadioPage}
'Payment', {fiWWWPayment}
'Official publisher webpage', {fiWWWPublisher}
'User defined URL link', {fiWWWUser}
'Encrypted meta frame', {fiMetaCrypto}
'Compressed meta frame' {fiMetaCompression}
);
CPictureTypeStr: array[TJvID3PictureType] of string = (
'Other',
'32x32 pixels ''file icon'' (PNG only)',
'Other file icon',
'Cover (front)',
'Cover (back)',
'Leaflet page',
'Media (e.g. lable side of CD)',
'Lead artist/lead performer/soloist',
'Artist/performer',
'Conductor',
'Band/Orchestra',
'Composer',
'Lyricist/text writer',
'Recording Location',
'During recording',
'During performance',
'Movie/video screen capture',
'A bright coloured fish',
'Illustration',
'Band/artist logotype',
'Publisher/Studio logotype'
);
procedure SetPictureListItemTo(ListItem: TListItem; Frame: TJvID3PictureFrame);
begin
with ListItem, Frame do
begin
Caption := Description;
while SubItems.Count < 3 do
SubItems.Add('');
SubItems[0] := CPictureTypeStr[PictureType]; //Type
SubItems[1] := string(MIMEType); //Format
SubItems[2] := IntToStr(DataSize); //Size
Data := Frame;
end;
end;
procedure TJvID3v2EditForm.FormCreate(Sender: TObject);
begin
FillPictureTypes(cmbPictureType.Items);
ISO_639_2Names(cmbLanguage.Items);
ID3_Genres(cmbGenre.Items);
end;
procedure TJvID3v2EditForm.actOKExecute(Sender: TObject);
var
HasTag: Boolean;
Version: TJvID3Version;
lCursor: TCursor;
begin
lCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
try
CtrlsToTag;
JvID3v21.Frames.RemoveEmptyFrames;
HasTag := True;
if JvID3v21.FrameCount = 0 then
GetID3v2Version(JvID3v21.FileName, HasTag, Version);
if HasTag then
JvID3v21.Commit;
ModalResult := mrOk;
finally
Screen.Cursor := lCursor;
end;
end;
procedure TJvID3v2EditForm.actCancelExecute(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TJvID3v2EditForm.actRemoveExecute(Sender: TObject);
var
lCursor: TCursor;
begin
if MessageDlg('Remove tag?', mtConfirmation, mbOKCancel, 0) <> mrOk then
Exit;
lCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
try
JvID3v21.Erase;
FTagDeleted := True;
TagToCtrls;
finally
Screen.Cursor := lCursor;
end;
end;
class function TJvID3v2EditForm.Execute(const AFileName: string): Boolean;
begin
with TJvID3v2EditForm.Instance do
try
JvID3v21.FileName := AFileName;
Init;
try
Result := (ShowModal = mrOk) or FTagDeleted;
finally
Final;
end;
finally
Hide;
end;
end;
procedure TJvID3v2EditForm.Init;
begin
Caption := Format('Edit ''%s''', [ExtractFileName(JvID3v21.FileName)]);
JvID3v21.Open;
TagToCtrls;
imgPicture.Picture.Assign(nil);
lsbNavigator.ItemIndex := 0;
PageControl1.ActivePage := tshWinampTags;
end;
function ChangeYear(const ADateTime: TDateTime; const NewYear: Word): TDateTime;
var
OldYear, Month, Day: Word;
begin
DecodeDate(ADateTime, OldYear, Month, Day);
Result := EncodeDate(NewYear, Month, Day);
end;
procedure TJvID3v2EditForm.CtrlsToTag;
//procedure SetFirstOfList(Strings: {$IFDEF COMPILER12_UP}TStrings{$ELSE}TWideStrings{$ENDIF COMPILER12_UP}; const S: string);
procedure SetFirstOfList(Strings: TStrings; const S: String);
begin
if Strings.Count > 0 then
Strings[0] := S
else
Strings.Add(S);
end;
begin
{ WinAmp tags }
{ WinAmp treats some tags as single line tags; mimic this behaviour by
using function SetFirstOfList }
JvID3v21.Texts.Title := edtTitle.Text;
SetFirstOfList(JvID3v21.Texts.LeadArtist, edtArtist.Text);
JvID3v21.Texts.Album := edtAlbum.Text;
{ The 'year' tag is replaced by the 'recordingtime' tag in v2.4 }
if JvID3v21.WriteVersion = ive2_4 then
JvID3v21.Texts.RecordingTime := ChangeYear(JvID3v21.Texts.RecordingTime, StrToIntDef(edtYear.Text, 0))
else
JvID3v21.Texts.Year := StrToIntDef(edtYear.Text, 0);
SetFirstOfList(JvID3v21.Texts.ContentType, NiceGenreToGenre(cmbGenre.Text));
{ Note that WinAmp doesn't care about other properties than Text of TJvID3ContentFrame }
TJvID3ContentFrame.FindOrCreate(JvID3v21, fiComment).Text := memComment.Lines.Text;
SetFirstOfList(JvID3v21.Texts.Composer, edtComposer.Text);
SetFirstOfList(JvID3v21.Texts.OrigArtist, edtOrigArtist.Text);
JvID3v21.Texts.Copyright := edtCopyright.Text;
{ Note that WinAmp doesn't care about other properties than URL of TJvID3URLUserFrame }
TJvID3URLUserFrame.FindOrCreate(JvID3v21, 0).URL := AnsiString(edtURL.Text);
JvID3v21.Texts.EncodedBy := edtEncodedBy.Text;
{ Lyrics }
with TJvID3ContentFrame.FindOrCreate(JvID3v21, fiUnsyncedLyrics) do
begin
Language := ISO_639_2NameToCode(cmbLanguage.Text);
Text := memLyrics.Lines.Text;
Description := edtDescription.Text;
end;
SetFirstOfList(JvID3v21.Texts.Lyricist, edtWriter.Text);
end;
function YearOf(const ADateTime: TDateTime): Word;
var
D1, D2: Word;
begin
DecodeDate(ADateTime, Result, D1, D2);
end;
procedure TJvID3v2EditForm.TagToCtrls;
//function GetFirstOfList(Strings: {$IFDEF COMPILER12_UP}TStrings{$ELSE}TWideStrings{$ENDIF COMPILER12_UP}): string;
function GetFirstOfList(Strings: TStrings): String;
begin
if Strings.Count > 0 then
Result := Strings[0]
else
Result := '';
end;
var
Frame: TJvID3Frame;
begin
{ Determine which frames are in the tag before calls to JvID3v21.Texts.xxx and
FindOrCreate because those functions might create frames. }
InitAllFramesTab;
{ WinAmp tags }
{ WinAmp treats some tags as single line tags; mimic this behaviour by
using function GetFirstOfList }
edtTitle.Text := JvID3v21.Texts.Title;
edtArtist.Text := GetFirstOfList(JvID3v21.Texts.LeadArtist);
edtAlbum.Text := JvID3v21.Texts.Album;
{ The 'year' tag is replaced by the 'recordingtime' tag in v2.4 }
if JvID3v21.Version = ive2_4 then
edtYear.Text := IntToStr(YearOf(JvID3v21.Texts.RecordingTime))
else
edtYear.Text := IntToStr(JvID3v21.Texts.Year);
cmbGenre.Text := GenreToNiceGenre(GetFirstOfList(JvID3v21.Texts.ContentType));
{ Note that WinAmp doesn't care about other properties than Text of TJvID3ContentFrame }
memComment.Lines.Text := TJvID3ContentFrame.FindOrCreate(JvID3v21, fiComment).Text;
edtComposer.Text := GetFirstOfList(JvID3v21.Texts.Composer);
edtOrigArtist.Text := GetFirstOfList(JvID3v21.Texts.OrigArtist);
edtCopyright.Text := JvID3v21.Texts.Copyright;
{ Note that WinAmp doesn't care about other properties than URL of TJvID3URLUserFrame }
edtURL.Text := string(TJvID3URLUserFrame.FindOrCreate(JvID3v21, 0).URL);
edtEncodedBy.Text := JvID3v21.Texts.EncodedBy;
{ Lyrics }
with TJvID3ContentFrame.FindOrCreate(JvID3v21, fiUnsyncedLyrics) do
begin
cmbLanguage.ItemIndex := cmbLanguage.Items.IndexOf(string(ISO_639_2CodeToName(Language)));
memLyrics.Lines.Text := Text;
edtDescription.Text := Description;
end;
edtWriter.Text := GetFirstOfList(JvID3v21.Texts.Lyricist);
{ Pictures }
lsvPictures.Items.BeginUpdate;
try
lsvPictures.Items.Clear;
if JvID3v21.FindFirstFrame(fiPicture, Frame) then
repeat
if Frame is TJvID3PictureFrame then
SetPictureListItemTo(lsvPictures.Items.Add, TJvID3PictureFrame(Frame));
until not JvID3v21.FindNextFrame(fiPicture, Frame);
finally
lsvPictures.Items.EndUpdate;
end;
end;
procedure TJvID3v2EditForm.actAddPictureExecute(Sender: TObject);
var
Frame: TJvID3PictureFrame;
begin
if cmbPictureType.ItemIndex < 0 then
begin
MessageDlg('Select a picture type', mtError, [mbOK], 0);
FocusControl(cmbPictureType);
Exit;
end;
with TOpenPictureDialog.Create(Application) do
try
if not Execute then
Exit;
Frame := TJvID3PictureFrame(JvID3v21.AddFrame(fiPicture));
with Frame do
begin
with cmbPictureType do
PictureType := TJvID3PictureType(Items.Objects[ItemIndex]);
Description := edtPictureName.Text;
MIMEType := AnsiString(ExtToMIMEType(ExtractFileExt(FileName)));
LoadFromFile(FileName);
lsvPictures.Items.BeginUpdate;
try
SetPictureListItemTo(lsvPictures.Items.Add, Frame);
finally
lsvPictures.Items.EndUpdate;
end;
end;
finally
Free;
end;
end;
procedure TJvID3v2EditForm.actDeletePictureExecute(Sender: TObject);
begin
if not Assigned(lsvPictures.Selected) then
Exit;
JvID3v21.Frames.Remove(TJvID3Frame(lsvPictures.Selected.Data));
lsvPictures.Items.Delete(lsvPictures.Selected.Index);
imgPicture.Picture.Assign(nil);
end;
procedure TJvID3v2EditForm.actSavePictureExecute(Sender: TObject);
var
Frame: TJvID3PictureFrame;
begin
if not Assigned(lsvPictures.Selected) then
Exit;
Frame := TJvID3PictureFrame(lsvPictures.Selected.Data);
if Assigned(Frame) and (Frame.DataSize > 0) and (Frame.MIMEType <> '-->') then
with TSavePictureDialog.Create(Application) do
try
if Execute then
Frame.SaveToFile(FileName);
finally
Free;
end;
end;
procedure TJvID3v2EditForm.lsvPicturesClick(Sender: TObject);
var
Frame: TJvID3PictureFrame;
begin
if Assigned(lsvPictures.Selected) then
Frame := TJvID3PictureFrame(lsvPictures.Selected.Data)
else
Frame := nil;
if Assigned(Frame) then
begin
edtPictureName.Text := Frame.Description;
with cmbPictureType do
ItemIndex := Items.IndexOfObject(TObject(Frame.PictureType));
end;
imgPicture.Picture.Assign(Frame);
end;
procedure TJvID3v2EditForm.lsbNavigatorClick(Sender: TObject);
begin
case lsbNavigator.ItemIndex of
0: PageControl1.ActivePage := tshWinampTags;
1: PageControl1.ActivePage := tshLyrics;
2: PageControl1.ActivePage := tshPictures;
3: PageControl1.ActivePage := tshAllFrames;
end;
end;
procedure TJvID3v2EditForm.FillPictureTypes(Strings: TStrings);
var
PictureType: TJvID3PictureType;
begin
Strings.BeginUpdate;
try
Strings.Clear;
for PictureType := Low(TJvID3PictureType) to High(TJvID3PictureType) do
Strings.AddObject(CPictureTypeStr[PictureType], TObject(PictureType));
finally
Strings.EndUpdate;
end;
end;
procedure TJvID3v2EditForm.InitAllFramesTab;
var
I: Integer;
ListItem: TListItem;
begin
lsvAllFrames.Items.BeginUpdate;
try
lsvAllFrames.Items.Clear;
for I := 0 to JvID3v21.FrameCount - 1 do
with JvID3v21.Frames[I] do
begin
ListItem := lsvAllFrames.Items.Add;
ListItem.Caption := string(FrameName);
if ClassType <> TJvID3SkipFrame then
ListItem.SubItems.Add('Yes')
else
ListItem.SubItems.Add('No');
ListItem.SubItems.Add(CFrameDescriptions[FrameID]);
ListItem.Data := JvID3v21.Frames[I];
end;
finally
lsvAllFrames.Items.EndUpdate;
end;
end;
procedure TJvID3v2EditForm.actChangePictureExecute(Sender: TObject);
var
Frame: TJvID3PictureFrame;
begin
if not Assigned(lsvPictures.Selected) then
Exit;
if cmbPictureType.ItemIndex < 0 then
begin
MessageDlg('Select a picture type', mtError, [mbOK], 0);
FocusControl(cmbPictureType);
Exit;
end;
Frame := TJvID3PictureFrame(lsvPictures.Selected.Data);
with Frame do
begin
with cmbPictureType do
PictureType := TJvID3PictureType(Items.Objects[ItemIndex]);
Description := edtPictureName.Text;
lsvPictures.Items.BeginUpdate;
try
SetPictureListItemTo(lsvPictures.Selected, Frame);
finally
lsvPictures.Items.EndUpdate;
end;
end;
end;
procedure TJvID3v2EditForm.ItemSelected(Sender: TObject);
begin
if Sender is TAction then
TAction(Sender).Enabled := Assigned(lsvPictures.Selected);
end;
procedure TJvID3v2EditForm.actCopyTov1Execute(Sender: TObject);
begin
if not JvID3v21.CopyToID3v1 then
ShowMessage('Error');
end;
procedure TJvID3v2EditForm.actCopyFromv1Execute(Sender: TObject);
begin
if JvID3v21.CopyFromID3v1 then
TagToCtrls
else
ShowMessage('Error');
end;
var
GInstance: TJvID3v2EditForm = nil;
class function TJvID3v2EditForm.Instance: TJvID3v2EditForm;
begin
if not Assigned(GInstance) then
GInstance := TJvID3v2EditForm.Create(Application);
Result := GInstance;
end;
procedure TJvID3v2EditForm.Final;
begin
JvID3v21.Close;
end;
procedure TJvID3v2EditForm.lsvAllFramesInfoTip(Sender: TObject;
Item: TListItem; var InfoTip: String);
var
Frame: TJvID3Frame;
S: string;
begin
Frame := TJvID3Frame(Item.Data);
if Frame is TJvID3TextFrame then
InfoTip := TJvID3TextFrame(Frame).Text
else if Frame is TJvID3NumberFrame then
InfoTip := IntToStr(TJvID3NumberFrame(Frame).Value)
else if Frame is TJvID3UserFrame then
with Frame as TJvID3UserFrame do
InfoTip := Format('%s: %s', [Description, Value])
else if Frame is TJvID3PictureFrame then
with Frame as TJvID3PictureFrame do
InfoTIp := Format('%s (%s) %d bytes', [Description, MIMEType, DataSize])
else if Frame is TJvID3TimestampFrame then
InfoTip := DateTimeToStr(TJvID3TimestampFrame(Frame).Value)
else if Frame is TJvID3ContentFrame then
InfoTip := TJvID3ContentFrame(Frame).Text
else if Frame is TJvID3SimpleListFrame then
begin
S := TJvID3SimpleListFrame(Frame).List.GetText;
Delete(S, Length(S) - 1, 2);
InfoTip := S;
end;
end;
end.

View File

@ -0,0 +1,192 @@
object JvID3v2MainForm: TJvID3v2MainForm
Left = 442
Height = 392
Top = 277
Width = 557
Caption = 'JvID3v2 example'
ClientHeight = 392
ClientWidth = 557
Color = clBtnFace
Constraints.MinHeight = 150
Constraints.MinWidth = 200
DefaultMonitor = dmDesktop
Font.Color = clWindowText
Icon.Data = {
3E01000000000100010010101000010010002801000016000000280000001000
0000200000000100040000000000C00000000000000000000000000000000000
000000000000000080000080000000808000800000008000800080800000C0C0
C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
FF00000000000000000000000BBBB0000000000BB000BB000000000BB0000B00
0000000BBB000BB00000000BBB000BB00000000000000BB00000000000000BB0
0000000000000BB00000000000000BB00000000000000BB00000000000000BB0
0000000000000BB0000000000000BBBB00000000000BBBBBB000000000000000
0000FFFF0000F87F0000E73F0000E7BF0000E39F0000E39F0000FF9F0000FF9F
0000FF9F0000FF9F0000FF9F0000FF9F0000FF9F0000FF0F0000FE070000FFFF
0000
}
Position = poScreenCenter
LCLVersion = '1.9.0.0'
Scaled = False
object Splitter1: TSplitter
Left = 185
Height = 392
Top = 0
Width = 5
end
object ListView1: TListView
Left = 190
Height = 392
Top = 0
Width = 367
Align = alClient
Columns = <
item
Caption = 'Type'
end
item
Caption = 'File name'
Width = 300
end>
ReadOnly = True
RowSelect = True
TabOrder = 0
ViewStyle = vsReport
OnDblClick = ListView1DblClick
end
object Panel1: TPanel
Left = 0
Height = 392
Top = 0
Width = 185
Align = alLeft
ClientHeight = 392
ClientWidth = 185
TabOrder = 1
object ShellTreeView: TShellTreeView
Left = 1
Height = 390
Top = 1
Width = 183
Align = alClient
FileSortType = fstNone
Images = ImageList1
ReadOnly = True
TabOrder = 0
OnChange = ShellTreeViewChange
OnGetImageIndex = ShellTreeViewGetImageIndex
OnGetSelectedIndex = ShellTreeViewGetSelectedIndex
OnSelectionChanged = ShellTreeViewSelectionChanged
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
ObjectTypes = [otFolders]
end
end
object JvID3v21: TJvID3v2
Active = False
ProcessPictures = True
left = 320
top = 80
end
object ImageList1: TImageList
left = 320
top = 148
Bitmap = {
4C69030000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF009F9D9B009D9A98009E9C9A009E9C9AFFA5A3
A1FFA5A3A1FFA5A3A1FFA5A3A1FFA5A3A1FFA5A3A1FFA5A3A1FFA5A3A1FF9E9C
9AFF9E9C9A009D9A98009F9D9B009F9D9B009B989600999795FFE4E3E2FFC6C4
C2FFC6C4C2FFC6C4C2FFC6C4C2FFC6C4C2FFC6C4C2FFC6C4C2FFC6C4C2FFE4E3
E2FF999795FF9B9896009F9D9B009D9B9900969390FFE5E4E3FFC7C4C2FFC7C4
C2FFC7C5C3FFC7C5C3FFC7C5C3FFC7C5C3FFC7C5C3FFC7C5C3FFC7C4C2FFC7C4
C2FFE5E4E3FF969390FF9D9B99009A9896AAEFEEEFFFEBEAEAFFEAE9EAFFEAE9
EAFFEAE9EAFFEAE9EAFFEAE9EAFFEAE9EAFFEAE9EAFFEAE9EAFFEAE9EAFFEAE9
EAFFEBEAEAFFEFEEEFFF9A9896AA969492FFE3E1E0FF9D9997FF9D9997FF9C99
97FF9C9997FF9C9997FF9C9997FF9C9997FF9C9997FF9C9997FF9C9997FF9D99
97FF9D9997FFE3E1E0FF969492FF93918FFFDCDBD9FFA6A3A0FFE6E4E4FFE5E3
E4FFE5E4E4FFE6E4E4FFE6E4E4FFE6E4E4FFE6E4E4FFE5E4E4FFE5E3E4FFE6E4
E4FFA6A3A0FFDCDBD9FF93918FFF908E8CFFD7D5D4FFAEACAAFFE1DFE0FFB0AD
ABFFB1AEACFFB2AEACFFB2AEACFFB2AEACFFB2AEACFFB1AEACFFB0ADABFFE1DF
E0FFAEACAAFFD7D5D4FF908E8CFF8D8A88FFD4D2D1FFB7B4B2FFD2D0D0FFC3C1
BFFFC4C2C0FFC4C2C0FFC4C2C0FFC4C2C0FFC4C2C0FFC4C2C0FFC3C1BFFFD2D0
D0FFB7B4B2FFD4D2D1FF8D8A88FF8A8785FFD2D0CFFFC1BFBDFFAEACAAFFAFAD
ABFFAFADABFFAFADABFFAFADABFFAFADABFFAFADABFFAFADABFFAFADABFFAEAC
AAFFC1BFBDFFD2D0CFFF8A8785FF888583FFD6D4D2FFCECCCAFFCECCCAFFCECC
CAFFCECCCAFFCECCCAFFCECCCAFFCECCCAFFCECCCAFFCECCCAFFCECCCAFFCECC
CAFFCECCCAFFD6D4D2FF888583FF7D7A78C084817FFF83807EFF83807EFF8380
7EFF83807EFF83807EFF83807EFF83807EFF83807EFF83807EFF83807EFF8380
7EFF83807EFF84817FFF7D7A78C0000000230000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
0033000000330000003300000023FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF004398D2B03D94D0FF3A92CFFF3A92CFFF3D94
D0FF4197D1D24398D2004498D2004498D2004498D2004498D2004499D2004499
D300459AD300469AD300469AD3003D94D0FFDCFCFFFFD8F7FFFFD8F7FFFFDBFA
FFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3B92CFFF3D94
D0FF4398D2D7469AD300469AD3003B92CFFFD5F7FFFF60D1F9FF61D0F8FFB4EB
FDFFD9F6FFFFDAF8FFFFDAF8FFFFDBF9FFFFDCFAFFFFDCFAFFFFDCFBFFFFE0FF
FFFF3E95D0FF4599D333469AD3003B92CFFFCAF6FFFF69D5F9FF6CD5F9FF6BD5
F9FF69D5F9FF69D5FAFF6AD7FBFF68D4FAFF5EC7F1FF5EC7F2FF5DC8F2FFB4E3
F8FF3D94D0FF3F8FC669469AD3003C92CFFFC0F3FFFF71DAFBFF74DBFBFF75DB
FCFF75DBFCFF76DCFCFF73DAFAFF449CD4FF378CCBFF368CCBFF358CCCFF348D
CCFF3890CEFF3D94D0FF4398D2EB3D92CFFFB9F4FFFF73DBFBFF6BCCF2FF6CCD
F3FF6CCEF3FF6DCEF3FF479CD4FF56BAE9FFDAF8FFFFD7F6FFFFD6F6FFFFD5F6
FFFFD5F7FFFFDBFCFFFF3E94D0FF3E94D0FFABF0FFFF449DD6FF368CCBFF368C
CBFF368CCBFF378BCBFF5CBEEAFF6FD9FBFF6AD6FAFF68D5F9FF67D4F9FF66D4
F9FF82DEFCFFAAE0F6FF3885BCB94095D0FF8AD7F5FF44A1D8FFDDFDFFFFDAFA
FFFFDBFAFFFFDEFAFFFF74DCFCFF76DBFAFF75DAFAFF74DAFAFF74DAFAFF72D9
FAFFA1E8FFFF7CBFE6FF306F9C5E4296D1FF6BBEE8FF6DBDE6FFBBF2FFFF75DE
FDFF77DEFCFF78DEFCFF7BDFFCFF7DDFFCFF7DDFFCFF7DDFFCFF7CDFFCFF80E0
FDFFADF0FFFF4D9DD3FF0000000E4398D2FF4FA6D9FF8EDAF5FFA2EEFFFF82E5
FEFF84E5FEFF84E5FEFF85E6FEFF85E6FEFF85E6FEFF85E6FEFF84E6FEFF96EB
FFFF8CD8F5FF3985BCB84499D2004499D2FF3F94D0FFABFBFFFF9BF3FFFF92F1
FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFFA6F8
FFFF65B8E3FF31709D5F469AD3004598D1F24398D2FF4094D0FF3E92CFFF3E92
CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F93
CFFF4194CEF00000000E469AD300000000300000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
00330000002F0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00B9841AB0B78012FFB67E0EFFB67E0EFFB780
11FFB98318D2BA851C00BA851C00BA851C00BA851C00BA851C00BA851C00BA86
1D00BB871E00FFFFFF00BB871F00B78012FFF7F5EDFFF5F1E5FFF5F0E5FFF6F3
EAFFB47A06FFB67D0CFFB67E0EFFB67E0EFFB67E0EFFB67E0EFFB67E0FFFB780
12FFB9841AD7FFFFFF00BB871F00B67E0FFFF5F1E4FFD1B87DFFD1B97DFFE9DF
C4FFF5F1E4FFF6F3E7FFF6F3E8FFF6F4EAFFF7F5EBFFF7F5ECFFF7F5ECFFF9FA
F4FFB88114FFFFFFFF00BB871F00B67E0EFFF2EBDCFFD5BE87FFD6BE88FFD6BE
87FFD5BD87FFD5BE88FFD6C08AFFD5BC86FFCFAF6CFFCFB06DFFCFAF6DFFE7D9
B8FFB78012FFFFFFFF00BB871E00B67E0FFFF1E9D7FFD9C490FFDAC693FFDAC6
94FFDAC694FFDBC796FFD9C591FFBC8821FFB47905FFB37904FFB37803FFB379
04FFB57C0AFFB78012FFB9841AEBB77F10FFEFE8D5FFDAC594FFD3B77AFFD4B8
7CFFD4B87CFFD5B97EFFBC8A23FFC8A357FFF6F2E7FFF5F0E3FFF4F0E2FFF4EF
E2FFF4F0E4FFF7F6EEFFB88113FFB78012FFEBE1C9FFBB8822FFB37904FFB378
03FFB37803FFB37803FFCBA85DFFD8C28EFFD6BF88FFD5BD85FFD5BD85FFD4BD
84FFDDC99DFFE6D4B1FFA57310B9B88215FFDEC796FFBD8D29FFF9F6EEFFF7F3
E9FFF7F3E9FFF8F4EAFFDBC695FFDBC594FFDBC592FFDBC492FFDBC491FFDAC3
90FFE7DABAFFD1B16EFF8961105EB98318FFD0AC64FFCEAB64FFEFE6D2FFDCC9
98FFDCC999FFDDC99AFFDECB9CFFDECB9DFFDECB9DFFDECB9DFFDECB9DFFDFCC
A1FFECE1C9FFBC8B24FF0000000EBA841AFFC19234FFDFCA9BFFE9DEC0FFE2D0
A6FFE2D1A7FFE2D1A8FFE3D1A8FFE3D1A8FFE3D1A9FFE3D1A9FFE3D1A8FFE8DA
B9FFDEC797FFA57310B8BA851D00BA851CFFB88113FFF2EBD9FFEDE2C6FFEBDF
BFFFEBDFBFFFEBDFBFFFEBDFBFFFEBDFBFFFEBDFBFFFEBDFBFFFEBDFBFFFF1E7
D1FFCCA65AFF8B62125FBB871E00B9851EF2B9851AFFB88114FFB67F10FFB67F
10FFB67F10FFB67F10FFB67F10FFB67F10FFB67F10FFB67F10FFB67F10FFB780
12FFB68117F00000000EBB871F00000000300000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
00330000002F0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00
}
end
end

View File

@ -0,0 +1,189 @@
{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.delphi-jedi.org
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
unit JvID3v2MainFormU;
{$mode objfpc}{$H+}
interface
uses
Windows, SysUtils, FileUtil, Classes, Controls, Forms, //JvSearchFiles,
ComCtrls,
//JvDriveCtrls,
ExtCtrls, JvID3v2Base, JvId3v2, JvID3v2Types, //JvComponent,
StdCtrls, ShellCtrls; //, JvListBox, JvCombobox, JvExStdCtrls, JvComponentBase;
type
{ TJvID3v2MainForm }
TJvID3v2MainForm = class(TForm)
ImageList1: TImageList;
ListView1: TListView;
Splitter1: TSplitter;
JvID3v21: TJvID3v2;
Panel1: TPanel;
ShellTreeView: TShellTreeView;
procedure ListView1DblClick(Sender: TObject);
procedure ShellTreeViewChange(Sender: TObject);
procedure ShellTreeViewGetImageIndex(Sender: TObject; Node: TTreeNode);
procedure ShellTreeViewGetSelectedIndex(Sender: TObject; Node: TTreeNode);
procedure ShellTreeViewSelectionChanged(Sender: TObject);
private
FDir: string;
procedure FileFoundHandler(AIterator: TFileIterator);
public
procedure UpdateItem(Item: TListItem; const AFileName: string);
procedure ChangeToDir(const ANewDir: string);
end;
var
JvID3v2MainForm: TJvID3v2MainForm;
implementation
uses
LazFileUtils,
JvID3v2EditFormU;
{$R *.lfm}
procedure TJvID3v2MainForm.ChangeToDir(const ANewDir: string);
var
lCursor: TCursor;
searcher: TFileSearcher;
begin
if ANewDir = FDir then
Exit;
FDir := ANewDir;
lCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
searcher := TFileSearcher.Create;
try
searcher.OnFileFound := @FileFoundHandler;
ListView1.Items.BeginUpdate;
try
ListView1.Items.Clear;
searcher.Search(ANewDir, '*.mp3', false);
finally
ListView1.Items.EndUpdate;
end;
finally
searcher.Free;
Screen.Cursor := lCursor;
end;
end;
procedure TJvID3v2MainForm.ShellTreeViewChange(Sender: TObject);
begin
ChangeToDir(ShellTreeView.Path);
end;
procedure TJvID3v2MainForm.ShellTreeViewGetImageIndex(Sender: TObject;
Node: TTreeNode);
begin
if Node.Level = 0 then
Node.ImageIndex := 0
else
Node.ImageIndex := 1;
end;
procedure TJvID3v2MainForm.ShellTreeViewGetSelectedIndex(Sender: TObject;
Node: TTreeNode);
begin
if Node.Level = 0 then
Node.SelectedIndex := 0
else
Node.SelectedIndex := 2;
end;
procedure TJvID3v2MainForm.ShellTreeViewSelectionChanged(Sender: TObject);
begin
ChangeToDir(ShellTreeView.Path);
end;
procedure TJvID3v2MainForm.FileFoundHandler(AIterator: TFileIterator);
var
Item: TListItem;
HasTag: Boolean;
Version: TJvID3Version;
begin
Item := ListView1.Items.Add;
GetID3v2Version(AIterator.FileName, HasTag, Version);
if HasTag then
case Version of
iveLowerThan2_2: Item.Caption := '<2.2';
ive2_2: Item.Caption := '2.2';
ive2_3: Item.Caption := '2.3';
ive2_4: Item.Caption := '2.4';
iveHigherThan2_4: Item.Caption := '>2.4'
else
Item.Caption := '?';
end
else
Item.Caption := '-';
Item.SubItems.Add(ExtractFileName(AIterator.Filename));
end;
procedure TJvID3v2MainForm.ListView1DblClick(Sender: TObject);
var
lFileName: string;
begin
if Assigned(ListView1.Selected) then
begin
//LFileName := IncludeTrailingPathDelimiter(ShellTreeView.Directory) +
lFileName := AppendPathDelim(ShellTreeView.Path) + ListView1.Selected.SubItems[0];
if TJvID3v2EditForm.Execute(lFileName) then
UpdateItem(ListView1.Selected, lFileName);
end;
end;
procedure TJvID3v2MainForm.UpdateItem(Item: TListItem; const AFileName: string);
var
HasTag: Boolean;
Version: TJvID3Version;
begin
GetID3v2Version(AFileName, HasTag, Version);
if HasTag then
case Version of
iveLowerThan2_2: Item.Caption := '<2.2';
ive2_2: Item.Caption := '2.2';
ive2_3: Item.Caption := '2.3';
ive2_4: Item.Caption := '2.4';
iveHigherThan2_4: Item.Caption := '>2.4'
else
Item.Caption := '?';
end
else
Item.Caption := '-';
Item.SubItems[0] := ExtractFileName(AFileName);
end;
end.

View File

@ -15,7 +15,7 @@
<Description Value="JVCL Multimedia Components (Runtime)."/> <Description Value="JVCL Multimedia Components (Runtime)."/>
<License Value="The JVCL is released in accordance with the MPL 1.1 license. To get your own copy or read it, go to http://www.mozilla.org/MPL/MPL-1.1.html. "/> <License Value="The JVCL is released in accordance with the MPL 1.1 license. To get your own copy or read it, go to http://www.mozilla.org/MPL/MPL-1.1.html. "/>
<Version Major="1" Release="4"/> <Version Major="1" Release="4"/>
<Files Count="4"> <Files Count="7">
<Item1> <Item1>
<Filename Value="..\run\JvMM\JvSpecialProgress.pas"/> <Filename Value="..\run\JvMM\JvSpecialProgress.pas"/>
<UnitName Value="JvSpecialProgress"/> <UnitName Value="JvSpecialProgress"/>
@ -32,6 +32,18 @@
<Filename Value="..\run\JvMM\JvId3v1.pas"/> <Filename Value="..\run\JvMM\JvId3v1.pas"/>
<UnitName Value="JvId3v1"/> <UnitName Value="JvId3v1"/>
</Item4> </Item4>
<Item5>
<Filename Value="..\run\JvMM\JvId3v2Types.pas"/>
<UnitName Value="JvId3v2Types"/>
</Item5>
<Item6>
<Filename Value="..\run\JvMM\JvID3v2Base.pas"/>
<UnitName Value="JvID3v2Base"/>
</Item6>
<Item7>
<Filename Value="..\run\JvMM\JvId3v2.pas"/>
<UnitName Value="JvId3v2"/>
</Item7>
</Files> </Files>
<RequiredPkgs Count="2"> <RequiredPkgs Count="2">
<Item1> <Item1>

View File

@ -66,6 +66,8 @@ const
USDecimalSeparator = '.'; USDecimalSeparator = '.';
WideNull = WideChar(#0); WideNull = WideChar(#0);
BOM_LSB_FIRST = WideChar($FEFF);
BOM_MSB_FIRST = WideChar($FFFE);
(******************** NOT CONVERTED (******************** NOT CONVERTED
{$IFDEF UNIX} {$IFDEF UNIX}
@ -1203,6 +1205,9 @@ function ReverseBytes(Value: Word): Word; overload; // taken from JclLogic
function ReverseBytes(Value: Integer): Integer; overload; function ReverseBytes(Value: Integer): Integer; overload;
function ReverseBytes(Value: Cardinal): Cardinal; overload; function ReverseBytes(Value: Cardinal): Cardinal; overload;
function BEtoN(const AValue: WideString): WideString; overload;
function NtoBE(const AValue: WideString): WideString; overload;
// taken from JclFileUtils // taken from JclFileUtils
function FindUnusedFileName(FileName: string; const FileExt: string; NumberPrefix: string = ''): string; function FindUnusedFileName(FileName: string; const FileExt: string; NumberPrefix: string = ''): string;
@ -9788,6 +9793,35 @@ begin
Result := (Value shr 24) or (Value shl 24) or ((Value and $00FF0000) shr 8) or ((Value and $0000FF00) shl 8); Result := (Value shr 24) or (Value shl 24) or ((Value and $00FF0000) shr 8) or ((Value and $0000FF00) shl 8);
end; end;
// from fpexif
function BEtoN(const AValue: WideString): WideString;
{$IFNDEF ENDIAN_BIG}
var
i: Integer;
{$ENDIF}
begin
{$IFDEF ENDIAN_BIG}
Result := AValue;
{$ELSE}
SetLength(Result, Length(AValue));
for i:=1 to Length(AValue) do
Result[i] := WideChar(BEToN(PDWord(@AValue[i])^));
{$ENDIF}
end;
function NtoBE(const AValue: WideString): WideString;
var
i: Integer;
begin
{$IFDEF ENDIAN_BIG}
Result := AValue;
{$ELSE}
SetLength(Result, Length(AValue));
for i:=1 to Length(AValue) do
Result[i] := WideChar(NtoBE(PDWord(@AValue[i])^));
{$ENDIF}
end;
// from JclLogic // from JclLogic
function ReverseBytes(Value: Cardinal): Cardinal; function ReverseBytes(Value: Cardinal): Cardinal;
begin begin

File diff suppressed because it is too large Load Diff

View File

@ -47,11 +47,11 @@ type
TJvID3v1 = class(TComponent) //TJvComponent) TJvID3v1 = class(TComponent) //TJvComponent)
private private
FSongName: AnsiString; FSongName: String;
FArtist: AnsiString; FArtist: String;
FAlbum: AnsiString; FAlbum: String;
FComment: AnsiString; FComment: String;
FYear: AnsiString; FYear: String;
FGenre: Byte; FGenre: Byte;
FFileName: TFileName; FFileName: TFileName;
FActive: Boolean; FActive: Boolean;
@ -82,11 +82,11 @@ type
property Active: Boolean read FActive write SetActive; property Active: Boolean read FActive write SetActive;
property FileName: TFileName read FFileName write SetFileName; property FileName: TFileName read FFileName write SetFileName;
{ Do not store dummies } { Do not store dummies }
property SongName: AnsiString read FSongName write FSongName stored False; property SongName: String read FSongName write FSongName stored False;
property Artist: AnsiString read FArtist write FArtist stored False; property Artist: String read FArtist write FArtist stored False;
property Album: AnsiString read FAlbum write FAlbum stored False; property Album: String read FAlbum write FAlbum stored False;
property Year: AnsiString read FYear write FYear stored False; property Year: String read FYear write FYear stored False;
property Comment: AnsiString read FComment write FComment stored False; property Comment: String read FComment write FComment stored False;
property Genre: Byte read FGenre write FGenre stored False; property Genre: Byte read FGenre write FGenre stored False;
property GenreAsString: string read GetGenreAsString write SetGenreAsString stored False; property GenreAsString: string read GetGenreAsString write SetGenreAsString stored False;
property AlbumTrack: Byte read FAlbumTrack write FAlbumTrack stored False; property AlbumTrack: Byte read FAlbumTrack write FAlbumTrack stored False;
@ -101,7 +101,7 @@ function WriteID3v1Tag(const AFileName: string; const ATag: TID3v1Tag): Boolean;
implementation implementation
uses uses
Math, Math, LConvEncoding,
JvId3v2Types, JvTypes, JvResources; JvId3v2Types, JvTypes, JvResources;
const const
@ -110,6 +110,7 @@ const
CTagSize = 128; CTagSize = 128;
CTagIDSize = 3; CTagIDSize = 3;
//=== Global procedures ====================================================== //=== Global procedures ======================================================
function HasID3v1Tag(const AFileName: string): Boolean; function HasID3v1Tag(const AFileName: string): Boolean;
@ -196,6 +197,7 @@ begin
end; end;
end; end;
//=== Local procedures ======================================================= //=== Local procedures =======================================================
procedure AnsiStringToPAnsiChar(const Source: AnsiString; Dest: PAnsiChar; const MaxLength: Integer); procedure AnsiStringToPAnsiChar(const Source: AnsiString; Dest: PAnsiChar; const MaxLength: Integer);
@ -215,6 +217,7 @@ begin
SetString(Result, Q, P - Q); SetString(Result, Q, P - Q);
end; end;
//=== { TJvID3v1 } =========================================================== //=== { TJvID3v1 } ===========================================================
procedure TJvID3v1.Loaded; procedure TJvID3v1.Loaded;
@ -249,11 +252,11 @@ begin
// Set new Tag // Set new Tag
Move(CID3v1Tag[0], lTag.Identifier[0], 3); Move(CID3v1Tag[0], lTag.Identifier[0], 3);
AnsiStringToPAnsiChar(SongName, @lTag.SongName, 30); AnsiStringToPAnsiChar(UTF8ToISO_8859_1(SongName), @lTag.SongName, 30);
AnsiStringToPAnsiChar(Artist, @lTag.Artist, 30); AnsiStringToPAnsiChar(UTF8ToISO_8859_1(Artist), @lTag.Artist, 30);
AnsiStringToPAnsiChar(Album, @lTag.Album, 30); AnsiStringToPAnsiChar(UTF8ToISO_8859_1(Album), @lTag.Album, 30);
AnsiStringToPAnsiChar(Year, @lTag.Year, 4); AnsiStringToPAnsiChar(Year, @lTag.Year, 4);
AnsiStringToPAnsiChar(Comment, @lTag.Comment, 30); AnsiStringToPAnsiChar(UTF8ToISO_8859_1(Comment), @lTag.Comment, 30);
lTag.Genre := FGenre; lTag.Genre := FGenre;
if lTag.Comment[28] = #0 then if lTag.Comment[28] = #0 then
lTag.Comment[29] := AnsiChar(FAlbumTrack); lTag.Comment[29] := AnsiChar(FAlbumTrack);
@ -322,11 +325,11 @@ begin
if Result then if Result then
begin begin
FSongName := PAnsiCharToAnsiString(@lTag.SongName, 30); FSongName := ISO_8859_1ToUTF8(PAnsiCharToAnsiString(@lTag.SongName, 30));
FArtist := PAnsiCharToAnsiString(@lTag.Artist, 30); FArtist := ISO_8859_1ToUTF8(PAnsiCharToAnsiString(@lTag.Artist, 30));
FAlbum := PAnsiCharToAnsiString(@lTag.Album, 30); FAlbum := ISO_8859_1ToUTF8(PAnsiCharToAnsiString(@lTag.Album, 30));
FYear := PAnsiCharToAnsiString(@lTag.Year, 4); FYear := PAnsiCharToAnsiString(@lTag.Year, 4);
FComment := PAnsiCharToAnsiString(@lTag.Comment, 30); FComment := ISO_8859_1ToUTF8(PAnsiCharToAnsiString(@lTag.Comment, 30));
// (p3) missing genre added // (p3) missing genre added
FGenre := lTag.Genre; FGenre := lTag.Genre;
if lTag.Comment[28] = #0 then if lTag.Comment[28] = #0 then

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff